OpenCV 获取摄像头并显示摄像头视频

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

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

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

其中必须说一下几个函数用分割线框起来了函数

具体是这样的:post

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ui

cvCreateCameraCapture

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

CvCapture* cvCreateCameraCapture( int index );
index 要使用的摄像头索引。若是只有一个摄像头或者用哪一个摄像头也无所谓,那使用参数-1应该即可以。

函数cvCreateCameraCapture给从摄像头的视频流分配和初始化CvCapture结构。目前在Windows下可以使用两种接口:Video for Windows(VFW)和Matrox Imaging Library(MIL); Linux下也有两种接口:V4L和FireWire(IEEE1394)。 code

释放这个结构,使用函数cvReleaseCapture。 视频

返回值为一个blog

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");

最后释放占用资源

显示运行结果