我们使用于老师的CameraDS文件用来做摄像头的采集时,会遇到一些奇怪的错误。(这里介绍一个)
现在有一个800万像素摄像头,最大可支持3264*2448(其实这里有个坑,下面会讲),讲道理,这里应该是可以成功将其打开的呀??
于是在电脑上(Win7 64位+OpenCV1.0)撸了一个MFC的小demo,用来检验是否可以成功开启3264*2448的分辨率。
void CCameraTestDlg::OnBnClickedOk()
{
if (!camera.OpenCamera(0, 0, 3264, 2448))
{
CString string;
string.Format("开启摄像头%d失败", 1);
MessageBox(string, "警告", MB_OK);
camera.CloseCamera();
return;
}
else
{
MessageBox("开启摄像头成功", "警告", MB_OK);
camera.CloseCamera();
return;
}
UpdateData(FALSE);
}
在bool CCameraDS::OpenCamera(int nCamID, bool bDisplayProperties, int nWidth, int nHeight){……}这个函数中,即将执行这一语句:
hr = m_pGraph->Connect(m_pCameraOutput, m_pGrabberInput);
可以看到此时hr的值仍是S_OK。
这一语句执行完后,hr的值不再是S_OK,而是一个形如 0x80040217 这样的一个数。
继续往下执行,可以看到hr后面提示:接口的方法太多,无法从中启用事件。
再往下执行的话就返回false了,也就是打开摄像头失败。
————————————分割线————————————
可是我怎么觉得这个demo好像逻辑上没毛病啊,于是生成了release版本,拷贝到别的电脑上执行。统计结果如下:
win7 32位,一台,成功(可以打开3264*2448分辨率)。
win7 64位,两台,均失败。算上我这台,共3台,全军覆没。
win10 64位,两台,均成功。
有这么巧合的事情吗???虽然样本数量不是很大,但似乎有点苗头了。
莫非这个所谓的BUG跟系统有关??
为了排除是我这台电脑生成的程序有“毒”,我用win7 32位(用的也是OpenCV1.0)那台重新撸了一个demo。在这些机子上执行发现结果依旧。win7 64位 全军覆没。
可是有什么地方的代码会让win7 64位如此狼狈,讲道理,说好的兼容呢。对系统这块我是真的不懂了。断点调试也看不出个所以然来。
——————————分割线(解决办法)——————————
问题实质描述:在windows平台上,不能显示MJPEG 2592X1944及以上分辨率的画面,需要安装MJPEG解码插件
解决办法:安装 mjpegcodecv3.2.4 这个解码插件即可