openCV采集摄像头图片并保存的方法

作者&投稿:长兴利 (若有异议请与网页底部的电邮联系)
如何opencv读取摄像头并保存每一帧图像?~

#include\x0d\x0a#include\x0d\x0a#include\x0d\x0aintmain()\x0d\x0a{\x0d\x0aCvCapture*capture=cvCreateCameraCapture(0);\x0d\x0acvNamedWindow("camera",CV_WINDOW_AUTOSIZE);\x0d\x0aIplImage*image;\x0d\x0acharfile_name[15];\x0d\x0ainti;\x0d\x0awhile(1)\x0d\x0a{\x0d\x0afor(i=0;i<99999;i++)\x0d\x0a{\x0d\x0aimage=cvQueryFrame(capture);\x0d\x0aif(!image)\x0d\x0abreak;\x0d\x0acvShowImage("camera",image);\x0d\x0acharc=cvWaitKey(20);\x0d\x0aif(c==27)\x0d\x0a{\x0d\x0acvReleaseCapture(&capture);\x0d\x0acvDestroyWindow("hh");\x0d\x0aexit(0);\x0d\x0a}//按esc退出\x0d\x0a\x0d\x0asprintf(file_name,"d:\\%05d.jpg",i);//d盘根目录下生成\x0d\x0acvSaveImage(file_name,image);\x0d\x0a\x0d\x0a}\x0d\x0aMessage(NULL,"文件名超出范围!","警告!",MB_OK);\x0d\x0a\x0d\x0a}\x0d\x0a\x0d\x0a}\x0d\x0a供参考。

没有看见void detectAndDisplay( Mat frame );的实现,就默认这个函数做人脸检测了...

将“//-- 2. Read the video stream”之后的if块和释放capture的语句删除,添加
frame=imread("D:/image/1.jpg",IMREAD_COLOR);
D:/image/1.jpg替换为所需图片的路径,如果opencv为2.3.1及以下版本,IMREAD_COLOR换为CV_LOAD_IMAGE_COLOR;

另外吐槽下,看头文件应该用的是opencv2,却仍然使用opencv1的CvCapture,虽然ok,但感觉不彻底...

现在在vc上采集视频常用的方法有三:vfw,directshow,opencv

你是要进行图像处理的话推荐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的文件夹保存图片。
祝你成功!


完整程序如下:
#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;
}
希望可以帮到你!!!

#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;
}

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;
}

用cvsave(filename, model)


为何opencv打开摄像头延迟大?
OpenCV打开摄像头延迟大可能有以下几个原因:摄像头硬件问题:摄像头硬件问题可能导致图像采集速度慢,从而导致OpenCV打开摄像头时延迟较大。可以尝试更换摄像头或检查摄像头连接。图像采集参数设置问题:OpenCV打开摄像头时需要设置一些图像采集参数,如帧率、分辨率等。如果参数设置不合理,可能会导致延迟较大。

