Я пытаюсь прочитать данные с промышленной камеры, используя драйвер V4L Linux и C ++. Я хотел бы отобразить результат с помощью OpenCV. Я читаю буфер, создаю объект Mat, который на самом деле содержит значения в диапазоне 0 … 255.
Кажется, проблема в вызове 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 принесли и вывод. Разница между этими форматами описана здесь: В OpenCV, в чем разница между CV_8U и CV_8UC1?