基于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 ...
随机推荐
- angr-ctf
angr 的项目地址 https://github.com/jakespringer/angr_ctf angr实战 00 拖到IDA 就是输入正确的指令才能通关 这次试一下用angr来解题 goah ...
- Kettle设置定时跑任务
1.Kettle设置作业 保存,test.kjb 2. 创建批处理 zxjb.bat C: cd C:\kettle\pdi-ce-9.4.0.0-343\data-integration kitch ...
- 鱼与熊掌可以兼得,腾讯云推出COS on CDC对象存储服务
01 前言 在云计算时代,各个企业的信息基础设施都在进行云化转型,一时间,似乎万物皆可上云.但是在上云过程中,有不少客户遇到过这样的问题:有部分数据出于合规需求,需要在本地存储与处理,怎么办?一些数据 ...
- k8s备份恢复实践--velero
k8s备份恢复实践--velero 使用Velero备份k8资源到minio,阿里云oss,七牛云Kodo 环境linux + kubectl #1.velero简介 Velero是用于Kuberne ...
- 强化学习:使用自动控制方法PID来解决强化学习问题中的cartpole问题(小车平衡杆问题)
网上找到的一个实现: 地址: https://gist.github.com/HenryJia/23db12d61546054aa43f8dc587d9dc2c 稍微修改后的代码: import nu ...
- 【MyBatis】学习笔记04:配置文件模板
[Mybatis]学习笔记01:连接数据库,实现增删改 [Mybatis]学习笔记02:实现简单的查 [MyBatis]学习笔记03:配置文件进一步解读(非常重要) 目录 IDEA配置模板的地方 核心 ...
- 不为人知的网络编程(十八):UDP比TCP高效?还真不一定!
本文由LearnLHC分享,原始出处:blog.csdn.net/LearnLHC/article/details/115268028,本文进行了排版和内容优化. 1.引言 熟悉网络编程的(尤其搞实时 ...
- 某苏人社异步JS逆向加解密分析(sm2+sm3+sm4)
前期准备 网址:aHR0cHM6Ly9ycy5qc2hyc3MuamlhbmdzdS5nb3YuY24vaW5kZXgv 目标: 接口请求内容加密和响应内容解密 请求头加密参数 Web-Encrypt ...
- Mysql连接报错排查解决记录
Mysql连接报错排查解决记录 背景: 系统:uos server-1060e 运行环境kvm虚拟机 mysql版本:5.7.44, for Linux (x86_64) 问题现象: 宿主机重 ...
- IT审计(ITAC)问题:SAP系统销售流程对于发货单和销售发票容差的配置
IT审计(ITAC)问题:SAP系统销售流程对于发货单和销售发票容差的配置 起因: 在ITAC审计的时候,针对销售流程的控制,问了两个问题 SAP系统销售流程的发货单和销售发票基于销售订单生成的相关配 ...