下面是一个播放AVI视频的一个程序
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#include "highgui.h"
int main()
{
cvNamedWindow("Example2", 0);
/*读视频文件*/
CvCapture* capture = cvCreateFileCapture("F:\\Work\\opencv\\2-Playmove\\Debug\\1.avi");
IplImage * frame;
while (1)
{
frame = cvQueryFrame(capture);
if (!frame) break;
//如果frame加载为空则退出播放
cvShowImage("Example2", frame);
char c = cvWaitKey(33);
if (c == 27) break; //27对应的是esc的ASCLL码的值
}
cvReleaseCapture(&capture);
cvDestroyWindow("Example2");
}
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
下面解释一下重点语句:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
CvCapture* cvcapture = cvCreateFileCapture("F:\\Work\\opencv\\2-Playmove\\Debug\\1.avi");
这句的意思是与之前显示图像的语句:
IplImage* img = cvLoadImage("C:\\Users\\SARS\\Pictures\\社会实践\\7dc9a993gx6BCgOUQC96d&690.jpg", CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR);
意思相近,都是将文件加载进一个结构体指针中。
在这里值得注意的是:如果cvCreateFileCapture返回为空的原因可能是:在写读视频的程序的时候没装解码器
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
frame = cvQueryFrame(capture);
这句话的意思是将下一帧视频文件载入内存(实际是填充或者更新CvCapture结构中),返回一个对应当前帧的指针,这个函数与cvLoadImage()函数不同的是 cvQueryFrame不分配,使用的是已经在CvCapture结构体中分配好的内存
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
char c = cvWaitKey(33);
if (c == 27) break;
这两句话的意思是:如果用户没有触发按键,程序等待33ms;
如果按下esc键后退出播放(esc键的ASCLL码就是27);
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
接下来是读取摄像头的程序:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#include "highgui.h"
int main()
{
cvNamedWindow("Example2", 0);
/*与播放视频程序唯一的区别就在这里*/
CvCapture* capture = cvCreateCameraCapture(0);
IplImage * frame;
while (1)
{
frame = cvQueryFrame(capture);
if (!frame) break;
//如果frame加载为空则退出播放
cvShowImage("Example2", frame);
char c = cvWaitKey(33);
if (c == 27) break; //27对应的是esc的ASCLL码的值
}
cvReleaseCapture(&capture);
cvDestroyWindow("Example2");
}
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
这个程序与播放视频文件的程序是一样的,将cvCreateFileCapture函数改成了cvCreateCameraCapture();
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
值得注意的是:cvCreateCameraCapture()这个函数的参数设置;
CvCapture* cvCreateCameraCapture( int index );
index的参数设置比较重要,如果只有一个摄像机时,参数值取0。当参数被设置为-1时,OpenCV会打开一个窗口让用户选择需要使用的摄像机。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
看了几个程序总结的规律:
opencv的结构体一般Cv中的C是大写,而函数名的cv是小写