之前在AndroidStudio上就用了別人用寫的庫成功地打開了USB攝像頭。
於是我之后又在PC上嘗試了一下,首先去淘寶買了個MICRO母轉USB公的轉接口,然后在Qt上配置了一下OPENCV后開始嘗試。
然后就坑到了,遂寫此文。
本人使用了2種openCV提供的方法:
VideoCapture capture; capture.open(3); //open the default camera -1才是默認攝像機,3是我的USBCaemra的 if (capture.isOpened()) { qDebug()<<"camera open!!!"; } Mat edges; namedWindow("edges",1); for(;;) { Mat frame; //定義一個Mat變量,用於存儲每一幀的圖像 capture>>frame; //讀取當前幀 if (!frame.empty()) //判斷當前幀是否捕捉成功 **這步很重要 { imshow("edges", frame); //若當前幀捕捉成功,顯示 } else { qDebug()<<"can not "; } waitKey(30); //延時30毫秒 }
IplImage* pFrame = NULL; //聲明IplImage指針 CvCapture* pCapture = cvCreateCameraCapture(-1); //獲取攝像頭 //-1為默認攝像頭,其他則需要填寫地址; //函數cvCreateCameraCapture給從攝像頭的視頻流分配和初始化CvCapture結構。 //目前在Windows下可使用兩種接口:Video for Windows(VFW) //和Matrox Imaging Library(MIL); //Linux下也有兩種接口:V4L和FireWire(IEEE1394)。 //釋放這個結構,使用函數cvReleaseCapture。 //返回值為一個 // CvCapture cvNamedWindow("video", 1); //創建窗口 while(1)//顯示視屏 { pFrame=cvQueryFrame( pCapture ); // 函數cvQueryFrame從攝像頭或者文件中抓取一幀, //然后解壓並返回這一幀。 //這個函數僅僅是函數cvGrabFrame和函數cvRetrieveFrame在一起調用的組合。 //返回的圖像不可以被用戶釋放或者修改。抓取后,capture被指向下一幀, //可用cvSetCaptureProperty調整capture到合適的幀。 if(!pFrame)break; //如果PFrame為空,則跳出循環; cvShowImage("video",pFrame); //當前幀顯示后 char c=cvWaitKey(33); //我等待33ms if(c==27)break; //如果用戶觸發了按鍵,將按鍵的ASCII值給C //如果C為ESC(ASCII 為27)循環退出 } cvReleaseCapture(&pCapture); //釋放Capture; cvDestroyWindow("video"); //銷毀窗口
以上兩種方法在填入-1時,都會彈出選擇攝像機的界面,而且都可以成功打開筆記本電腦上自帶的攝像頭。
但是本人手頭上USBCamera卻不行。之后發現只有使用VideoCapture方法,填入指定id才能成功過打開攝像頭。 CvCapture怎么試都不行。所以希望大家在開發的時候注意到這一點。