最近做项目遇到一个问题,再用混合高斯背景模型提取前景图显示到MFC窗口上的时候,出现了一个问题,图像显示不正常。显示效果如下图:
我是使用Mat类型图像和imshow进行显示的,出现这个状况出乎意料。因为其他都能正常显示。
之后开始在网上查找问题所在,可是经过多方查找,发现网上根本没有此类问题。尴尬。
最后无奈开始各方求助,问答啊,论坛帖子啊都试过却没人解答。。。最后幸好通过指导老师认识了一个研三学长,学长说由于opencv与MFC图像格式不一样所以才会出现这个问题,需要将Mat导成二进制流再转换成MFC的图像格式进行显示。。。。听完后真心觉得麻烦。而且感觉问题似乎不是出在这里。因为其他的图像都能显示,就高斯背景提取有问题。
这之后又经过苦苦搜寻,找到一段网上用MFC显示高斯背景处理结果的代码,经过学习发现他是将Mat型先转为lplimage型经过一次平滑处理再将lplimage型转为Mat就可以顺利显示了。。。我试了下果然可以了。。。
现在我还是想不通原因是啥,或许是个未知的bug吧。。。
希望跟我遇见同样问题的童鞋看到这篇博客能对你有所帮助,也希望知道具体原因的大佬留言交流。
下面是处理该问题的代码:
1 BackgroundSubtractorMOG2 mog; 2 Mat frame, back; 3 4 if (!cap.isOpened()) 5 { 6 return; 7 } 8 9 while (cap.read(frame)) 10 { 11 if (frame.empty()) 12 { 13 14 break; 15 } 16 IplImage src = frame; 17 IplImage *dst = cvCreateImage(cvGetSize(&src), 8, 3); 18 cvSmooth(&src, dst, CV_GAUSSIAN); 19 Mat so = dst; 20 mog(so, back, 0.001); 21 22 threshold(back, back, 100, 255, CV_THRESH_BINARY); 23 24 Mat kernel(3, 3, CV_8U); 25 erode(back, back, kernel); 26 27 28 imshow("gaussian", back); 29 30 int c = waitKey(30); 31 if (c == 27 || c == ‘q‘) 32 { 33 break; 34 } 35 36 }
时间: 2024-11-06 11:32:37