最近做項目遇到一個問題,再用混合高斯背景模型提取前景圖顯示到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 }
補充:次日研究發現並不是因為這段代碼的原因才通過的,是因為高斯背景提取和播放放在同一個函數下才成功的,汗。。不過仍然不知道原因是啥。。望能有大佬告知。。