opencv多摄像头使用代码
opencv2.0多摄像头捕捉方法 使用cvCreateCameraCaputure(X)获取。参数X=Y+Z。Y=摄像机捕捉常数。Z=你需要的摄像机的编号。eg:linux下,摄像机捕捉常数CV_CAP_V4L2,即Y=200;需要捕捉默认摄像机,则Z=0;则X=200+0=200;则cvCreateCameraCaputure(200)可以捕获默认摄像机。cvCreateCameraCaputure(...

如何让cvCaptureFromCAM摄像头采集变得更快
CvCaptureFromCam是一个函数。OpenCV中一个函数。初始化从摄像头中获取视频 CvCapture*cvCaptureFromCAM( int index );index 要使用的摄像头索引。如果只有一个摄像头或者用哪个摄像头也无所谓,那使用参数-1应该便可以。一般index=0 函数给从摄像头的视频流分配和初始化CvCapture结构。目前在Windows下可...

如何实现50个摄像头截图功能
使用OpenCV库、使用JavaScript和HTML5。1、使用OpenCV库:OpenCV是一个开源计算机视觉库,可以用于处理图像和视频通过调用OpenCV库的函数,可以捕获50个摄像头的视频流,并对每一帧进行截图。2、使用JavaScript和HTML5:通过在HTML页面中嵌入50个video元素,并使用JavaScript控制每个video元素的srcObject属性,可以...

opencv 做视频捕捉的时候摄像头无法开启。显示出来的图像都是黑色的...
非常简单,你用的是win7而不是xp,如果是在xp上上面的代码当然是可以的;貌似是因为你win7摄像头的缘故,还好像与vfw模式有关系吧,win7貌似没有vfw,楼主可以使用directshow模块来实现。试试下面的代码:include "cxcore.h"include "cvcam.h"include "windows.h"void callback(IplImage* image);int ...

能不能将工业摄像机拍摄数据用Opencv读取
可以用,用SDK获取图像数据,再将其图像区域的内存链接到 cvImage就可以了。似乎是 cvSetData 这个指令。我用的是维图的摄像头,python语言,最早的那台设备已稳定使用三年。

python怎样通过opencv调用摄像头
Import cv2,cap = cv2.VideoCapture(0),ret,frame = cap.read(),cv2.imwrite("a.png",frame),调用摄像头并输出图像即可。Python(英国发音:\/ˈpaɪθən\/ 美国发音:\/ˈpaɪθɑːn\/), 是一种面向对象的解释型计算机程序设计语言,由荷兰人Guido van ...

python怎样通过opencv调用摄像头?
Import cv2,cap = cv2.VideoCapture(0),ret,frame = cap.read(),cv2.imwrite("a.png",frame),调用摄像头并输出图像即可。Python(英国发音:\/ˈpaɪθən\/ 美国发音:\/ˈpaɪθɑːn\/), 是一种面向对象的解释型计算机程序设计语言,由荷兰人Guido van ...

如何用labview或者python+opencv进行多摄像头同步采集
用多线程,配合pyqt5,cv2,可以做到4个usb摄像头同时采集

如何使用 Opencv 打开摄像头获取图像信息
include <opencv2\/opencv.hpp> using namespace cv; void main() { VideoCapture capture(0);\/\/如果是笔记本,0打开的是自带的摄像头,1 打开外接的相机 char filename[200]; int n = 0; while (capture.isOpened()) { capture >> frame; imshow("video", f...

竹溪县19743602901: 如何opencv读取摄像头并保存每一帧图像 -
敞善路成: #include<highgui.h> #include<windows.h> #include<stdio.h> int main () {CvCapture *capture=cvCreateCameraCapture(0);cvNamedWindow("camera",CV_WINDOW_AUTOSIZE);IplImage *image;char file_name[15];int i;while(1){for(i=0;...

竹溪县19743602901: 我是在ubuntu10.04下用opencv2.3做一个连续捕捉摄像头视频的图像并将它保存成图片的程序,可是总是没有保存 -
敞善路成: 这是我在Windows下实现保存图片的程序,亲测可用,按ESC键保存图片并退出,你可以参考一下.#include "cv.h"#include "highgui.h" int main() { cvNamedWindow( "Example2_9", CV_WINDOW_AUTOSIZE );CvCapture* capture; ...

竹溪县19743602901: 跪求用USB摄像头获取并保存图像的c或c++代码 -
敞善路成: 可以通过Intel的opencv库来做,这个库提供的功能比较多.支持很多功能,使用起来也算简单.相信的内容可以参考www.opencv.org.cn 需要配置这个库 下面代码是从这个网址转来的,可以参考下 http://www.aiseminar.cn/bbs/thread-327-1-1.html...

竹溪县19743602901: opencv能直接读取网络摄像头吗 -
敞善路成: opencv只能读取电脑存储设备(硬盘或内存)内的图像,摄像头的图像需要借助对应的驱动软件提供的DLL 函数,获取摄像头图像到内存中,再由opencv内函数调用.比如CameraGrab(pImgBuf,DATA_TYPE_RGB24) //摄像头厂家提供的DLL文件内获取图像函数,将摄像头图像传递到pImgBuf指向的空间,后续opencv可以直接处理pImgBuf指向空间内的图像数据.

竹溪县19743602901: 怎么用opencv调用笔记本摄像头录像并保存下来啊 求高手赐教 -
敞善路成: int main() { CvCapture* capture=cvCaptureFromCAM(0);//读取摄像头 if(capture==NULL) { printf("没有检测到摄像头"); return 0; } cvNamedWindow("video",1); for (;;) { IplImage* frame=cvQueryFrame(capture); if(!frame) break; ...

竹溪县19743602901: 我现在需要用OpenCV做个对图像和视频的处理程序 -
敞善路成: OpenCV可以从摄像头读取视频,然后逐帧按图片读出来 或者读取视频,也可以一帧一帧的保存成静态图片格式并处理 函数是cvQueryFrame

竹溪县19743602901: opencv从摄像头读取图像怎么改为读取保存好的jpg图片 -
敞善路成: 没有看见void detectAndDisplay( Mat frame );的实现,就默认这个函数做人脸检测了...将“//-- 2. Read the video stream”之后的if块和释放capture的语句删除,添加 frame=imread("D:/image/1.jpg",IMREAD_COLOR); D:/image/1.jpg替换为所需图片的路径,如果opencv为2.3.1及以下版本,IMREAD_COLOR换为CV_LOAD_IMAGE_COLOR;另外吐槽下,看头文件应该用的是opencv2,却仍然使用opencv1的CvCapture,虽然ok,但感觉不彻底...

竹溪县19743602901: 如何把连续采集到的图像连续保存到内存中然后用opencv处理? -
敞善路成: 把内存copy到图像iplimage *src, src->imagedata中就可以处理了.

竹溪县19743602901: 急!!!!!opencv 用摄像头提取图片后图片命名问题... -
敞善路成: #include#include#include"cv.h"#include"highgui.h"#include int main() { while(1) { time_t now; struct tm *timenow; time(&now); char outFileName[]="2011-01-01 24H00M00S.jpg";//修改 timenow = localtime(&now); printf("saving...\n"); *(...

竹溪县19743602901: 如何使用 Opencv 打开摄像头获取图像信息 -
敞善路成: #include <opencv2/opencv.hpp> using namespace cv; void main() {VideoCapture capture(0);//如果是笔记本,0打开的是自带的摄像头,1 打开外接的相机char filename[200];int n = 0; while (capture.isOpened()){capture >> frame;imshow(...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网