码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2017-03-13 00:06:20      阅读:231      评论:0      收藏:0      [点我收藏+]

标签:return   显示   while   图像   cvs   提取   处理   bre   取图   

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

 

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

标签:return   显示   while   图像   cvs   提取   处理   bre   取图   

原文地址:http://www.cnblogs.com/cqu-qxl/p/6539627.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!