diff --git a/modules/videoio/include/opencv2/videoio.hpp b/modules/videoio/include/opencv2/videoio.hpp index 88164a326d8a34cce51aaae3f784aa83f441e871..01fc41048d5632bb8ec34b78587cfbb264fb5a99 100644 --- a/modules/videoio/include/opencv2/videoio.hpp +++ b/modules/videoio/include/opencv2/videoio.hpp @@ -136,7 +136,8 @@ enum { CAP_PROP_POS_MSEC =0, // Currently, these are supported through the libv4l interface only. enum { CAP_MODE_BGR = 0, // BGR24 (default) CAP_MODE_RGB = 1, // RGB24 - CAP_MODE_GRAY = 2 // Y8 + CAP_MODE_GRAY = 2, // Y8 + CAP_MODE_YUYV = 3 // YUYV }; diff --git a/modules/videoio/include/opencv2/videoio/videoio_c.h b/modules/videoio/include/opencv2/videoio/videoio_c.h index 5130fa6f5b568aac3ad57a389217c45189361e79..5ab7345315b8655af1534059742ff30cb6b7720e 100644 --- a/modules/videoio/include/opencv2/videoio/videoio_c.h +++ b/modules/videoio/include/opencv2/videoio/videoio_c.h @@ -299,7 +299,8 @@ enum { CV_CAP_MODE_BGR = 0, // BGR24 (default) CV_CAP_MODE_RGB = 1, // RGB24 - CV_CAP_MODE_GRAY = 2 // Y8 + CV_CAP_MODE_GRAY = 2, // Y8 + CV_CAP_MODE_YUYV = 3 // YUYV }; enum diff --git a/modules/videoio/src/cap_libv4l.cpp b/modules/videoio/src/cap_libv4l.cpp index a6278bc26b300aba8053814de97f77ade6e3b3e6..9eaa6374d581f585eca50f8a8344cd3e9901437e 100644 --- a/modules/videoio/src/cap_libv4l.cpp +++ b/modules/videoio/src/cap_libv4l.cpp @@ -646,6 +646,8 @@ static inline int channels_for_mode(int mode) switch(mode) { case CV_CAP_MODE_GRAY: return 1; + case CV_CAP_MODE_YUYV: + return 2; default: return 3; } @@ -713,31 +715,26 @@ static int _capture_V4L2 (CvCaptureCAM_V4L *capture, char *deviceName) /* libv4l will convert from any format to V4L2_PIX_FMT_BGR24, V4L2_PIX_FMT_RGV24, or V4L2_PIX_FMT_YUV420 */ unsigned int requestedPixelFormat; - int width; - int height; switch (capture->mode) { case CV_CAP_MODE_RGB: requestedPixelFormat = V4L2_PIX_FMT_RGB24; - width = capture->width; - height = capture->height; break; case CV_CAP_MODE_GRAY: requestedPixelFormat = V4L2_PIX_FMT_YUV420; - width = capture->width; - height = capture->height; + break; + case CV_CAP_MODE_YUYV: + requestedPixelFormat = V4L2_PIX_FMT_YUYV; break; default: requestedPixelFormat = V4L2_PIX_FMT_BGR24; - width = capture->width; - height = capture->height; break; } CLEAR (capture->form); capture->form.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; capture->form.fmt.pix.pixelformat = requestedPixelFormat; capture->form.fmt.pix.field = V4L2_FIELD_ANY; - capture->form.fmt.pix.width = width; - capture->form.fmt.pix.height = height; + capture->form.fmt.pix.width = capture->width; + capture->form.fmt.pix.height = capture->height; if (-1 == xioctl (capture->deviceHandle, VIDIOC_S_FMT, &capture->form)) { fprintf(stderr, "VIDEOIO ERROR: libv4l unable to ioctl S_FMT\n"); @@ -949,6 +946,10 @@ static int _capture_V4L (CvCaptureCAM_V4L *capture, char *deviceName) requestedVideoPalette = VIDEO_PALETTE_YUV420; depth = 8; break; + case CV_CAP_MODE_YUYV: + requestedVideoPalette = VIDEO_PALETTE_YUYV; + depth = 16; + break; default: requestedVideoPalette = VIDEO_PALETTE_RGB24; depth = 24; @@ -1319,6 +1320,7 @@ static IplImage* icvRetrieveFrameCAM_V4L( CvCaptureCAM_V4L* capture, int) { switch(capture->imageProperties.palette) { case VIDEO_PALETTE_RGB24: case VIDEO_PALETTE_YUV420: + case VIDEO_PALETTE_YUYV: memcpy((char *)capture->frame.imageData, (char *)(capture->memoryMap + capture->memoryBuffer.offsets[capture->bufferIndex]), capture->frame.imageSize); @@ -1464,6 +1466,10 @@ static int icvSetVideoSize( CvCaptureCAM_V4L* capture, int w, int h) { cropHeight = h*8; cropWidth = w*8; break; + case CV_CAP_MODE_YUYV: + cropHeight = h*16; + cropWidth = w*16; + break; default: cropHeight = h*24; cropWidth = w*24; @@ -1719,6 +1725,7 @@ static int icvSetPropertyCAM_V4L(CvCaptureCAM_V4L* capture, int property_id, dou case CV_CAP_MODE_BGR: case CV_CAP_MODE_RGB: case CV_CAP_MODE_GRAY: + case CV_CAP_MODE_YUYV: capture->mode = mode; /* recreate the capture buffer for the same output resolution but a different pixel format */