openCV采集摄像头图片并保存的方法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了openCV采集摄像头图片并保存的方法相关的知识,希望对你有一定的参考价值。
openCV采集摄像头图片并保存的方法
我是用以下代码
#include "cv.h"
#include "highgui.h"
void main()
CvCapture* capture;
capture=cvCreateCameraCapture(0);
assert(capture!=NULL);
IplImage* frame;
cvNamedWindow("camera",1);
while(1)
frame=cvQueryFrame(capture);
if(!frame)
break;
cvShowImage("camera",frame);
if(cvWaitKey(33)>=0)
break;
cvReleaseImage(&frame);
cvDestroyWindow("camera");
连接摄像头获取数据,但是怎样保存下来作为图片呢?(jpg)
你是要进行图像处理的话推荐opencv(具体参考:于仕琪,opencv教程基础篇中的例3-6,稍作修改,估计就能用于你的工程)
下面贴出我自己编的一个小工程:如有疑问,E-mail:zhoutingzhi@gmail.com
进行opencv的预备操作你要看那本书和逛opencv中文网
如有问题可以和我讨论(我也是菜鸟,刚为解决了这个问题窃喜不已)。
1.新建mfc对话框工程,在其中添加一个picture控件,除了ID以外什么都不用改
2.在对话框头文件(没有Dlg那个)中添加(最好是在“#include "resource.h" // main symbols之后”):
#include "cxcore.h"
#include "cvcam.h"
#include "windows.h"
#include "cv.h"
#include "highgui.h"
3.在工程-》设置-》选择所有配置-》link(连接)-》对象/库模块-》中添加:
kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib cxcore.lib cv.lib ml.lib cvaux.lib highgui.lib cvcam.lib
4.在需要触发摄像头显示的地方添加:
void CVideomfcDlg::OnButton1()
// TODO: Add your control notification handler code here
int ncams = cvcamGetCamerasCount( );//返回可以访问的摄像头数目
HWND MyWin=::GetDlgItem(m_hWnd,IDC_VIDEO); //获得控件句柄(IDC_VIDEO就是图片控件)
cvcamSetProperty(0, CVCAM_PROP_ENABLE, CVCAMTRUE); //选择第一个摄像头
int width=240;
int height=240;
cvcamSetProperty(0,CVCAM_PROP_WINDOW, &MyWin); // Selects a window for
cvcamSetProperty(0,CVCAM_RNDWIDTH, &width);
cvcamSetProperty(0,CVCAM_RNDHEIGHT, &height);
cvcamSetProperty(0, CVCAM_PROP_CALLBACK, callback1);
//回调函数将处理每一帧
cvcamInit( );
cvcamStart( );
5.改变显示的图像序列大小,在窗口属性设定了以后,添加如下代码:
int width=320; //这个就是需要显示的窗口大小
int height=240; //根据自己需要选择
cvcamSetProperty(0,CVCAM_RNDWIDTH, &width);
cvcamSetProperty(0,CVCAM_RNDHEIGHT, &height);
6.在对话框类中添加callback成员函数(注意,在添加函数的时候,一定要选择static,不选的话你就自己郁闷去吧,反正我是为了这个郁闷了2个礼拜)
void CVideomfcDlg::callback1(IplImage *image)
IplImage* image1 = image;
int i,j;
assert (image);
//获取当前系统时间
SYSTEMTIME st2=;
GetLocalTime(&st2);
char sss[18]=; //这个是用来存储所要保存的图片名的,用的是一个笨办法,先定义,再修改其中的数组值。
sss[7]=st2.wHour/10+48; //获取系统当前小时
sss[8]=st2.wHour%10+48;
sss[9]=st2.wMinute/10+48; //获取系统当前分钟
sss[10]=st2.wMinute%10+48;
sss[11]=st2.wSecond/10+48; //获取系统当前秒
sss[12]=st2.wSecond%10+48;
cvSaveImage(sss,image1); //使用系统当前时间为名称(XXXXXX.jpg)存储图片
ps:你还需要在c盘根目录下建立一个叫1的文件夹保存图片。
祝你成功!
参考技术A 完整程序如下:
#include "stdafx.h"
#include <cstdio>
#include <highgui.h>
int main()
IplImage *pImg = NULL;
CvCapture *cap = cvCaptureFromCAM(0);
char fileName[100];
char key;
int count = 0;
while(1)
pImg = cvQueryFrame(cap);
cvFlip(pImg, NULL, 1); //水平翻转图像,像照镜子一样,不想要这个效果可以去掉此句
key = cvWaitKey(50);
if(key == 27) break; //按ESC键退出程序
if(key == 'c') //按c键拍照
sprintf(fileName, "Picture %d.jpg", ++count); //生成文件名
cvSaveImage(fileName, pImg);
cvXorS(pImg, cvScalarAll(255), pImg); //将拍到的图像反色(闪一下形成拍照效果)
cvShowImage("Camera",pImg);
cvWaitKey(200); //反色图像显示ms
cvShowImage("Camera",pImg);
cvReleaseCapture(&cap);
return 0;
希望可以帮到你!!! 参考技术B #include "stdafx.h"
#include "cv.h"
#include "highgui.h"
int main( int argc, char** argv )
CvCapture* capture = 0;
IplImage* frame = 0;
capture = cvCaptureFromAVI("video.avi");
//capture = cvCaptureFromCAM( 0 ); //使用摄像头 就换成这句
double fps = cvGetCaptureProperty(capture,CV_CAP_PROP_FPS); //视频帧率
//int fps=25; //捕捉帧率 ,影响生产的文件的播放速度
frame = cvQueryFrame( capture ); //先捕获一帧
CvVideoWriter* writer = 0; //保存就加上这句
int isColol=1;
//int frameW=640;
//int frameH=480;
writer=cvCreateVideoWriter("out.avi",CV_FOURCC('F','L','V','1'),fps,cvSize(frame->width,frame->height),isColol);//这里大小随便设好像不行
//cvNamedWindow( "窗口", 1 );
//for(int i=0;i<50;i++) //2秒
for(;;) //一直读
frame = cvQueryFrame( capture );
cvWriteFrame(writer,frame );
cvShowImage( "窗口", frame ); //显示一帧图像
cvWaitKey(1000 / fps);//视频速度
cvReleaseVideoWriter(&writer);
cvReleaseImage(&frame);
cvReleaseCapture( &capture );
cvDestroyWindow("窗口");
return 0;
参考技术C opencv的学习,推荐《opencv教程——基础篇》,其中第三章有对视频的详细讲解,下面贴出代码:
#include "stdafx.h"
#include "cv.h"
#include "highgui.h"
int main( int argc, char** argv )
CvCapture* capture = 0;
IplImage* frame = 0;
capture = cvCaptureFromAVI("video.avi");
//capture = cvCaptureFromCAM( 0 ); //使用摄像头 就换成这句
double fps = cvGetCaptureProperty(capture,CV_CAP_PROP_FPS); //视频帧率
//int fps=25; //捕捉帧率 ,影响生产的文件的播放速度
frame = cvQueryFrame( capture ); //先捕获一帧
CvVideoWriter* writer = 0; //保存就加上这句
int isColol=1;
//int frameW=640;
//int frameH=480;
writer=cvCreateVideoWriter("out.avi",CV_FOURCC('F','L','V','1'),fps,cvSize(frame->width,frame->height),isColol);//这里大小随便设好像不行
//cvNamedWindow( "窗口", 1 );
//for(int i=0;i<50;i++) //2秒
for(;;) //一直读
frame = cvQueryFrame( capture );
cvWriteFrame(writer,frame );
cvShowImage( "窗口", frame ); //显示一帧图像
cvWaitKey(1000 / fps);//视频速度
cvReleaseVideoWriter(&writer);
cvReleaseImage(&frame);
cvReleaseCapture( &capture );
cvDestroyWindow("窗口");
return 0;
参考技术D 用cvsave(filename, model)
参考资料:http://hi.baidu.com/lin65505578/blog/item/d3bbc93b0df53c3197ddd817.html
以上是关于openCV采集摄像头图片并保存的方法的主要内容,如果未能解决你的问题,请参考以下文章
opencv 如何能把从摄像头中抓取的两帐图片进行精确比较?