我正在尝试从OpenCV中的Logitech C920中捕获视频流。使用Labview,我可以30fps 1080p访问MJPG流。在opencv中,我被限制为5fps或640x480。
以下是与相机设置相关的代码:
this->camRef.set(CV_CAP_PROP_FRAME_WIDTH, 1920);
this->camRef.set(CV_CAP_PROP_FRAME_HEIGHT, 1080);
this->camRef.set(CV_CAP_PROP_FOURCC,CV_FOURCC('M','J','P','G'));
这些都返回1,但我得到一个5fps的1080p流,对应于YUY2流 如果我添加以下行:
this->camRef.set(CV_CAP_PROP_FPS, 30);
返回0。 我以640x480获得了30 fps的流。对我而言,似乎不接受MJPG设置,但我不知道该怎么做或如何解决这个问题。
编辑:以下内容导致程序崩溃。
this->camRef.read(this->image);
std::cout<< this->camRef.get(CV_CAP_PROP_FOURCC) << std::endl;
std::cout<< this->camRef.set(CV_CAP_PROP_FRAME_WIDTH, config.width) << std::endl;
std::cout<< this->camRef.set(CV_CAP_PROP_FRAME_HEIGHT, config.height) << std::endl;
std::cout<< this->camRef.set(CV_CAP_PROP_FOURCC,CV_FOURCC('M','J','P','G')) << std::endl;
std::cout<< this->camRef.get(CV_CAP_PROP_FOURCC) << std::endl;
然后在我的运行代码中,我有以下内容:
void camera::run()
{
while(true)
{
if(this->camRef.read(this->image) == 0)
{
if(this->capture)
{
cv::imwrite(fileName,this->image);
this->count++;
}
}
msleep(15);
}
}
EDIT2:解决方案是在设置相机高度和宽度之前设置fourCC编解码器。
答案 0 :(得分:11)
由于帖子的作者已经找到了解决方案,但没有将其作为答案添加,我将把解决方案放在这里。
您必须在设置所需分辨率之前设置编解码器:
this->camRef.set(CV_CAP_PROP_FOURCC,CV_FOURCC('M','J','P','G'));
this->camRef.set(CV_CAP_PROP_FRAME_WIDTH, 1920);
this->camRef.set(CV_CAP_PROP_FRAME_HEIGHT, 1080);
答案 1 :(得分:2)
与Logitech c922合作,需要:
capture.open(CV_CAP_DSHOW);
capture.set(CV_CAP_PROP_FOURCC, CV_FOURCC('M', 'J', 'P', 'G'));
capture.set(CV_CAP_PROP_FRAME_WIDTH, 1920);
capture.set(CV_CAP_PROP_FRAME_HEIGHT, 1080);
答案 2 :(得分:1)
在设置任何内容之前尝试从捕获中获取第一帧:
VideoCapture cap(0);
if(!cap.isOpened())
return -1;
Mat frame;
cap >> frame;
double fps;
cap.set(CV_CAP_PROP_FRAME_HEIGHT, 1080.0);
cap.set(CV_CAP_PROP_FRAME_WIDTH, 1920.0);
//add the loop here
并检查它是否可以在没有设置MJPG的情况下工作。如果它可行,请尝试使用MJPG。
对我而言,在设置任何内容之前必须获得第一帧是有点奇怪,但这是它为我工作的唯一方式(Windows 7 32位)。
的 //编辑: 强>
哟可能会尝试使用不同的API - 请参阅我的答案的第二部分:https://stackoverflow.com/a/14188280/1598485 OpenCV默认情况下会尝试使用最好的API,但在您的情况下,其他一些API可能会更好用。