1. 程式人生 > >VS2013下使用OpenCV2.4.9開啟攝像頭並且顯示

VS2013下使用OpenCV2.4.9開啟攝像頭並且顯示

筆者最近一直在使用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類的成員變數:
 public:
         VideoCapture Capture;
然後對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);