OpenCV計算機視覺開發實踐:基于Qt C++ - 商品搜索 - 京東
播放攝像頭視頻和播放視頻文件類似,也是通過類VideoCapture來實現,只不過調用open的時候傳入的是攝像頭的索引號。如果計算機安裝了一個攝像頭,則open的第一個參數通常是0,比如:
VideoCapture capture;capture.open(0);
或者直接用構造函數打開攝像頭:
VideoCapture capture(0);
打開成功后,就可以一幀一幀地讀取并一幀一幀地播放了,其實就是在一個循環里,間隔地顯示一幅一幅視頻幀圖片,當間隔時間短了,圖片動起來了,就感覺是在看視頻了。
在編程之前,我們要確保操作系統能打開攝像頭并播放攝像頭視頻,具體步驟如下:
?? 把一個USB攝像頭插入電腦主機。
?? 設置虛擬機的USB控制器。打開VMware設置對話框,在硬件列表里選中“USB控制器”,在右側的“USB兼容性”中選擇USB 3.0,如圖12-4所示。
圖12-4
?? 啟動并連接USB攝像頭。由于目前是在Linux虛擬機中,因此當我們在主機上插上USB攝像頭后,需要先連接USB攝像頭到虛擬機。啟動Linux虛擬機后,依次單擊VMware的菜單“虛擬機”→“可移動設備”→“Nintenda USB Camera”→“連接(斷開與主機的連接)”,“連接(斷開與主機的連接)”菜單上就會出現一個“√”,說明USB攝像頭連接到Linux虛擬機中了。我們可以用命令查看一下:
# ll /dev/video*crw-rw---- 1 root video 81, 0 8月? 31 20:56 /dev/video0crw-rw---- 1 root video 81, 1 8月? 31 20:56 /dev/video1
如果顯示/dev/video0,則說明攝像頭已經連接到Linux虛擬機中了。現在在命令行中打開攝像頭:
# cheese
此時就可以看到攝像頭視頻了,如圖12-5所示。
???????圖12-5
系統能打開攝像頭了,那么使用程序方式打開也就簡單了。這里先關閉這個攝像頭窗口。
【例12.3】播放攝像頭視頻
?? 新建一個控制臺工程,工程名是test。
?? 在工程配置文件test.pro的末尾添加頭文件和庫文件:
INCLUDEPATH += /usr/local/include/opencv4/LIBS += -L /usr/local/lib -lopencv_highgui -lopencv_imgcodecs -lopencv_imgproc -lopencv_core -lopencv_videoio
注意:配置文件test.pro一定要包含庫opencv_videoio,這個庫提供和攝像頭相關的系統函數。
?? 打開main.cpp,并輸入如下代碼:
#include <opencv2/opencv.hpp>
using namespace cv;int main()
{VideoCapture capture(0); // 創建一個捕獲對象并打開它if (!capture.isOpened()) // 判斷打開一個捕獲視頻的設備(也就是攝像頭)是否成功{puts("open failed");return -1;}Mat frame;while (capture.read(frame)) // 讀取視頻幀{imshow("video-demo", frame); // 顯示視頻幀if (waitKey(30) >= 0) // 延時30毫秒,按下任何鍵就退出break; // 跳出循環}return 0; // 結束程序
}
在上述代碼中,首先創建一個捕獲對象并打開它,然后判斷打開是否成功。如果打開成功,則通過while循環逐幀讀取并用imshow顯示該幀圖片,在while中每隔30毫秒循環讀取幀并顯示,這樣看起來就像視頻了。用戶按下任何鍵就退出循環結束程序。waitKey(30)表示程序每30毫秒檢測一次按鍵。
類VideoCapture既支持視頻文件的讀取,也支持攝像頭視頻的讀取。如果要打開視頻文件,則輸入視頻文件路徑名;如果要打開攝像頭,則輸入攝像頭的ID。
?? 保存工程并運行,結果如圖12-6所示。
???????
圖12-6
要退出程序,可以在鍵盤上按任何鍵,比如空格鍵。