環境:Ubuntu系統下,USB普通攝像頭一枚
代碼:有兩個版本的,一個是opencv1的,使用cvCreateCameraCapture(ID)儲存結果,Iplmage* 儲存傳回結果。另一版本是opencv2的,使用mat資料類型儲存傳回結果
/*
opencv1 代碼
*/
/*
IplImage* pFrame = NULL;
//Mat *pFrame;
cvNamedWindow("result", );
CvCapture* pCapture = cvCreateCameraCapture(-);
cvSetCaptureProperty(pCapture,CV_CAP_PROP_FRAME_WIDTH,);
cvSetCaptureProperty(pCapture,CV_CAP_PROP_FRAME_HEIGHT,);
while(true)
{
pFrame = cvQueryFrame(pCapture);
if(!pFrame) break;
char c = cvWaitKey();
if(c == ) break;
cvShowImage("result", pFrame);
}*/
/*opencv2代碼*/
VideoCapture cap();
if(!cap.isOpened()){
printf("capture cannot opened\n");
return -;
}
Mat edges;
namedWindow("edges",);
for(int i = ;;i++)
{
Mat frame;
cap>>frame;
cvtColor(frame,edges,CV_BGR2GRAY);
GaussianBlur(edges,edges,Size(,),,);
Canny(edges,edges,,,);
imshow("edges",edges);
char c=waitKey();
if(c>=)break;
}
return ;
代碼及其簡單就不說了。
有兩個坑,一個是找到攝像頭的問題,可以進入/dev/目錄中,ls一下,然後檢視Video有哪幾個,一般預設能找到的是video0 或者 video1,一定要檢視一下,比較保險,否則很容易找不到攝像頭,然後報錯
另外一個坑是,網上可以找到的代碼是
if(waitKey(30)>=0)break;
後果就是,隻執行了一遍就break了。
其中使用到的一個重要的函數是WaitKey
WaitKey函數原型為:
.
C++: int waitKey(int delay=0)
Python: cv2.waitKey([delay]) → retval
C: int cvWaitKey(int delay=0 )
Python: cv.WaitKey(delay=0) → int
C++為例
如果delay = 0 || delay < 0 , 就無限制等待,直到按鍵按下之後,傳回按鍵ID.
如果delay > 0 , 就等待(delay) ms,如果按下按鍵,那麼傳回按鍵ID,如果在 ( delay ) ms 内,沒有按下按鍵,就會傳回-1.
但是使用
int c = waitKey(30); 在不按任何按鍵列印出來的數值是255
經過思考可知,這個明顯應該傳回-1才對,255 明顯是 8 bit 下的-1,然而int是32位的,沒有溢出,是以直接顯示出來是255
函數的傳回值竟然是int類型,那麼應該如何解決呢?
直接使用8bit的
char c = waitKey(30);
這樣結果值為255的時候,就溢出成為-1了