我正在尝试使用C ++中的OpenCV和两个网络摄像头进行实时立体视觉设置。可以从两个网络摄像头中单独获取帧。但是,当我尝试在线程中同时访问它们时,我收到运行时错误:
VIDIOC_STREAMON: Cannot allocate memory
OpenCV Error: Assertion failed (size.width>0 && size.height>0) in imshow, file /home/lorre851/Downloads/opencv-3.1.0/modules/highgui/src/window.cpp, line 281
terminate called after throwing an instance of 'cv::Exception'
what(): /home/lorre851/Downloads/opencv-3.1.0/modules/highgui/src/window.cpp:281: error: (-215) size.width>0 && size.height>0 in function imshow
我的代码如下:
#include <iostream>
#include <thread>
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
void stream(int camera) {
VideoCapture cap(camera); // open the default camera
if(cap.isOpened()) { // check if we succeeded
while(true) {
Mat frame;
cap >> frame; // get a new frame from camera
imshow("Stream " + to_string(camera), frame);
if (waitKey(30) >= 0) break;
}
}
}
int main() {
thread cam1 (stream, 1);
thread cam2 (stream, 2);
cam1.join();
cam2.join();
return 0;
}
有人知道是什么原因引起的吗?我在Ubuntu 15.10 LTE上使用了CLion。
更新1:我正在使用索引1和2作为相机,因为我的笔记本电脑中有一个内置摄像头(0),插入了两个USB摄像头(1和2)。 USB摄像头是这里的目标硬件。
更新2:将两个摄像头输入放在一个线程中(参见下面的代码)可以正常工作(假设您的USB端口使用单独的总线,否则您将获得“没有空间左侧设备”但是两帧之间的延迟是明显的,这对于立体视觉设置来说并不理想。
cv::VideoCapture camera0(0);
cv::VideoCapture camera1(1);
if( !camera0.isOpened() ) return 1;
if( !camera1.isOpened() ) return 1;
cv::Mat3b frame0;
cv::Mat3b frame1;
while(true) {
camera0 >> frame0;
camera1 >> frame1;
if(mat_is_empty(frame0)) cout << "SKIPPED FRAME IN 0";
else cv::imshow("Stream 0", frame0);
if(mat_is_empty(frame1)) cout << "SKIPPED FRAME IN 1";
else cv::imshow("Stream 1", frame1);
int c = cvWaitKey(40);
//exit the loop if user press "Esc" key (ASCII value of "Esc" is 27)
if(27 == char(c)) break;
}
答案 0 :(得分:0)
也许,我有愚蠢的回答。你的代码工作得很好..
从零开始计算相机。
thread cam1 (stream, 0); THIS works
// thread cam2 (stream, 1); I dont have second camera
首先,我在Windows机器上。我的相机从0,1,2算起 我没有第二台网络摄像头。
在图片中我只使用你的代码并粘贴cam(0)我的网络摄像头 对于第二台相机,我使用测试rtsp流。
#include <iostream>
#include <thread>
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
void stream(int camera) {
VideoCapture cap;
if (camera == 0) {
cap.open(0); // open the default camera
}
if (camera == 1) {
cap.open("rtsp://mpv.cdn3.bigCDN.com:554/bigCDN/definst/mp4:bigbuckbunnyiphone_400.mp4"); // open the default camera
}
if (cap.isOpened()) { // check if we succeeded
while (true) {
Mat frame;
cap >> frame; // get a new frame from camera
imshow("Stream " + to_string(camera), frame);
if (waitKey(30) >= 0) break;
}
}
}
int main() {
thread cam1(stream, 0);
thread cam2(stream, 1);
cam1.join();
cam2.join();
return 0;
}