这次是采用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调取摄像头方式的定时抓拍保存图像方法小结的更多相关文章

  1. react-native-image-picker 运用launchCamera直接调取摄像头的缺陷及修复

    在前几天用react-native进行android版本开发当中,用到了"react-native-image-picker"的插件:根据业务的需求:点击按钮-->直接调取摄 ...

  2. 基于opencv在摄像头ubuntu根据视频获取

     基于opencv在摄像头ubuntu根据视频获取 1  工具 原料 平台 :UBUNTU12.04 安装库  Opencv-2.3 2  安装编译执行步骤 安装编译opencv-2.3  參考h ...

  3. Spring中Bean的配置:基于XML文件的方式

    Bean的配置一共有两种方式:一种是基于XML文件的方式,另一种是基于注解的方式.本文主要介绍基于XML文件的方式 <bean id="helloWorld" class=& ...

  4. struts2视频学习笔记 22-23(基于XML配置方式实现对action的所有方法及部分方法进行校验)

    课时22 基于XML配置方式实现对action的所有方法进行校验   使用基于XML配置方式实现输入校验时,Action也需要继承ActionSupport,并且提供校验文件,校验文件和action类 ...

  5. 基于opencv网络摄像头在ubuntu下的视频获取

     基于opencv网络摄像头在ubuntu下的视频获取 1  工具 原料 平台 :UBUNTU12.04 安装库  Opencv-2.3 2  安装编译运行步骤 安装编译opencv-2.3  参 ...

  6. js 基于函数伪造的方式实现继承

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  7. React Native学习-调取摄像头第三方组件:react-native-image-picker

    近期做的软件中图片处理是重点,那么自然也就用到了相机照相或者相册选取照片的功能. react-native中有image-picker这个第三方组件,但是0.18.10这个版本还不是太支持iPad. ...

  8. Entity Framework入门教程(18)---EF6中基于代码进行配置方式

    EF6中基于代码进行配置方式 我们以前对EF进行配置时是在app.config/web.config下的<entityframework>节点下进行配置的,EF6引进了基于代码的配置方法. ...

  9. 基于Xshell使用密钥方式连接远程主机

    基于Xshell使用密钥方式连接远程主机 连接远程主机,就验证身份而言,一般有两种方式,一种是通过用户密码:另一种通过公钥的方式(Public Key). 图1 xshell支持验证登录用户的方式 下 ...

  10. Hadoop生态圈-基于yum源的方式部署Cloudera Manager5.15.1

    Hadoop生态圈-基于yum源的方式部署Cloudera Manager5.15.1 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我之前分享过关于离线方式部署Cloudera ...

随机推荐

  1. codeforces1849 D. Array Painting

    题目链接 https://codeforces.com/problemset/problem/1849/D 题意 输入 \(n(1 \leq n \leq 2e5)\) 和长为 \(n\) 的数组 \ ...

  2. CentOS7.8安装k8s

    1, 安装 docker / kubelet # 在 master 节点和 worker 节点都要执行 \# 最后一个参数 1.20.6 用于指定 kubenetes 版本,支持所有 1.20.x 版 ...

  3. 【服务器安全问题】双防火墙有什么意义?SSH暴力破解如何防范

    发现我的服务器有大量的陌生IP尝试SSH登录,似乎想暴力破解. 我个人习惯是服务器提供商开放了所有端口的,同时也没有开启运维软件提供的防火墙emm 这倒是让我想到了 一般服务器提供商(比如阿里云.华为 ...

  4. MySQL 8.0 相对于 MySQL 5.7

    MySQL 8.0 相对于 MySQL 5.7,有很多新特性,比如:快速加列.原子 DDL.不可见索引.额外端口.角色管理等.这一节内容,就不讲这些新特性了,只来聊聊最近在工作学习过程中遇到的几处细节 ...

  5. maven:Could not transfer artifact from/to maven-default-http-blocker (http://0.0.0.0/): Blocked m...

    今天在拉完项目后拉取包的过程中,maven报错: Could not transfer artifact from/to 对应的包 maven-default-http-blocker (http:/ ...

  6. baomidou的dynamic-datasource读写分离实现和加入AOP根据方法名选择库

    文档 https://gitee.com/baomidou/dynamic-datasource-spring-boot-starter/wikis/pages maven   <depende ...

  7. 解决容器Docker内部启动计划任务crontab不生效不执行的问题

    docker使用centos7镜像 首先编辑crond,注释#session    required   pam_loginuid.so: vi /etc/pam.d/crond 然后重启crond服 ...

  8. Qt音视频开发24-视频显示QOpenGLWidget方式(占用GPU)

    一.前言 采用painter的方式绘制解码后的图片,方式简单易懂,巨大缺点就是占CPU,一个两个通道还好,基本上CPU很低,但是到了16个64个通道的时候,会发现CPU也是很吃紧(当然强劲的电脑配置另 ...

  9. Qt编写视频监控系统(移动侦测/遮挡报警/区域入侵/越界侦测/报警输入输出等)

    一.前言 得益于标准的onvif协议,各大监控厂商的设备都会支持onvif协议,在onvif协议中就包括了事件订阅机制,通过这个机制,可以拿到各种报警事件,比如移动侦测/遮挡报警/区域入侵/越界侦测/ ...

  10. Qt编写物联网管理平台34-地图按钮

    一.前言 地图按钮很常见,这也是用户给钱就干的一个模块.设备现场提供了对应的地图文件,其实就是图片文件,做的简单点就是直接CAD图纸转成jpg,做的精致点就是搞了3D风格的立体样式图片,其实还是图片, ...