C++ OpenCV 顯示camera攝影機串流影像

本篇 ShengYu 介紹如何用 C++ OpenCV 的 VideoCapture 來開啟攝影機並顯示攝影機串流的畫面。

使用範例

C++ OpenCV 要擷取攝影機影像,需要先建立一個 VideoCapture,可以參考下列範例中的 VideoCapture cap(0); 的初始化方式,
VideoCapture 建構子的參數代表攝影機裝置的代號(device index),如果有多台攝影機的話就可以從攝影機裝置的代號來指定,
但通常只有一台攝影機,所以這邊攝影機代號代號0,
之後使用 cap.isOpened() 來確認攝影機裝置有沒有開啟,之後在迴圈使用 cap.read() 每次從攝影機讀取一張影像,
來作進一步的影像處理,也可以用 cap >> frame; 這樣子的寫法來擷取影像,但是後面就要改成判斷 frame.empty() 回傳影像是否有擷取成功,這邊的例子簡單地使用 cv2.cvtColor() 的將影像從彩色轉成灰階,最後使用 imshow() 將影像顯示出來,
並且在迴圈內使用 waitKey(1) 等待按鍵事件發生,如果按下 q 鍵的話則 break 離開這個迴圈。
最後 VideoCapture 會自動在解構子裡釋放該攝影機裝置資源。

opencv-camera.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
// g++ opencv-camera.cpp -o a.out `pkg-config --cflags --libs opencv`
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;

int main() {
VideoCapture cap(0);
if (!cap.isOpened()) {
cout << "Cannot open camera\n";
return 1;
}

Mat frame;
Mat gray;
//namedWindow("live", WINDOW_AUTOSIZE); // 命名一個視窗,可不寫
while (true) {
// 擷取影像
bool ret = cap.read(frame); // or cap >> frame;
if (!ret) {
cout << "Can't receive frame (stream end?). Exiting ...\n";
break;
}

// 彩色轉灰階
cvtColor(frame, gray, COLOR_BGR2GRAY);

// 顯示圖片
imshow("live", frame);
//imshow("live", gray);

// 按下 q 鍵離開迴圈
if (waitKey(1) == 'q') {
break;
}
}
// VideoCapture 會自動在解構子裡釋放資源
return 0;
}

其他參考
OpenCV: cv::VideoCapture Class Reference
https://docs.opencv.org/master/d8/dfe/classcv_1_1VideoCapture.html

其它相關文章推薦
Python OpenCV 顯示camera攝影機串流影像
在 Ubuntu 下寫第一支 OpenCV 程式