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     }

 補充:次日研究發現並不是因為這段代碼的原因才通過的,是因為高斯背景提取和播放放在同一個函數下才成功的,汗。。不過仍然不知道原因是啥。。望能有大佬告知。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM