天天看點

opencv調用是視訊圖像并且顯示

環境: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了