您的位置:首页 > 运维架构

OpenCV摄像头视频的获取

2013-08-19 11:36 423 查看
CODE:
 

#include <opencv/cv.h>
#include <opencv/highgui.h>
#include <opencv/cxcore.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>

//#pragma comment( lib, "cxcore.lib" )
//#pragma comment( lib, "highgui.lib" )

void main(int argc, char *argv[]){
CvCapture* capture = 0;//视频流捕获
if(argc == 1 || (argc == 2 && strlen(argv[1]) == 1 && isdigit(argv[1][0])))
capture = cvCaptureFromCAM(argc == 2 ? argv[1][0] - '0' : 0);//从摄像头获得视频流
else if( argc == 2 )
capture = cvCaptureFromAVI(argv[1]);//从文件获得视频流
if(!capture)
return;
IplImage *current_frame_rgb = cvCreateImage(cvSize(320, 240), IPL_DEPTH_16U, 3);
cvNamedWindow("Window 0", 0);
while(capture)  {
current_frame_rgb = cvQueryFrame(capture);//获得一帧图象
cvShowImage("Window 0",current_frame_rgb);
if(cvWaitKey(1)==27)//等待ESC键
break;
}
cvDestroyAllWindows();
}

 

OpenCV 获取摄像头,新建窗口显示摄像头视频

结合Leaning OpenCV 第二个例子 显示一个视屏文件  写了一下 获取摄像头的代码为并且创建窗口显示的代码为:

#include "stdafx.h"

#include <cv.h>
#include <cxcore.h>
#include <highgui.h>

int main( int argc, char** argv )
{
//声明IplImage指针
IplImage* pFrame = NULL;

//获取摄像头
CvCapture* pCapture = cvCreateCameraCapture(-1);

//创建窗口
cvNamedWindow("video", 1);

//显示视屏
while(1)
{
pFrame=cvQueryFrame( pCapture );
if(!pFrame)break;
cvShowImage("video",pFrame);
char c=cvWaitKey(33);
if(c==27)break;
}
cvReleaseCapture(&pCapture);
cvDestroyWindow("video");
}

其中必须说一下几个函数用分割线框起来了
具体是这样的:
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

cvCreateCameraCapture

初始化从摄像头中获取视频

CvCapture* cvCreateCameraCapture( int index );


index 要使用的摄像头索引。如果只有一个摄像头或者用哪个摄像头也无所谓,那使用参数-1应该便可以。
函数cvCreateCameraCapture给从摄像头的视频流分配和初始化CvCapture结构。目前在Windows下可使用两种接口:Video for Windows(VFW)和Matrox Imaging Library(MIL); Linux下也有两种接口:V4L和FireWire(IEEE1394)。
释放这个结构,使用函数cvReleaseCapture。
返回值为一个

CvCapture
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


CvCapture

视频获取结构

typedef struct CvCapture CvCapture;


结构CvCapture 没有公共接口,它只能被用来作为视频获取函数的一个参数。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
这个是一个很重要的结构   以后无论是读取已有视频还是从摄像头获取都必须用到它
然后的工作就是把视屏显示出来
 

其中必须说一下几个函数用分割线框起来了
具体是这样的:
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

cvCreateCameraCapture

初始化从摄像头中获取视频

CvCapture* cvCreateCameraCapture( int index );


index 要使用的摄像头索引。如果只有一个摄像头或者用哪个摄像头也无所谓,那使用参数-1应该便可以。
函数cvCreateCameraCapture给从摄像头的视频流分配和初始化CvCapture结构。目前在Windows下可使用两种接口:Video for Windows(VFW)和Matrox Imaging Library(MIL); Linux下也有两种接口:V4L和FireWire(IEEE1394)。
释放这个结构,使用函数cvReleaseCapture。
返回值为一个

CvCapture
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


CvCapture

视频获取结构

typedef struct CvCapture CvCapture;


结构CvCapture 没有公共接口,它只能被用来作为视频获取函数的一个参数。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
这个是一个很重要的结构   以后无论是读取已有视频还是从摄像头获取都必须用到它
然后的工作就是把视屏显示出来
while(1)
{
pFrame=cvQueryFrame( pCapture );
if(!pFrame)break;
cvShowImage("video",pFrame);
char c=cvWaitKey(33);
if(c==27)break;
}

 
在这里解释一下为什么显示视屏的时候要循环
进入While循环之后 开始读入视屏文件
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

cvQueryFrame函数

从摄像头或者文件中抓取并返回一帧

IplImage* cvQueryFrame( CvCapture* capture );


capture 视频获取结构。
函数cvQueryFrame从摄像头或者文件中抓取一帧,然后解压并返回这一帧。这个函数仅仅是函数cvGrabFrame和函数cvRetrieveFrame在一起调用的组合。返回的图像不可以被用户释放或者修改。抓取后,capture被指向下一帧,可用cvSetCaptureProperty调整capture到合适的帧。

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

如果抓取帧为空   break 打破循环

否则将抓取的那一帧显示在创建的窗口上

cvShowImage("video",pFrame);

当前帧显示后

char c=cvWaitKey(33);

if(c==27)break;

我们等待33ms

如果用户触发了按键,将按键的ASCII值给C

如果C为ESC(ASCII 为27)循环退出

最后释放capture 和window

  cvReleaseCapture(&pCapture);

  cvDestroyWindow("video");

最后释放占用资源

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: