关于opencv mfc打开摄像头的问题

u010344266 2014-05-02 04:33:25

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;
}

}
求大神帮忙,我程序目的是打开摄像头,并且可以进行简单的图像处理算法获得摄像头前的目标。将显示的灰度值连续图像显示在另外一个图像控件上。 有什么好的程序求告知
...全文
292 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
u010344266 2014-05-26
  • 打赏
  • 举报
回复
求大神!求解答
shenqie 2014-05-26
  • 打赏
  • 举报
回复
帮顶 最近也在研究
谁学逆向工程 2014-05-06
  • 打赏
  • 举报
回复
关于摄像头和麦克风的编程要学什么
u010344266 2014-05-05
  • 打赏
  • 举报
回复
引用 4 楼 relaxisland 的回复:
DoImageProcess ----是进入这个函数后出问题? cFrame = cvQueryFrame(pCapture); cFrame 是 cvCapture结构中分配好的内存, 最好不要直接使用, 先拷贝到别的地方再用
进入DoImageProcess 后 cFrame和newframe的地址都变成0XCCCCCCCC了
u010344266 2014-05-05
  • 打赏
  • 举报
回复
引用 4 楼 relaxisland 的回复:
DoImageProcess ----是进入这个函数后出问题? cFrame = cvQueryFrame(pCapture); cFrame 是 cvCapture结构中分配好的内存, 最好不要直接使用, 先拷贝到别的地方再用
出了OnBnClickedreadcam()这个函数后 进入线程后 就不在了 我觉得cvcloneframe不太可靠
u010344266 2014-05-04
  • 打赏
  • 举报
回复
引用 2 楼 relaxisland 的回复:
ResizeImage 这个函数是写的吧 这里面是不是有问题?
是写的啊,这句没出现过问题 主要是下面这两句出现问题,cFrame的地址会出现问题 cFrame = cvQueryFrame(pCapture); IplImage* newframe = cvCloneImage(cFrame);
relaxisland 2014-05-04
  • 打赏
  • 举报
回复
DoImageProcess ----是进入这个函数后出问题? cFrame = cvQueryFrame(pCapture); cFrame 是 cvCapture结构中分配好的内存, 最好不要直接使用, 先拷贝到别的地方再用
shiter 2014-05-03
  • 打赏
  • 举报
回复
OpenCV2计算机视觉编程 手册上有一些事例代码,不过没有用mfc
relaxisland 2014-05-03
  • 打赏
  • 举报
回复
ResizeImage 这个函数是写的吧 这里面是不是有问题?

19,469

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