本文将介绍如何使用VC++6.0和opencv1.0实现对捕获的视频,转化为图片的操作。
在本例程中实现了将视频转化为彩色图像、灰度图像和二值图像。
本文使用的是MFC,具体建立的方法见博客内的文章《MFC和Flash的完整通讯 》一文。里面有详细的讲解。令,在建立过程中,希望各位仔细,对“选择包含windows sockets”中,在“您希望包含WOSA支持吗?”选项不选,即,我们不需要Windows Sockets。在该步骤后,不是直接点击完成,而是点击下一步。在“您希望使用MFC库吗?”这个选项里,选择“作为静态的DLL”选项。这样基本的运行的环境就配置好了。
void CJP_1_1Dlg::ImageProcess() { IplImage *pFrame = NULL; IplImage *pGray = NULL; IplImage *pTwo = NULL; CvCapture *pCaputer = NULL; CvSize size; int nFrmNum = 0; // int i = 0; char image_name[13]; cvNamedWindow("SourceImage", 1); cvNamedWindow("GrayImage", 1); cvNamedWindow("TwoImage", 1); cvMoveWindow("SourceImage", 30, 100); cvMoveWindow("GrayImage", 360, 100); cvMoveWindow("TwoImage", 690, 100); if (!(pCaputer = cvCreateCameraCapture(-1))) { AfxMessageBox("摄像头无法打开"); return; } while (pFrame = cvQueryFrame(pCaputer)) { nFrmNum ++; if(nFrmNum % 10 == 0) { size = cvSize((int)cvGetCaptureProperty(pCaputer, CV_CAP_PROP_FRAME_WIDTH/3), (int)cvGetCaptureProperty(pCaputer, CV_CAP_PROP_FRAME_HEIGHT/3)); // fps = (int ) cvGetCaptureProperty(pCaputer, CV_CAP_PROP_FPS); // numFrames = (int)cvGetCaptureProperty(pCaputer, CV_CAP_PROP_FRAME_COUNT); pGray = cvCreateImage(size, IPL_DEPTH_8U, 1); pTwo = cvCreateImage(size, IPL_DEPTH_8U, 1); cvCvtColor(pFrame, pGray, CV_BGRA2GRAY); cvThreshold( pGray, pTwo ,50, 255, CV_THRESH_BINARY ); //取阈值为50把图像转为二值图像 pGray->origin = pTwo->origin = pFrame->origin; sprintf( image_name, "%s%d%s", "imageGray", nFrmNum, ".jpg"); cvSaveImage(image_name, pGray); sprintf( image_name, "%s%d%s", "imageTwo", nFrmNum, ".jpg"); cvSaveImage(image_name, pTwo); } if (nFrmNum >90) { break; } cvShowImage("SourceImage", pFrame); cvShowImage("GrayImage", pGray); cvShowImage("TwoImage", pTwo); if (cvWaitKey(10) >= 0) { break; } } cvDestroyAllWindows(); cvReleaseCapture(&pCaputer); cvReleaseImage(&pGray); cvReleaseImage(&pTwo); }
作者的工程名字为JP_1_1,可以实现功能的代码就是上述的函数。其实现的功能是,每隔10帧,将当前帧转化为图片。读者可以根据自己的实际情况选择间隔的时间或者直接转化。在程序中,我们希望,读到90帧的时候,程序自动终止。
整个函数是根据实际要求完成的。所有的概念都在里面了。希望能帮到大家。