VS2013下使用OpenCV2.4.9開啟攝像頭並且顯示
阿新 • • 發佈:2019-01-27
筆者最近一直在使用OpenCV做一個影象處理的例項程式,在實際的過程中肯定會遇到很多問題,由於是新手,因此遇到問題更多的是參考別人的部落格,然後針對自己的錯誤,進行改正,可能很多問題知其然,而不知其所以然。但是本著學習的心態,希望最後的解決方案能夠幫助後來學習的人能夠解決這個問題,至於深層次的原因可以一起討論和研究學習。
如圖所見,筆者的開發環境是VS2013+OpenCV2.4.9,相比於很多的部落格(都是VC6.0+OpenCV1.0),可以借鑑和參考。下面介紹最開始出bug的做法以及改正後的做法。
最開始的做法:
在進行呼叫攝像頭的時候,筆者的介面如圖:
通過對Capture為“開啟攝像頭”的按鈕新增相應的處理函式:
void CMFC_OpenCVtestDlg::OnOpenCamera()
{
VideoCapture Capture(0);
Mat frame;
while (1)
{
Capture >> frame;
if (frame.rows==0)
img = &frame.operator IplImage();
DrawToMFC(IDC_VIEW, img);
waitKey(30);
}
其中DrawToMFC是一個在OpenCV2.4.9下實現將opencv影象資料顯示到picture控制元件中的函式。詳見我的部落格
關於OpenCV中rectangle函式的使用+統計直方圖 (地址:)。這樣處理,可以在控制元件上短時間的顯示影象,但是過一會兒就會發生錯誤,但是將DrawToMFC改成imshow()函式(opencv自帶的顯示影象函式)就完全沒有問題,然後就找各種解釋,除錯看看了一下變數的地址以及賦值情況,按理是應該可以顯示的。但是最後沒有成功找出問題之所在,所以不得不另尋他法。
於是看了網上很多的資料,參考了一下,有直接呼叫windows系統下的API函式實現的,這個我早期用過,確實可行。同時本著儘量使用opencv運用於MFC上的目的,決定採用的第二種方案,也就是通過設定定時器來實現。
可行方案:
由於涉及到定時器,以及定時器的相應函式,VideoCapture類必須被兩種成員方法所呼叫,因此將VideoCapture類設定為了我的主對話方塊CMFC_OpenCVtestDlg類的成員變數:
然後對Capture為“開啟攝像頭”的按鈕的處理函式進行修改:public: VideoCapture Capture;
void CMFC_OpenCVtestDlg::OnOpenCamera()
{
// TODO: 在此新增控制元件通知處理程式程式碼
Capture.open(0);
Mat frame;
img = &frame.operator IplImage();
DrawToMFC(IDC_VIEW,img);
SetTimer(1, 10, NULL);
/*while (1)
{
Capture >> frame;
if (frame.rows==0)//-----------------------------沒有if語句會報錯
continue;
img = &frame.operator IplImage();
DrawToMFC(IDC_VIEW, img);
waitKey(30);
}*/
}
建立定時器Timer的訊息相應:
OnTimer訊息相應函式的實現程式碼:
void CMFC_OpenCVtestDlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此新增訊息處理程式程式碼和/或呼叫預設值
Mat frame;
Capture >> frame;
img = &frame.operator IplImage();
DrawToMFC(IDC_VIEW, img);
CDialogEx::OnTimer(nIDEvent);
}
執行之後,成功:
(PS:筆者深夜寫部落格兒,有檯燈燈光,面容猙獰,切掉!!!勿怪!!!)
(PS:希望大牛們看見我的部落格,願意一起把最開始的問題之所在解決的私信我咯!!!!)
(PS:程式中的img也是主對話方塊的成員變數,用於方便在在各個成員方法中處理圖片,型別為IplImage *img);