在OpenCV中 - 使用USB网络摄像头初始化VideoCapture
对象时 - 每2或3次运行一次,相机将无法初始化。我有这个令人难以置信的丑陋代码来解决这个问题,但也许有人知道什么会导致相机初始化失败以及如何防止它?
// Initialize video capture
camera_ = cv::VideoCapture(1);
camera_.set(CV_CAP_PROP_CONVERT_RGB , false);
camera_ >> frame_full_;
while (frame_full_.empty()){ // Could be !cap.isOpened
cerr << "Camera failure." << endl;
camera_.release();
camera_ = cv::VideoCapture(1);
camera_.set(CV_CAP_PROP_CONVERT_RGB , false);
camera_ >> frame_full_;
}
/// Do something with the camera feed.
当我关闭我的程序时,我在控制台中得到Cleaned up camera.
,所以我认为它正在被正确发布。
添加了信息:在相机无法初始化的运行中,对>>
/ .read()
的调用需要很长时间才能返回。
修改:按照@ 4nonymou5的建议,使用>>
运算符和.read()
之间没有区别。
答案 0 :(得分:0)
如果您的意思是,您需要从相机中取出视频,并希望对各个帧进行一些处理,以下代码可能会对您有所帮助。
#include "opencv2/highgui/highgui.hpp"
#include <iostream>
using namespace cv;
using namespace std
int main(int argc, char *argv[])
{
VideoCapture cap(1);
if ( !cap.isOpened() ) // if not success, exit program
{
cout << "Cannot access camera" << endl;
return -1;
}
namedWindow("cam",1);
while(true)
{
Mat frame;
bool check = cap.read(frame); // read a new frame from video
if (!check) //if not success, break loop
{
cout << "Cannot read the frame from video file" << endl;
break;
}
// do what ever processing you want to do on frame
imShow("cam", frame);
waitKey(33);
}
return 0;
}
并为您的代码做出回应, 添加
camera_.read(frame_full_);
就在while循环之前,它会起作用。