我正在尝试构建一个应用程序来简单地从我的相机中获取,保存和显示一些帧,一个DMK 41BU02(您可以在以下链接中查阅该设备的规格:datasheet)
我的代码就像那样简单:
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
int main(int, char**)
{
String path="~/proof.jpg";
VideoCapture cap(1); // /dev/video0 is the integrated webcam of my laptop, while /dev/video1 is the DMK41BU02 camera
cvNamedWindow( "Video", CV_WINDOW_AUTOSIZE );
if(!cap.isOpened()) // check if we succeeded
return -1;
Mat frame;
cap >> frame;
imwrite(path, frame);
imshow("Video", frame);
waitkey(0);
return 0;
}
代码编译并执行任何问题,但是当图像显示在窗口上或保存在jpg文件中时错误到来,因为我得到类似下面的jpg,其中图像三重在框架中:
Resulting image of the code shown above
要注意的一些方面:
uname -a
:Linux AsusPC 3.11.0-18-generic #32~precise1-Ubuntu SMP Thu Feb 20 17:54:21 UTC 2014 i686 i686 i386 GNU/Linux
我不知道如何调试此问题,当然,我不知道错误可能在哪里。你能给我任何暗示吗?
非常感谢。
更新:我忘记在程序的最开始发布应用程序在终端中写入的奇怪输出:
VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
libv4l2: error set_fmt gave us a different result then try_fmt!
HIGHGUI ERROR: libv4l unable convert to requested pixfmt
libv4l2: error set_fmt gave us a different result then try_fmt!
init done
opengl support available
答案 0 :(得分:0)
我遇到了完全相同的问题。问题出在openCV本身,或者更多;如何实现cap_v4l.hpp(在highgui模块中)和cap_libv4l.hpp。
这里的问题是OpenCV似乎使用错误的视频类型或通道类型来读取数据。尝试在opencv lib中使用不同类型(yuyv变体等)播放arround。
出于一些神奇的原因,cap_v4l.hpp是opencv实际使用的代码,并且没有使用cap_lib4l中的代码,但似乎支持更多的视频格式(它可以切换到周围,我不确定)
切换这些文件并重新编译opencv确实为我提供了改进。
答案 1 :(得分:0)
由于在调用cap>>帧之后你有三个频道(类型= 16),你的捕捉不知道你的相机是单色的。请改用grab-retrieve pairs,因为retrieve指定了多个频道。
bool VideoCapture::grab()
bool VideoCapture::retrieve(Mat& image, int channel=0)
以下是示例code,其中还显示了如何设置摄像机参数。您还可以尝试设置一些明确声明单色模式的相机参数。如果其他一切都失败了,你总是可以用
从三联中剪下一张图像Rect rect(0, 0, frame.cols/3, frame.rows);
Mat true_img = frame(rect).clone();
但是,我有点喜欢你的情况。您有一个自然的帧队列,可以通过查看三个连续帧中发生的事情来分析可能的结构。