影象拼接(二):OpenCV同時開啟兩個攝像頭捕獲視訊
阿新 • • 發佈:2018-12-21
使用OpenCV實現同時開啟兩個USB攝像頭,並實時顯示視訊。如果未檢測有兩個攝像頭,程式會結束併發出“攝像頭未安裝好”的警告。這裡推薦一個小巧的攝像頭視訊捕捉軟體:amcap,使用它可以方便的檢查每個攝像頭是否能正常工作。
捕獲視訊:
#include "opencv2/core/core.hpp" #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #include<iostream> using namespace cv; using namespace std; int main() { VideoCapture cap1(2); VideoCapture cap2(1); bool stop(false); Mat frame1; Mat frame2; namedWindow("cam1", CV_WINDOW_AUTOSIZE); namedWindow("cam2", CV_WINDOW_AUTOSIZE); if (cap1.isOpened() && cap2.isOpened()) { cout << "*** ***" << endl; cout << "攝像頭已啟動!" << endl; } else { cout << "*** ***" << endl; cout << "警告:請檢查攝像頭是否安裝好!" << endl; cout << "程式結束!" << endl << "*** ***" << endl; return -1; } //cap1.set(CV_CAP_PROP_FRAME_WIDTH, 640); //cap1.set(CV_CAP_PROP_FRAME_HEIGHT, 480); //cap2.set(CV_CAP_PROP_FRAME_WIDTH, 640); //cap2.set(CV_CAP_PROP_FRAME_HEIGHT, 480); cap1.set(CV_CAP_PROP_FOCUS, 0); cap2.set(CV_CAP_PROP_FOCUS, 0); while (!stop) { if (cap1.read(frame1) && cap2.read(frame2)) { imshow("cam1", frame1); imshow("cam2", frame2); imwrite("frame1.bmp", frame1); imwrite("frame2.bmp", frame2); //彩色幀轉灰度 cvtColor(frame1, frame1, CV_RGB2GRAY); cvtColor(frame2, frame2, CV_RGB2GRAY); if (waitKey(1) == 27)//按ESC鍵 { stop = true; cout << "程式結束!" << endl; cout << "*** ***" << endl; } } } return 0; }
程式碼說明:
1、VideoCapture cap1(2);這句定義了一個視訊捕獲物件,引數為攝像頭的ID,0是第1個攝像頭,請確認每個攝像頭的ID。
2、下面兩句設定了捕獲視訊每幀影象的解析度和焦距,呼叫的是bool VideoCapture::set(int propId, double value)方法。此外,該方法還可設定視訊捕獲的幀率、亮度、對比度、飽和度、白平衡等各種資訊。可參考OpenCV線上文件。
cap1.set(CV_CAP_PROP_FRAME_WIDTH, 640);
cap1.set(CV_CAP_PROP_FRAME_HEIGHT, 480);
cap1.set(CV_CAP_PROP_FOCUS, 0);
cap2.set(CV_CAP_PROP_FOCUS, 0);
3、if (cap1.read(frame1) && cap2.read(frame2)){}中read()方法的引數代表捕獲的幀影象,如果捕獲成功,則返回True。