
void Cmyvideo218Dlg::OnBnClickedreadcam()
{
// TODO: 在此添加控件通知处理程序代码
const IplImage* cFrame = NULL; //用new
CvCapture* pCapture = cvCreateCameraCapture(0); // (获取帧?)
if(!pCapture)
{
AfxMessageBox("打开摄像头失败!");
}
// 播放视频时令读入图片和视频、以及播放的按钮失效
GetDlgItem( IDC_stopcam )->EnableWindow( TRUE );
// 创建一个视频播放窗口
cvNamedWindow("camera");
// 将这个窗口缩至最小
cvResizeWindow("camera",1,1);
// 获取窗口句柄
HWND hWnd = (HWND) cvGetWindowHandle("camera");
// 获取该窗口的父窗口句柄
HWND hParent = ::GetParent(hWnd);
// 获取mymfc的GUI窗口句柄
HWND hwnd1=::FindWindow("Cmyvideo218Dlg","myvideo218");
// 将GUI窗口设置为视频播放窗口的父窗口,使视频在 GUI 的指定区域播放
::SetParent(hWnd, hwnd1);
// 隐藏所创建的视频播放窗口
::ShowWindow(hParent, SW_HIDE);
// 对图像数据清零
if( TheImage )
cvZero( TheImage );
// 初始化在图像中显示字符的字体格式
CvFont tFont;
cvInitFont(&tFont, CV_FONT_HERSHEY_COMPLEX, 0.5f,0.7f,0,1,8);
// 为读取系统时间信息分配内存
char timestr[26];
memset(timestr, 0, 26 * sizeof(char));
m_run=TRUE;
while(m_run)
{
cFrame = cvQueryFrame(pCapture);
IplImage* newframe = cvCloneImage(cFrame);
// 获取系统时间信息
__time64_t rawtime;
struct tm timeinfo ;
errno_t err;
// Get time as 64-bit integer
_time64( &rawtime );
// Convert to local time
err = _localtime64_s( &timeinfo, &rawtime );
// Convert to an ASCII representation
asctime_s( timestr, 26, &timeinfo );
CString strTime;
strTime.Format( "%s", timestr );
strTime.Replace( "\n", "" );
/*rawtime = time( NULL );
timeinfo = localtime( &rawtime );
char* p = asctime( timeinfo );
// 字符串 p 的第25个字符是换行符 '\n',但在图像中将乱码显示
// 故仅读取 p 的前 24 个字符
for (int i = 0; i < 24; i++)
{
timestr[i] = *p;
p++;
}
p = NULL; */
// 在图像上显示摄像头序号以及系统时间信息
cvPutText( newframe,strTime, cvPoint(95,15), &tFont, CV_RGB(255,0,0) );
cvPutText( newframe, strTime, cvPoint(5,225), &tFont, CV_RGB(255,0,0) );
ResizeImage( newframe );
ShowImage( TheImage, IDC_showvideo);
if (cvWaitKey(20) == 27) break;
cvReleaseImage( &newframe );
}
// 对图像数据清零
if( TheImage )
{
cvZero( TheImage );
ShowImage( TheImage, IDC_showvideo );
}
cvReleaseCapture(&pCapture);
cvDestroyWindow("camera");
return;
}
以上启动摄像头程序有时候会出现 “ myvideo218.exe 中的 0x75ce812f 处未处理的异常: Microsoft C++ 异常: 内存位置 0x001fea90 处的 cv::Exception。 ”
必须重启电脑后 重新运行程序后又可以用了。
应该是内存泄露问题。

上面两个指针存在问题 cFrame和newframe,有时候cFrame有具体的址,可以打开摄像头,当进入以下程序后,cFrame找不到了,就是这种情况

void Cmyvideo218Dlg::DoImageProcess(void)
{
mImageProcess.Inputcurrentframe(cFrame);
mImageProcess.AllocateImages();
while ((mImageProcess.Icount)<300)//统计背景模型
{
mImageProcess.accumulateBackground();
cFrame = cvQueryFrame(pCapture);
mImageProcess.Inputcurrentframe(cFrame);/////??
cvWaitKey(100);
}
mImageProcess.createModelsfromStats();//就算每一个像素的均值和方差观测
IplImage* cImg;
cImg=cvQueryFrame(pCapture);
CvSize sz=cvGetSize(cImg);
while (1)
{
cImg=cvQueryFrame(pCapture);
mImageProcess.Inputcurrentframe(cImg);
mImageProcess.backgroundDiff();
ResizeImage(mImageProcess.Imask);
ShowImage( TheImage, IDC_showimage);
cvReleaseImage( &cImg );
if (27==cvWaitKey(100))
break;
}
}
求大神帮忙,我程序目的是打开摄像头,并且可以进行简单的图像处理算法获得摄像头前的目标。将显示的灰度值连续图像显示在另外一个图像控件上。 有什么好的程序求告知