本文将介绍如何使用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帧的时候,程序自动终止。
整个函数是根据实际要求完成的。所有的概念都在里面了。希望能帮到大家。