同时读取两个USB摄像头采集
生活随笔
收集整理的這篇文章主要介紹了
同时读取两个USB摄像头采集
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.??OpenCV:VideoCapture同時打開兩個攝像頭
#include <opencv2/opencv.hpp> #include<iostream>using namespace cv; using namespace std;int main() {//initialize and allocate memory to load the video stream from cameraVideoCapture camera0(1);camera0.set(CAP_PROP_FRAME_WIDTH,320);camera0.set(CAP_PROP_FRAME_HEIGHT,240);VideoCapture camera1(0);camera1.set(CAP_PROP_FRAME_WIDTH,320);camera1.set(CAP_PROP_FRAME_HEIGHT,240);if( !camera0.isOpened() ) return 1;if( !camera1.isOpened() ) return 1;while(true) {//grab and retrieve each frames of the video sequentiallyMat3b frame0;camera0 >> frame0;Mat3b frame1;camera1 >> frame1;imshow("Video0", frame0);imshow("Video1", frame1);//std::cout << frame1.rows() << std::endl;//wait for 40 millisecondsint c = waitKey(20);//exit the loop if user press "Esc" key (ASCII value of "Esc" is 27)if(27 == char(c)) break;}return 0;}[注]:
1. ?分辨率為320*240,能夠正常顯示,分辨率太高,只有一個攝像頭能正常顯示,另一個顯示灰度圖。原因是USB的帶寬有限。
2. 攝像頭的序號在opencv中是采用降序的形式,才能正確讀取多個攝像頭,否則就不能。
3. VideoCapture類有兩種用法,一種是VideoCapture(const string& filename)用來打開視頻文件,一種是VideoCapture(int device)用來打開設備。
2.?OpenCV VideoCapture 設置和獲取攝像頭參數
適用于VideoCapture打開的攝像頭
VideoCapture capture(0);設置攝像頭參數?不要隨意修改
capture.set(CV_CAP_PROP_FRAME_WIDTH, 1080);//寬度 capture.set(CV_CAP_PROP_FRAME_HEIGHT, 960);//高度 capture.set(CV_CAP_PROP_FPS, 30);//幀率 幀/秒 capture.set(CV_CAP_PROP_BRIGHTNESS, 1);//亮度 1 capture.set(CV_CAP_PROP_CONTRAST,40);//對比度 40 capture.set(CV_CAP_PROP_SATURATION, 50);//飽和度 50 capture.set(CV_CAP_PROP_HUE, 50);//色調 50 capture.set(CV_CAP_PROP_EXPOSURE, 50);//曝光 50獲取攝像頭參數
capture.get(CV_CAP_PROP_FRAME_WIDTH); capture.get(CV_CAP_PROP_FRAME_HEIGHT); capture.get(CV_CAP_PROP_FPS); capture.get(CV_CAP_PROP_BRIGHTNESS); capture.get(CV_CAP_PROP_CONTRAST); capture.get(CV_CAP_PROP_SATURATION); capture.get(CV_CAP_PROP_HUE); capture.get(CV_CAP_PROP_EXPOSURE);源代碼
/** @brief OpenCV攝像頭和視頻屬性操作 @author @copyright - @version 1.0 @data @note - */ #include <iostream> #include "opencv2/opencv.hpp"using namespace std; using namespace cv;const string window_name = "用戶界面";#define USE_CAMERA //#define USE_VIDEOint main() {Mat frame;double brightness = 0; //亮度double contrast = 0; //對比度double saturation = 0; //飽和度double hue = 0; //色調double gain = 0; //增益double exposure = 0; //曝光double white_balance = 0; //白平衡double pos_msec = 0; //當前視頻位置(ms)double pos_frame = 0; //從0開始下一幀的索引double pos_avi_ratio = 0; //視頻中的相對位置(范圍為0.0到1.0)double frame_width = 0; //視頻幀的像素寬度double frame_height = 0; //視頻幀的像素高度double fps = 0; //幀速率double frame_count = 0; //視頻總幀數double video_duration = 0.00; //視頻時長double format = 0; //格式#ifdef USE_VIDEOconst string file_name = "201910915314.avi";VideoCapture capture(file_name);frame_width = capture.get(cv::CAP_PROP_FRAME_WIDTH);frame_height = capture.get(cv::CAP_PROP_FRAME_HEIGHT);fps = capture.get(cv::CAP_PROP_FPS);frame_count = capture.get(cv::CAP_PROP_FRAME_COUNT);format = capture.get(cv::CAP_PROP_FORMAT);pos_avi_ratio = capture.get(cv::CAP_PROP_POS_AVI_RATIO);video_duration = frame_count / fps;cout << "---------------------------------------------" << endl;cout << "視頻中的相對位置(范圍為0.0到1.0):" << pos_avi_ratio << endl;cout << "視頻幀的像素寬度:" << frame_width << endl;cout << "視頻幀的像素高度:" << frame_height << endl;cout << "錄制視頻的幀速率(幀/秒):" << fps << endl;cout << "視頻文件總幀數:" << frame_count << endl;cout << "圖像的格式:" << format << endl;cout << "視頻時長:" << video_duration << endl;cout << "---------------------------------------------" << endl; #endif // USE_VIDEO#ifdef USE_CAMERAVideoCapture capture(0);brightness = capture.get(cv::CAP_PROP_BRIGHTNESS);contrast= capture.get(cv::CAP_PROP_CONTRAST);saturation = capture.get(cv::CAP_PROP_SATURATION);hue = capture.get(cv::CAP_PROP_HUE);gain = capture.get(cv::CAP_PROP_GAIN);exposure = capture.get(cv::CAP_PROP_EXPOSURE);white_balance = capture.get(cv::CAP_PROP_WHITE_BALANCE_BLUE_U);std::cout << "---------------------------------------------" << endl;std::cout << "攝像頭亮度:" << brightness << endl;std::cout << "攝像頭對比度:" << contrast << endl;std::cout << "攝像頭飽和度:" << saturation << endl;std::cout << "攝像頭色調:" << hue << endl;std::cout << "攝像頭增益:" << gain << endl;std::cout << "攝像頭曝光度:" << exposure << endl;std::cout << "攝像頭白平衡:" << white_balance << endl;std::cout << "---------------------------------------------" << endl; #endif // USE_CAMERAnamedWindow(window_name,WINDOW_AUTOSIZE);while (capture.isOpened()){capture >> frame;#ifdef USE_VIDEOpos_msec = capture.get(cv::CAP_PROP_POS_MSEC);pos_frame = capture.get(cv::CAP_PROP_POS_FRAMES);pos_avi_ratio = capture.get(cv::CAP_PROP_POS_AVI_RATIO);cout << "---------------------------------------------" << endl;cout << "視頻文件中當前位置(ms):" << pos_msec << endl;cout << "從0開始下一幀的索引:" << pos_frame << endl;cout << "視頻中的相對位置(范圍為0.0到1.0):" << pos_avi_ratio << endl;cout << "---------------------------------------------" << endl; #endif // USE_VIDEOimshow(window_name, frame);if (waitKey(60)==27){break;}}capture.release();destroyAllWindows();return 0; }3.?opencv 出現 “VIDIOC_STREAMON: No space left on device” 錯誤 解決方法
現象:
今天在用opencv python 打開雙攝像頭時報一個錯誤: VIDIOC_STREAMON: No space left on device,設備上沒有空間
1. 之前用opencv-3.2.0 版本沒有報這個問題,現在使用新版本opencv-3.4.2 就出現這個問題。
2. 把攝像頭的分辨率改小到320*240后可以正常使用雙攝像頭。
原因是:單個攝像頭占用了USB的全部帶寬。
解決方法:
在打開攝像頭時添加一個語句:
capture1.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc(*"MJPG"))
?
代碼:
capture1 = cv2.VideoCapture(2) capture2 = cv2.VideoCapture(1)capture1.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc(*"MJPG")) capture2.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc(*"MJPG")) # setting resolution capture1.set(cv2.CAP_PROP_FRAME_WIDTH, 640) capture1.set(cv2.CAP_PROP_FRAME_HEIGHT, 480) capture2.set(cv2.CAP_PROP_FRAME_WIDTH, 640) capture2.set(cv2.CAP_PROP_FRAME_HEIGHT, 480) if (capture.isOpened())capture.release(); //decide whether capture is already opened; if so,close itcapture.open(0); //open the default cameracapture.set(CAP_PROP_FOURCC, VideoWriter::fourcc('M', 'J', 'P', 'G')) ;capture.set(CAP_PROP_FPS, 60);capture.set(CAP_PROP_FRAME_WIDTH, ImgWidth);capture.set(CAP_PROP_FRAME_HEIGHT, ImgHeight);總結
以上是生活随笔為你收集整理的同时读取两个USB摄像头采集的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 活力花提前还款会怎样
- 下一篇: 新三板股票会转主板吗 其实还是要看公司的