mfc运用opencv可以打开摄像头但无法显示图像求高手解惑 o(╯□╰)o。OPENCV和MFC一起混用。。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 是不是系统的问题,我用的是win7+vc6.0+mfc+opencv,我用《学习OpenCV中文版》中的例程实验也是可以调用摄像头但还是黑屏,郁闷!!求救ING!!! 2.2么?opencv2.2有bug,把源码make出来修改后从新编译就ok。 摄像头无图像这是2.2版本的一个已知Bug,已经被修改到其对应分支上,但是官网上发布的文件包并没有包含这个修改。因此只要手动修改这个bug对应的代码,问题便可解决。需要修改的文件位置: $(OpenCV Folder)\modules\highgui\src\precomp.hpp找到如下代码:#if !defined WIN32 && !defined _WIN32#include "cvconfig.h"#elsevoid FillBitmapInfo( BITMAPINFO* bmi, int width, int height, int bpp, int origin );#endif将其修改为:#include "cvconfig.h" #if defined WIN32 || defined _WIN32 void FillBitmapInfo( BITMAPINFO* bmi, int width, int height, int bpp, int origin ); #endif 重新编译OpenCV代码后即可正常打开摄像头。 在OnTimer里面,img.CopyOf(frame,10) 这一行,第二个参数不对吧,这个应该是对应的通道数,改成frame->nChannels试试还有,ReleaseDC( pDC ),这个需要释放吗,不用吧,不许要每次都是放吧,注释掉试试 感谢大家的帮助,已经解决了,用的是opencv+directshow解决的,具体的程序我已经上传了,同样问题的朋友可以看看。9楼的方法我再试试,再次感谢大家的帮忙! 我调了一晚上,终于发现是少了消息,要在类源文件中的消息映射部分加上:ON_WM_TIMER()然后把ReleaseDC( pDC )删掉。。就行了 我也遇到了楼主的问题~~但是只限于MFC中~~如果在控制台程序中条用摄像头是没有问题的~void CdemoDlg::display( UINT ID , IplImage* image)//图像显示函数{ //以下代码实现图像在特定空间中的显示 CDC *pDC = GetDlgItem(ID)->GetDC(); // 获得Picture控件的 DC CRect rect; GetDlgItem(ID)->GetClientRect(&rect);//获得Picture控件矩形框 CvvImage img; img.CopyOf( image,-1 ); img.DrawToHDC(pDC->GetSafeHdc(), &rect ); //ReleaseDC( pDC ); // cvReleaseImage( &image ); }void CdemoDlg::OnTimer(UINT_PTR nIDEvent){ // TODO: 在此添加消息处理程序代码和/或调用默认值 if(1==nIDEvent) { IplImage* img=0; img=cvQueryFrame(capture); //从摄像头或者文件中抓取并返回一帧 display(IDC_STATIC,img); // cvSaveImage("1.jpg",img); } CDialogEx::OnTimer(nIDEvent);}void CdemoDlg::OnBnClickedOk()//摄像头调用并显示{ // TODO: 在此添加控件通知处理程序代码 capture = cvCaptureFromCAM( -1); //capture = cvCreateFileCapture( "F:\\1.avi" ); //初始化一个视频文件捕捉器 if( !capture ) { CString str("can't open the camera or video!"); MessageBox(str); } SetTimer(1,40,NULL); //定时器,定时时间和帧率一致}有没有大神帮我瞧瞧啊~~cvCreateFileCapture也无法打开.avi视频 自定义消息实现两个工作线程的通信,自定义消息函数里面写什么代码? 函数名做函数参数的问题 GetDriveType()不能正确取得USB存储设备类型 怎么办啊。。有没有更好的方法 使用CARRAY模板时出错 关于socket连接的问题????? 怎样让tree 控件 一开始所有项都处于展开状态 请教如何调用DrvEnablePDEV来获取显卡driver所提供的GDIINFO信息? CASE工具有哪些? 代码没错,但计算结果不对? 关于重载CTAB::OnLButtonDblClk的问题 error LNK2019: 无法解析的外部符号 XTP库,右键菜单图标添加的问题,高手来帮忙啊,特急
因此只要手动修改这个bug对应的代码,问题便可解决。需要修改的文件位置: $(OpenCV Folder)\modules\highgui\src\precomp.hpp
找到如下代码:
#if !defined WIN32 && !defined _WIN32
#include "cvconfig.h"
#else
void FillBitmapInfo( BITMAPINFO* bmi, int width, int height, int bpp, int origin );
#endif
将其修改为:
#include "cvconfig.h"
#if defined WIN32 || defined _WIN32
void FillBitmapInfo( BITMAPINFO* bmi, int width, int height, int bpp, int origin );
#endif
重新编译OpenCV代码后即可正常打开摄像头。
这个应该是对应的通道数,改成frame->nChannels试试还有,ReleaseDC( pDC ),这个需要释放吗,不用吧,不许要每次都是放吧,注释掉试试
然后把ReleaseDC( pDC )删掉。。就行了
void CdemoDlg::display( UINT ID , IplImage* image)//图像显示函数
{
//以下代码实现图像在特定空间中的显示
CDC *pDC = GetDlgItem(ID)->GetDC(); // 获得Picture控件的 DC
CRect rect;
GetDlgItem(ID)->GetClientRect(&rect);//获得Picture控件矩形框
CvvImage img;
img.CopyOf( image,-1 );
img.DrawToHDC(pDC->GetSafeHdc(), &rect );
//ReleaseDC( pDC );
// cvReleaseImage( &image );
}
void CdemoDlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if(1==nIDEvent)
{
IplImage* img=0;
img=cvQueryFrame(capture); //从摄像头或者文件中抓取并返回一帧
display(IDC_STATIC,img);
// cvSaveImage("1.jpg",img);
}
CDialogEx::OnTimer(nIDEvent);
}
void CdemoDlg::OnBnClickedOk()//摄像头调用并显示
{
// TODO: 在此添加控件通知处理程序代码
capture = cvCaptureFromCAM( -1);
//capture = cvCreateFileCapture( "F:\\1.avi" ); //初始化一个视频文件捕捉器
if( !capture )
{
CString str("can't open the camera or video!");
MessageBox(str);
} SetTimer(1,40,NULL); //定时器,定时时间和帧率一致}
有没有大神帮我瞧瞧啊~~cvCreateFileCapture也无法打开.avi视频