MFC+opencv+高斯背景前景提取图像显示问题

最近做项目遇到一个问题,再用混合高斯背景模型提取前景图显示到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     }

 补充:次日研究发现并不是因为这段代码的原因才通过的,是因为高斯背景提取和播放放在同一个函数下才成功的,汗。。不过仍然不知道原因是啥。。望能有大佬告知。。

posted @ 2017-03-12 22:06  valar、  阅读(2692)  评论(0编辑  收藏  举报