OpenCV中的调用imshow()未创建任何输出 我试图用V4L Linux驱动程序和C++来读取工业相机的数据。我想使用OpenCV显示结果。我读取缓冲区,创建一个Mat对象,它实际上包含范围为0…255的值

OpenCV中的调用imshow()未创建任何输出 我试图用V4L Linux驱动程序和C++来读取工业相机的数据。我想使用OpenCV显示结果。我读取缓冲区,创建一个Mat对象,它实际上包含范围为0…255的值,c++,opencv,image-processing,v4l2,C++,Opencv,Image Processing,V4l2,问题似乎在于imshow电话。当注释这一行时,将显示一个没有图像的实际窗口。一旦未注释,则不会显示任何窗口,也不会在显示此行后的终端中显示任何输出。我无法独自找到解决方案,我找到的所有示例在我看来都与我的代码相同 代码如下: #include <fcntl.h> #include "opencv/cv.h" #include "opencv/highgui.h" #include <libv4l2.h> #include <libv4l1.h> #includ

问题似乎在于imshow电话。当注释这一行时,将显示一个没有图像的实际窗口。一旦未注释,则不会显示任何窗口,也不会在显示此行后的终端中显示任何输出。我无法独自找到解决方案,我找到的所有示例在我看来都与我的代码相同

代码如下:

#include <fcntl.h>
#include "opencv/cv.h"
#include "opencv/highgui.h"
#include <libv4l2.h>
#include <libv4l1.h>
#include <linux/videodev2.h>
#include <sys/ioctl.h> 

#define BUFFERSIZE 357120 // 744 * 480

using namespace cv;
using namespace std;

int main(int argc, char **argv) {
int cameraHandle, i;
unsigned char pictureBuffer[BUFFERSIZE];
char cameraDevice[] = "/dev/video0";
struct v4l2_control V4L2_control;

/* open camera device */
if (( cameraHandle = v4l1_open(cameraDevice, O_RDONLY)) == -1 ){
    printf("Unable to open the camera");
    return -1;
}

// disable auto exposure
V4L2_control.id = V4L2_CID_EXPOSURE_AUTO;
V4L2_control.value = V4L2_EXPOSURE_SHUTTER_PRIORITY;
ioctl(cameraHandle, VIDIOC_S_CTRL, &V4L2_control);
// set exposure time
V4L2_control.id = V4L2_CID_EXPOSURE_ABSOLUTE;
V4L2_control.value = 2;
ioctl(cameraHandle, VIDIOC_S_CTRL, &V4L2_control);

// get 5 pictures to warm up the camera
for (i = 0; i <= 5; i++){
    v4l1_read(cameraHandle, pictureBuffer, BUFFERSIZE);
}

// show pictures
Mat mat = Mat(744, 480, CV_8UC3, (void*)pictureBuffer);
cout << "M = " << endl << " " << mat << endl << endl; // display the image data

namedWindow("imagetest", CV_WINDOW_AUTOSIZE );
imshow("imagetest", mat);
waitKey(30);

cout << "test output" << endl;

//clenup
v4l1_close(cameraHandle);
destroyWindow("imagetest");

return 0;
}
编辑:

嗯,在终端而不是ecipse中运行代码后,我看到了一个分段错误,甚至对后面的所有内容都进行了注释

cout << "M = " << endl << " " << mat << endl << endl;

行给了我这个错误。

已解决。问题在于文件格式错误。将CV_8UC1或CV_8U而不是CV_8UC3带入并输出。这些格式之间的差异如下所述:

图像数据是否已损坏?您是否尝试过imwrite来测试是否正确地从相机中拍摄图像?对我来说,有点像是从字节数据开始的低级映像初始化。您确定函数v4l1\u read中的输出图像数据与Mat构造函数兼容吗?我不确定,摄像头不支持opencv中的cap方法。guvcview程序告诉我,它使用Y800灰度格式。创建mat对象时,将图像格式更改为CV_8UC1会带来改进。没有分割错误,代码也可以运行,但是图像窗口只出现了一毫秒,然后又消失了。