ubuntu18.04 opencv 获取摄像头 (C++/python)
第一版:
// 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;
}
结果:
第二版:
#include <opencv2/core.hpp>
#include <opencv2/videoio.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>
#include <stdio.h>
using namespace cv;
using namespace std;
int main(int, char**)
{
Mat frame;
//--- INITIALIZE VIDEOCAPTURE
VideoCapture cap;
// open the default camera using default API
// cap.open(0);
// OR advance usage: select any API backend
int deviceID = 0; // 0 = open default camera
int apiID = cv::CAP_ANY; // 0 = autodetect default API
// open selected camera using selected API
cap.open(deviceID, apiID);
// check if we succeeded
if (!cap.isOpened()) {
cerr << "ERROR! Unable to open camera\n";
return -1;
}
//--- GRAB AND WRITE LOOP
cout << "Start grabbing" << endl
<< "Press any key to terminate" << endl;
for (;;)
{
// wait for a new frame from camera and store it into 'frame'
cap.read(frame);
// check if we succeeded
if (frame.empty()) {
cerr << "ERROR! blank frame grabbed\n";
break;
}
// show live and wait for a key with timeout long enough to show images
imshow("Live", frame);
if (waitKey(5) >= 0)
break;
}
// the camera will be deinitialized automatically in VideoCapture destructor
return 0;
}
结果:
参考:
- https://anishdubey.com/read-write-display-video-opencv
- https://docs.opencv.org/4.x/d8/dfe/classcv_1_1VideoCapture.html