基于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 ...
随机推荐
- Typecho COS插件实现网站静态资源存储到COS,降低本地存储负载
** Typecho 简介** Typecho 是一个简单.强大的轻量级开源博客平台,用于建立个人独立博客.它具有高效的性能,支持多种文件格式,并具有对设备的响应式适配功能.Typecho 相对于其他 ...
- bytecode 生成器
基础 objectweb asm 很难用,找了几个高级点的. activej codegen 这个库很像 .net DLR 风格,采用 Expression 抽象,例如 Expressions.add ...
- 【Web前端】【开源分享】H5登陆界面 - 2021年12月30日
下载地址 Gitee下载 后续更新关注本文评论区作者萌狼蓝天的回复
- springboot搭建http2服务器和h2c服务器 h2 的http/https 请求服务器
HTTP2.0特性通俗易懂篇:https://www.cnblogs.com/yingsmirk/p/5248506.html深入了解篇:https://www.jianshu.com/p/67c54 ...
- Qt编写安防视频监控系统22-摄像机搜索
一.前言 摄像机搜索模块是后面新增加的,这个模块很有必要,一开始做视频监控系统的时候,那时候还没有研究出来一套纯Qt底层通信的onvif类,也就前几个月搞出来了,支持搜索设备信息和云台控制,所以马上加 ...
- Qt编写地图综合应用18-地图模式
一.前言 除了传统的街道图地图外,默认的一般都是街道图,还有卫星图.三维图等,其中又有叠加层,比如叠加路况图层和路网图层等,最近去了多家的地图官网看对应的api接口,总体上感觉现在都往2.5D或者3D ...
- Solution Set -「LOCAL」冲刺省选 Round XXVII
\(\mathscr{Summary}\) 还行,B 题挺不错,C 题就省选来说有点水(? \(\mathscr{Solution}\) \(\mathscr{A-}\) 分裂 初始时,你有一 ...
- SpringBoot(八) - 统一数据返回,统一分页工具,统一异常处理 (生成随机数,正则校验)
1.统一数据返回 使用逆向工程来进行测试,实体,mapper等省略: 1.1 直接使用 RequestResoult 1.1.1 RequestResoult 请求结果返回实体 //统一返回 实体 类 ...
- 如何快速的开发一个完整的iOS直播app(编解码原理)
为什么要编码 编码就是压缩图像 手机摄像头采集的都是一帧一帧的图片,只要每秒采集了24帧,看起来就比较流畅,视频就是由一帧一帧的图片构成的,常见图片格式png,jpg,一张图片2M,一秒钟30帧,那么 ...
- 史上最全Redis面试49题(含答案):哨兵+复制+事务+集群+持久化等
Redis主要有哪些功能? 1.哨兵(Sentinel)和复制(Replication) Redis服务器毫无征兆的罢工是个麻烦事,如何保证备份的机器是原始服务器的完整备份呢?这时候就需要哨兵和复制. ...