Merge pull request #18694 from zyp:gstreamer_gray16
* videoio/gstreamer: Add support for GRAY16_LE. * videoio/gstreamer: added BGRA/BGRx support Co-authored-by: Maksim Shabunin <maksim.shabunin@gmail.com>
This commit is contained in:
parent
05d733e707
commit
8dcec034ed
@ -475,8 +475,9 @@ bool GStreamerCapture::retrieveFrame(int, OutputArray dst)
|
||||
// video/x-raw, format=I420 -> 8bit, 1 channel (height is 1.5x larger than true height)
|
||||
// video/x-bayer -> 8bit, 1 channel
|
||||
// image/jpeg -> 8bit, mjpeg: buffer_size x 1 x 1
|
||||
// video/x-raw, format=GRAY16_LE (BE) -> 16 bit, 1 channel
|
||||
// video/x-raw, format={BGRA, RGBA, BGRx, RGBx} -> 8bit, 4 channels
|
||||
// bayer data is never decoded, the user is responsible for that
|
||||
// everything is 8 bit, so we just test the caps for bit depth
|
||||
Size sz = Size(frame_width, frame_height);
|
||||
guint n_planes = GST_VIDEO_INFO_N_PLANES(&info);
|
||||
if (name == "video/x-raw")
|
||||
@ -507,6 +508,24 @@ bool GStreamerCapture::retrieveFrame(int, OutputArray dst)
|
||||
src.copyTo(dst);
|
||||
return true;
|
||||
}
|
||||
else if (format == "GRAY16_LE" || format == "GRAY16_BE")
|
||||
{
|
||||
CV_CheckEQ((int)n_planes, 1, "");
|
||||
size_t step = GST_VIDEO_INFO_PLANE_STRIDE(&info, 0);
|
||||
CV_CheckGE(step, (size_t)frame_width, "");
|
||||
Mat src(sz, CV_16UC1, map_info.data + GST_VIDEO_INFO_PLANE_OFFSET(&info, 0), step);
|
||||
src.copyTo(dst);
|
||||
return true;
|
||||
}
|
||||
else if (format == "BGRA" || format == "RGBA" || format == "BGRX" || format == "RGBX")
|
||||
{
|
||||
CV_CheckEQ((int)n_planes, 1, "");
|
||||
size_t step = GST_VIDEO_INFO_PLANE_STRIDE(&info, 0);
|
||||
CV_CheckGE(step, (size_t)frame_width, "");
|
||||
Mat src(sz, CV_8UC4, map_info.data + GST_VIDEO_INFO_PLANE_OFFSET(&info, 0), step);
|
||||
src.copyTo(dst);
|
||||
return true;
|
||||
}
|
||||
else if (format == "UYVY" || format == "YUY2" || format == "YVYU")
|
||||
{
|
||||
CV_CheckEQ((int)n_planes, 1, "");
|
||||
@ -1008,7 +1027,7 @@ bool GStreamerCapture::open(const String &filename_, const cv::VideoCaptureParam
|
||||
sink_pad.attach(gst_element_get_static_pad(sink, "sink"));
|
||||
peer_caps.attach(gst_pad_peer_query_caps(sink_pad, NULL));
|
||||
if (!gst_caps_can_intersect(caps, peer_caps)) {
|
||||
caps.attach(gst_caps_from_string("video/x-raw, format=(string){UYVY,YUY2,YVYU,NV12,NV21,YV12,I420}"));
|
||||
caps.attach(gst_caps_from_string("video/x-raw, format=(string){UYVY,YUY2,YVYU,NV12,NV21,YV12,I420,BGRA,RGBA,BGRx,RGBx,GRAY16_LE,GRAY16_BE}"));
|
||||
CV_Assert(caps);
|
||||
}
|
||||
}
|
||||
|
||||
@ -35,6 +35,10 @@ TEST_P(videoio_gstreamer, read_check)
|
||||
|
||||
cvtColor(decode_frame, rgb_frame, convertToRGB);
|
||||
cvtColor(rgb_frame, gray_frame, COLOR_RGB2GRAY);
|
||||
if (gray_frame.depth() == CV_16U)
|
||||
{
|
||||
gray_frame.convertTo(gray_frame, CV_8U, 255.0/65535);
|
||||
}
|
||||
|
||||
vector<Vec3f> circles;
|
||||
HoughCircles(gray_frame, circles, HOUGH_GRADIENT, 1, gray_frame.rows/16, 100, 30, 1, 30 );
|
||||
@ -58,6 +62,10 @@ TEST_P(videoio_gstreamer, read_check)
|
||||
|
||||
static const Param test_data[] = {
|
||||
make_tuple("video/x-raw, format=BGR" , Size(640, 480), Size(640, 480), COLOR_BGR2RGB),
|
||||
make_tuple("video/x-raw, format=BGRA" , Size(640, 480), Size(640, 480), COLOR_BGRA2RGB),
|
||||
make_tuple("video/x-raw, format=RGBA" , Size(640, 480), Size(640, 480), COLOR_RGBA2RGB),
|
||||
make_tuple("video/x-raw, format=BGRx" , Size(640, 480), Size(640, 480), COLOR_BGRA2RGB),
|
||||
make_tuple("video/x-raw, format=RGBx" , Size(640, 480), Size(640, 480), COLOR_RGBA2RGB),
|
||||
make_tuple("video/x-raw, format=GRAY8", Size(640, 480), Size(640, 480), COLOR_GRAY2RGB),
|
||||
make_tuple("video/x-raw, format=UYVY" , Size(640, 480), Size(640, 480), COLOR_YUV2RGB_UYVY),
|
||||
make_tuple("video/x-raw, format=YUY2" , Size(640, 480), Size(640, 480), COLOR_YUV2RGB_YUY2),
|
||||
@ -76,6 +84,10 @@ static const Param test_data[] = {
|
||||
make_tuple("video/x-raw, format=NV21" , Size(322, 242), Size(322, 363), COLOR_YUV2RGB_NV21),
|
||||
make_tuple("video/x-raw, format=YV12" , Size(322, 242), Size(322, 363), COLOR_YUV2RGB_YV12),
|
||||
make_tuple("video/x-raw, format=I420" , Size(322, 242), Size(322, 363), COLOR_YUV2RGB_I420),
|
||||
|
||||
// 16 bit
|
||||
make_tuple("video/x-raw, format=GRAY16_LE", Size(640, 480), Size(640, 480), COLOR_GRAY2RGB),
|
||||
make_tuple("video/x-raw, format=GRAY16_BE", Size(640, 480), Size(640, 480), COLOR_GRAY2RGB),
|
||||
};
|
||||
|
||||
INSTANTIATE_TEST_CASE_P(videoio, videoio_gstreamer, testing::ValuesIn(test_data));
|
||||
|
||||
Loading…
Reference in New Issue
Block a user