GstBuffer *gstImageBuffer = gst_app_sink_pull_buffer((GstAppSink*)app_data.gst_data.sink);
Mat matLeft = Mat(Size(width, height),CV_8U, (char*)GST_BUFFER_DATA(gstImageBuffer));

我可以拉缓冲区并转换为OpenCv Mat对象,但是使用灰度。我想用彩色拉缓冲。我知道我的流是彩色的,在终端中创建了相同的管道。我一直在寻找没有成功的解决方案。我正在使用gstreamer-0.10和opencv-2.4.10。

最佳答案

最后,借助Changing cv::Mat with image copied from buffer affects original image这个帖子,我可以将缓冲区拉成彩色。现在缓冲区的大小有意义,即640 * 360 * 3。

我必须以不同的方式将appsink与ffmpegcolorspace元素链接:

gst_element_link_filtered(data->gst_data.converter, data->gst_data.sink, gst_caps_new_simple("video/x-raw-rgb", NULL))

然后在拉缓冲区时:
gstImageBuffer = gst_app_sink_pull_buffer((GstAppSink*)app_data.gst_data.sink);
matLeft = Mat(Size(width, height), CV_8UC3, (char*)GST_BUFFER_DATA(gstImageBuffer));
cvtColor(matLeft, matLeft, CV_RGB2BGR);

09-25 18:44