Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save astarasikov/a0dbc09603d03afbf626171739625913 to your computer and use it in GitHub Desktop.
Save astarasikov/a0dbc09603d03afbf626171739625913 to your computer and use it in GitHub Desktop.
Y422 Color Capture support for Aravis in OpenCV
From ceb9d548a6ed86e5f20f3f0605872145097bfbb6 Mon Sep 17 00:00:00 2001
From: Alexander Tarasikov <[email protected]>
Date: Fri, 2 Mar 2018 21:32:01 +0100
Subject: [PATCH] NOMERGE: Add Y422 color format support to Aravis
---
modules/videoio/src/cap_aravis.cpp | 12 ++++++++++++
samples/cpp/videocapture_basic.cpp | 15 +++++++++++----
2 files changed, 23 insertions(+), 4 deletions(-)
diff --git a/modules/videoio/src/cap_aravis.cpp b/modules/videoio/src/cap_aravis.cpp
index f2fc9da77..8ed77048e 100644
--- a/modules/videoio/src/cap_aravis.cpp
+++ b/modules/videoio/src/cap_aravis.cpp
@@ -77,6 +77,7 @@
// Supported types of data:
// video/x-raw, fourcc:'GREY' -> 8bit, 1 channel
// video/x-raw, fourcc:'Y800' -> 8bit, 1 channel
+// video/x-raw, fourcc:'Y422' -> 8bit, 2 channel
// video/x-raw, fourcc:'Y12 ' -> 12bit, 1 channel
// video/x-raw, fourcc:'Y16 ' -> 16bit, 1 channel
// video/x-raw, fourcc:'GRBG' -> 8bit, 1 channel
@@ -84,6 +85,7 @@
#define MODE_GREY CV_FOURCC_MACRO('G','R','E','Y')
#define MODE_Y800 CV_FOURCC_MACRO('Y','8','0','0')
+#define MODE_Y422 CV_FOURCC_MACRO('Y','4','2','2')
#define MODE_Y12 CV_FOURCC_MACRO('Y','1','2',' ')
#define MODE_Y16 CV_FOURCC_MACRO('Y','1','6',' ')
#define MODE_GRBG CV_FOURCC_MACRO('G','R','B','G')
@@ -326,6 +328,10 @@ IplImage* CvCaptureCAM_Aravis::retrieveFrame(int)
depth = IPL_DEPTH_16U;
channels = 1;
break;
+ case ARV_PIXEL_FORMAT_YUV_422_PACKED:
+ depth = IPL_DEPTH_8U;
+ channels = 2;
+ break;
}
if(depth && channels) {
IplImage src;
@@ -480,6 +486,8 @@ double CvCaptureCAM_Aravis::getProperty( int property_id ) const
return MODE_Y16;
case ARV_PIXEL_FORMAT_BAYER_GR_8:
return MODE_GRBG;
+ case ARV_PIXEL_FORMAT_YUV_422_PACKED:
+ return MODE_Y422;
}
}
break;
@@ -556,6 +564,10 @@ bool CvCaptureCAM_Aravis::setProperty( int property_id, double value )
newFormat = ARV_PIXEL_FORMAT_BAYER_GR_8;
targetGrey = 128;
break;
+ case MODE_Y422:
+ newFormat = ARV_PIXEL_FORMAT_YUV_422_PACKED;
+ targetGrey = 128;
+ break;
}
if(newFormat != pixelFormat) {
stopCapture();
diff --git a/samples/cpp/videocapture_basic.cpp b/samples/cpp/videocapture_basic.cpp
index 6f4671545..400187519 100644
--- a/samples/cpp/videocapture_basic.cpp
+++ b/samples/cpp/videocapture_basic.cpp
@@ -23,9 +23,11 @@ int main(int, char**)
cap.open(0);
// OR advance usage: select any API backend
int deviceID = 0; // 0 = open default camera
- int apiID = cv::CAP_ANY; // 0 = autodetect default API
+ int apiID = cv::CAP_ARAVIS; // 0 = autodetect default API
// open selected camera using selected API
cap.open(deviceID + apiID);
+ //cap.set(CV_CAP_PROP_FOURCC, CV_FOURCC_MACRO('G', 'R', 'E', 'Y'));
+ cap.set(CV_CAP_PROP_FOURCC, CV_FOURCC_MACRO('Y', '4', '2', '2'));
// check if we succeeded
if (!cap.isOpened()) {
cerr << "ERROR! Unable to open camera\n";
@@ -42,12 +44,17 @@ int main(int, char**)
// check if we succeeded
if (frame.empty()) {
cerr << "ERROR! blank frame grabbed\n";
- break;
+ continue;
+ //break;
}
+ Mat rgb = Mat::zeros(frame.size(), CV_8UC3);
+ cvtColor(frame, rgb, COLOR_YUV2RGB_UYVY);
+ cvtColor(rgb, rgb, COLOR_RGB2BGR);
// show live and wait for a key with timeout long enough to show images
- imshow("Live", frame);
+ //imshow("Live", frame);
+ imshow("Live", rgb);
if (waitKey(5) >= 0)
- break;
+ continue;
}
// the camera will be deinitialized automatically in VideoCapture destructor
return 0;
--
2.12.2
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment