OpenCV在单个帧中显示三重图像

时间:2014-03-18 19:00:30

标签: c++ opencv

我正在尝试构建一个应用程序来简单地从我的相机中获取,保存和显示一些帧,一个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

要注意的一些方面:

  1. 代码正常执行并在工作时返回正常图像 使用笔记本电脑的集成网络摄像头。
  2. 当使用其他应用程序(如fswebcam或VLC)时,DMK41BU02相机正常工作并返回正常图像。
  3. 相机数据表显示它与OpenCV兼容。
  4. 我也尝试过无限循环的代码,因为我知道抓取的第一帧可能是空白的或有某种类型的错误,但问题仍然存在。
  5. 我在安装相机驱动程序时遇到了一些问题,但我认为它们已全部解决了。
  6. 笔记本电脑是一台安装了Ubuntu的32位机器。在这里,您可以看到uname -aLinux AsusPC 3.11.0-18-generic #32~precise1-Ubuntu SMP Thu Feb 20 17:54:21 UTC 2014 i686 i686 i386 GNU/Linux
  7. 的输出

    我不知道如何调试此问题,当然,我不知道错误可能在哪里。你能给我任何暗示吗?

    非常感谢。



    更新:我忘记在程序的最开始发布应用程序在终端中写入的奇怪输出:

    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
    

2 个答案:

答案 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();

但是,我有点喜欢你的情况。您有一个自然的帧队列,可以通过查看三个连续帧中发生的事情来分析可能的结构。