基于Openframeworks调取摄像头方式的定时抓拍保存图像方法小结
这次是采用Openframeworks来调取摄像头画面并抓图保存。
开始
借向导自动生成代码,因为要调取摄像头设备,因此增添ofVideoGrabber
对象声明,又因为保存需求,所以还需添加ofPixels
对象声明。如下:
ofVideoGrabber vidGrabber;
ofPixels videoPixels;
还需添加如下变量:
float timer; //方便计时
int framecount; //序列帧数,计数
int oldtime; //上一帧的总流逝时刻
int nowtime; //当前帧的总流逝时刻
oldtime
、nowtime
是为了方便计算每帧所消耗的时间,方便计时。头文件最后的编辑如下:
#pragma once
#include "ofMain.h"
class ofApp : public ofBaseApp{
public:
void setup();
void update();
void draw();
void keyPressed(int key);
void keyReleased(int key);
void mouseMoved(int x, int y );
void mouseDragged(int x, int y, int button);
void mousePressed(int x, int y, int button);
void mouseReleased(int x, int y, int button);
void mouseEntered(int x, int y);
void mouseExited(int x, int y);
void windowResized(int w, int h);
void dragEvent(ofDragInfo dragInfo);
void gotMessage(ofMessage msg);
ofVideoGrabber vidGrabber;
ofPixels videoPixels;
float timer;
int framecount;
int oldtime;
int nowtime;
};
接下来
在setup()
中初始化对象,配置参数,具体写法如下:
void ofApp::setup(){
vector<ofVideoDevice> devices = vidGrabber.listDevices();
vidGrabber.setDeviceID(0);
vidGrabber.setDesiredFrameRate(60);
//vidGrabber.setPixelFormat(OF_PIXELS_RGB);
vidGrabber.initGrabber(1920,1080);
videoPixels.allocate(1920, 1080, OF_PIXELS_RGB);
ofSetVerticalSync(true);
timer = 2000.0f;
framecount = 0;
}
想设置摄像头采集图像的模式为MJPG
,但是没找到方法,尝试了几个Format但未奏效。使用它默认的YUY2
模式,高分辨率采集下其帧率水平很低,不过光抓图没有多大关系。
再者
现在的任务是每次更新采集画面,并且把画面数据转移到自己创建的对象中,并且每隔一段时间保存图像到本地磁盘。
void ofApp::update(){
vidGrabber.update(); //摄像头更新画面
nowtime = ofGetElapsedTimeMillis(); //获取当前进程流逝的时间,即当前帧的时刻
timer -= nowtime - oldtime; //每帧所消耗的时间 - deltatime
oldtime = nowtime;
if (vidGrabber.isFrameNew()) {
videoPixels = vidGrabber.getPixels(); //将摄像头实时画面信息转换到自己的图像对象中
if (timer <= 0)
{
//ofSaveImage(videoPixels, "e:\\capturefromOF\\image_" + std::to_string(framecount) + ".jpg");
char buffer[50];
snprintf(buffer, 10, "%06d", framecount); //格式化字符串 000001 000002
//ofLogNotice() << buffer;
string str(buffer);
ofSaveImage(videoPixels, "e:\\capturefromOF\\image_" + str + ".jpg"); //保存图像,命名格式如 image_######.jpg 序列
ofLogNotice() << "saved frame no." << framecount;
framecount++; //序列图的序号累计
timer = 2000.0f; //相隔两秒触发一次
}
}
//ofLogNotice() << timer;
}
最后
一些方便调试的操作。
//--------------------------------------------------------------
void ofApp::draw(){
ofSetHexColor(0xffffff);
vidGrabber.draw(20, 20, 1920 / 2, 1080 / 2);
}
//--------------------------------------------------------------
void ofApp::keyPressed(int key){
if (key == 's' || key == 'S') {
vidGrabber.videoSettings(); //可以调节参数
}
}
当然主函数不动:
#include "ofMain.h"
#include "ofApp.h"
//========================================================================
int main( ){
ofSetupOpenGL(1024,768,OF_WINDOW); // <-------- setup the GL context
ofRunApp(new ofApp());
}
结果
运行时的应用:
得到的图片序列:
基于Openframeworks调取摄像头方式的定时抓拍保存图像方法小结的更多相关文章
- react-native-image-picker 运用launchCamera直接调取摄像头的缺陷及修复
在前几天用react-native进行android版本开发当中,用到了"react-native-image-picker"的插件:根据业务的需求:点击按钮-->直接调取摄 ...
- 基于opencv在摄像头ubuntu根据视频获取
基于opencv在摄像头ubuntu根据视频获取 1 工具 原料 平台 :UBUNTU12.04 安装库 Opencv-2.3 2 安装编译执行步骤 安装编译opencv-2.3 參考h ...
- Spring中Bean的配置:基于XML文件的方式
Bean的配置一共有两种方式:一种是基于XML文件的方式,另一种是基于注解的方式.本文主要介绍基于XML文件的方式 <bean id="helloWorld" class=& ...
- struts2视频学习笔记 22-23(基于XML配置方式实现对action的所有方法及部分方法进行校验)
课时22 基于XML配置方式实现对action的所有方法进行校验 使用基于XML配置方式实现输入校验时,Action也需要继承ActionSupport,并且提供校验文件,校验文件和action类 ...
- 基于opencv网络摄像头在ubuntu下的视频获取
基于opencv网络摄像头在ubuntu下的视频获取 1 工具 原料 平台 :UBUNTU12.04 安装库 Opencv-2.3 2 安装编译运行步骤 安装编译opencv-2.3 参 ...
- js 基于函数伪造的方式实现继承
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- React Native学习-调取摄像头第三方组件:react-native-image-picker
近期做的软件中图片处理是重点,那么自然也就用到了相机照相或者相册选取照片的功能. react-native中有image-picker这个第三方组件,但是0.18.10这个版本还不是太支持iPad. ...
- Entity Framework入门教程(18)---EF6中基于代码进行配置方式
EF6中基于代码进行配置方式 我们以前对EF进行配置时是在app.config/web.config下的<entityframework>节点下进行配置的,EF6引进了基于代码的配置方法. ...
- 基于Xshell使用密钥方式连接远程主机
基于Xshell使用密钥方式连接远程主机 连接远程主机,就验证身份而言,一般有两种方式,一种是通过用户密码:另一种通过公钥的方式(Public Key). 图1 xshell支持验证登录用户的方式 下 ...
- Hadoop生态圈-基于yum源的方式部署Cloudera Manager5.15.1
Hadoop生态圈-基于yum源的方式部署Cloudera Manager5.15.1 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我之前分享过关于离线方式部署Cloudera ...
随机推荐
- 关于 Span 的一切:探索新的 .NET 明星: 1 Span<T> 是什么?
关于 Span 的一切:探索新的 .NET 明星 https://docs.microsoft.com/en-us/archive/msdn-magazine/2018/january/csharp- ...
- 【pygame】Python小游戏开发之看代码学编程
话说我学习的时候,英文文档难以理解,中文文档杂乱无章,最终还是觉得,还不如直接看代码学习. 下面是我学习过程中写的代码,注释写的很详细,我想会帮助你理解的 pip install pygame 1.游 ...
- K8S deployment 重启的三种方法
一般重启deployment,常规操作是删掉对应的pod, 但如果有多个副本集的话,一个个删很麻烦.除了删除pod,还可以: 方案一: 加上环境变量kubectl patch deploy <d ...
- Qt/C++路径轨迹回放/回放每个点信号/回放结束信号/拿到移动的坐标点经纬度
一.前言说明 在使用百度地图的路书功能中,并没有提供移动的信号以及移动结束的信号,但是很多时候都期望拿到移动的哪里了以及移动结束的信号,以便做出对应的处理,比如结束后需要触发一些对应的操作.经过搜索发 ...
- 15条 Karpenter 最佳实践,轻松掌握弹性伸缩
Karpenter 是一款高性能.灵活的开源 Kubernetes 集群自动扩展工具,目前已支持 AWS 和阿里云.它可以根据不断变化的应用负载,快速启动大小合适的计算资源,进而提升应用的可用性. 相 ...
- MySQL数据库建库时SQL语句中数据库名、表名用引号的问题以及COLLATE utf8_general_ci的含义
一.MySQL数据库建库时SQL语句中数据库名.表名用引号的问题解释:在创建MySQL数据库和表时,数据库名.表名和字段名外面的符号 ` 不是单引号,而是英文输入法的反单引号,同键盘~同一位置.为了避 ...
- [转]VC++中如何快速创建多层文件夹
在创建目录时,原来的可用的方法是 _mkdir()或 BOOL CreateDirectory( LPCTSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurit ...
- WebClient 用法小结
进来的项目中要实现能够在windows service中调用指定项目的链接页面.由于访问页面时候使用的是ie浏览器或其他浏览器,所以想起用webclient类. 如果只想从特定的URI请求文件,则使用 ...
- IM开发基础知识补课(十):大型IM系统有多难?万字长文,搞懂异地多活!
本文由公众号"水滴与银弹"号主Kaito原创分享,原题"搞懂异地多活,看这篇就够了",为使文章更好理解,有修订. 1.引言 前几天技术群里有群友问我手上有没有I ...
- 记录使用socket.io的使用
今天记录一下node.js的egg框架搭建的socket.io,前端联合使用 首先得引入socket.io的js,我这边是用的下载到本地的一个js 引入:const io = require('../ ...