我正试图在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'));
Run Code Online (Sandbox Code Playgroud)
这些都返回1,但我得到一个5fps的1080p流,对应于YUY2流.
如果我添加以下行:
this->camRef.set(CV_CAP_PROP_FPS, 30);
Run Code Online (Sandbox Code Playgroud)
返回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;
Run Code Online (Sandbox Code Playgroud)
然后在我的运行代码中,我有以下内容:
void camera::run()
{
while(true)
{
if(this->camRef.read(this->image) == 0)
{
if(this->capture)
{
cv::imwrite(fileName,this->image);
this->count++;
}
}
msleep(15);
}
}
Run Code Online (Sandbox Code Playgroud)
EDIT2:解决方案是在设置摄像机高度和宽度之前设置fourCC编解码器.
ns1*_*291 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);
Run Code Online (Sandbox Code Playgroud)
在设置任何内容之前尝试从捕获中获取第一帧:
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
Run Code Online (Sandbox Code Playgroud)
并检查它是否可以在不设置 MJPG 的情况下工作。如果可行,请尝试使用 MJPG。
对我来说,在设置任何内容之前必须先获取第一帧有点奇怪,但这是它对我有用的唯一方法(Windows 7 32位)。
//编辑:
你可能会尝试使用不同的API - 请参阅我的答案的第二部分:https: //stackoverflow.com/a/14188280/1598485 OpenCV默认情况下会尝试使用最好的API,但也许在你的情况下有些其他 API 会工作得更好。
| 归档时间: |
|
| 查看次数: |
18827 次 |
| 最近记录: |