《学习OpenCV》第二章(3)

来源:互联网 发布:手机淘宝支付流程图 编辑:程序博客网 时间:2024/04/30 02:03

从摄像机读入数据&写入AVI视频文件


这一节接触了以下内容:

CvVideoWriter* cvCreateVideoWriter( const char* filename, int fourcc, double fps, CvSize frame_size, int is_color=1 ):创建视频文件写入器;

void cvLogPolar( const CvArr* src, CvArr* dst,
                 CvPoint2D32f center, double M,
                 int flags=CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS ):把图像映射到极指数空间;

int cvWriteFrame( CvVideoWriter* writer, const IplImage* image ):写入一帧到一个视频文件中;

CvCapture* cvCreateCameraCapture( int index ):初始化从摄像头中获取视频;


程序编写:
编程环境:windows xp系统; opencv 1.0; VC++6.0;
程序说明:

此程序实现了读入一个彩色视频文件,把它映射到极指数空间,形成一个新的avi视频文件。(关于摄像机程序后面再做介绍)
加入头文件:

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

主要程序代码:
CvCapture* capture = 0;capture = cvCreateFileCapture("./avi/Lucky.avi");if (!capture){AfxMessageBox("无法正常载入视频文件。");return TRUE;}IplImage* bgr_frame = cvQueryFrame(capture);double fps = cvGetCaptureProperty(capture, CV_CAP_PROP_FPS);//获取帧率CvSize size = cvSize((int)cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH),(int)cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT));//获取尺寸大小CvVideoWriter* writer = cvCreateVideoWriter("./avi/lovely.avi", CV_FOURCC('M','J','P','G'), fps, size);//创建视频文件IplImage* logpolar_frame = cvCreateImage(size, IPL_DEPTH_8U, 3);while ((bgr_frame = cvQueryFrame(capture)) != NULL){cvLogPolar(bgr_frame, logpolar_frame, cvPoint2D32f(bgr_frame->width/2, bgr_frame->height/2),40, CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS);//把图像映射到极指数空间cvWriteFrame(writer, logpolar_frame);}cvReleaseVideoWriter(&writer);cvReleaseImage(&logpolar_frame);cvReleaseCapture(&capture);

运行成功界面:
运行成功之后,在avi文件夹里面会出现一个lovely.avi视频文件;



程序源代码下载

编程过程遇到的问题:

程序编写过程中,可能运行程序时无法生成lovely.avi视频文件,或者生成的视频文件无效。而这些问题都跟cvCreateVideoWriter函数有关,里面有个参数是设置视频文件格式的,这要看你的系统是否支持相应的解码格式,比如现在程序用的是CV_FOURCC('M','J','P','G'),它对应的是motion-jpeg codec解码方式,正好我系统不支持,可以下载相应的软件进行安装:下载地址 。安装好之后运行程序就应该没有问题了。

其它的编码器代号包括:

CV_FOURCC('P','I','M','1') = MPEG-1 codec

CV_FOURCC('M','J','P','G') = motion-jpeg codec (does not work well)

CV_FOURCC('M', 'P', '4', '2') = MPEG-4.2 codec

CV_FOURCC('D', 'I', 'V', '3') = MPEG-4.3 codec

CV_FOURCC('D', 'I', 'V', 'X') = MPEG-4 codec

CV_FOURCC('U', '2', '6', '3') = H263 codec

CV_FOURCC('I', '2', '6', '3') = H263I codec

CV_FOURCC('F', 'L', 'V', '1') = FLV1 codec

若编码器代号为 -1,则运行时会弹出一个编码器选择框.



下来这个是摄像机和AVI视频相结合的一个程序


程序说明:

此程序实现的是从摄像机里面读入视频图像,映射到极指数坐标空间,再把它写入AVI文件里面形成一个新的视频文件。

加入头文件:

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

主要程序代码:

CvCapture* capture = 0;capture = cvCreateCameraCapture(-1);//摄像头选取if (!capture){AfxMessageBox("无法正常载入视频文件。");return TRUE;}IplImage* bgr_frame = cvQueryFrame(capture);double fps = cvGetCaptureProperty(capture, CV_CAP_PROP_FPS);//获取帧率CvSize size = cvSize((int)cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH),(int)cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT));//获取尺寸大小CvVideoWriter* writer = cvCreateVideoWriter("./avi/lovely.avi", CV_FOURCC('M','J','P','G'), fps, size);//创建视频文件IplImage* logpolar_frame = cvCreateImage(size, IPL_DEPTH_8U, 3);cvNamedWindow("lovely", CV_WINDOW_AUTOSIZE);while ((bgr_frame = cvQueryFrame(capture)) != NULL){cvShowImage("lovely", bgr_frame);cvLogPolar(bgr_frame, logpolar_frame, cvPoint2D32f(bgr_frame->width/2, bgr_frame->height/2),40, CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS);//把图像映射到极指数空间cvWriteFrame(writer, logpolar_frame);char c = cvWaitKey(40);  //间隔时间if (c == 27) {cvDestroyWindow("lovely"); break;  //等待ESC键}}cvReleaseVideoWriter(&writer);cvReleaseImage(&logpolar_frame);cvReleaseCapture(&capture);

运行成功界面:

按“Esc”键退出之后,在avi文件夹里会生成一个lovely.avi的视频文件。


程序源代码下载


编程过程遇到的问题:

当运行程序时,可能会遇到上面所提到的视频格式的问题,但这个问题按上面的方式已经得到解决。在这里还存在另外一个问题,就是生成的lovely.avi视频文件可能是无效的,但又无法删除,查询发现是被系统的Explorer.exe程序占用了,怎么回事?

在网上找到这样一段有用的文段:(来源于此)

Windows XP系统中,当某个文件夹内包含有视频文件(不一定是avi格式的),并且你采用了“缩略图”方式浏览文件夹时,系统默认情况下就会对视频文件进行预览。如果此时,你的播放器(预览视频文件通常采用Windows media player)出现了一些问题(比如不支持avi格式的文件播放),造成无法预览视频文件,那么就会导致Explorer.EXE 崩溃退出。

解决方式:(暂时的旁门左道,要彻底得自己去研究)

在“运行”对话框中输入cmd,然后在命令提示符窗口输入“regsvr32 /u shmedia.dll ”,即可解决问题。REGSVR32 是注册服务的命令,参数U的意思是解除服务器注册, SHMEDIA.DLL这个动态链接库文件是用来预览视频文件用的。通常预览会导致系统变慢甚至出现问题,用户一般不需要视频预览功能,使用上述命令能够禁用视频预览。
用360软件解锁强力删除原来的lovely.avi文件后,再运行程序,应该就不会出现之前的问题了。

原创粉丝点击