【发布时间】:2014-03-20 13:24:51
【问题描述】:
我正在尝试构建一个应用程序来简单地获取、保存和显示来自我的相机 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
需要说明的一些方面:
- 代码正常执行,工作时返回正常图片 使用笔记本电脑的集成网络摄像头。
- DMK41BU02 摄像头正常工作,并在与 fswebcam 或 VLC 等其他应用程序一起使用时返回正常图像。
- 相机数据表显示它与 OpenCV 兼容。
- 我也尝试过无限循环的代码,因为我知道抓取的第一帧可能是空白的或出现某种类型的错误,但问题仍然存在。
- 我在安装相机驱动程序时遇到了一些问题,但我认为它们都已解决。
- 笔记本电脑是一台安装了 Ubuntu 的 32 位机器。这里可以看到
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
【问题讨论】:
-
waitkey(0) 似乎要等待 0 毫秒才能绘制图像并且似乎拼写错误(代码编译?),使用 waitKey(10);你也可以 cout frame.cols、frame.rows、frame.ch、frame.type() 吗?
-
@Vlad
waitKey(0)不会等到某个键被按下?我总是为此使用waitKey(-1),所以我不确定=)@Alejandro 我猜openCV会误解你相机的图像数据(看起来所有3个颜色通道都在一个太大的灰度图像内),但我不知道对VideoCapture对象没有太多经验,所以我不能告诉你如何解决这个问题。 -
据我所知,waitKey(0) 会一直等待,直到按下某个键,我的程序也是如此。
-
抱歉,我没有发表我的全部评论,这里是其余的:我让你在这里,@Vlad,你要求的 cout(除了 frame.ch,因为我不知道做什么你的意思是): COLS:1280 ROWS:960 TYPE:16
-
好吧,我的意思是 m.channels(),对不起。 16 表示您的图像类型是 CV_8UC3,它是 3 通道 rgb unsigned char 数组,根据需要。所以相机或 opecCV 代码应该有问题,而不是你的代码。不过,这三张图片并不是精确的复制品(请注意右下角的 4 个明亮的点簇),所以我会先检查你的相机。 yuv 格式的 A - uv 通常比 Y 压缩 4 倍,但您的图像大小相同,所以情况并非如此。