Я использую gstreamer для доступа к изображениям с веб-камеры. Я использую appsrc, чтобы получить доступ к этим изображениям, и затем я хочу иметь возможность обрабатывать их с openCv. Итак, сначала мне нужно загрузить их в объект Mat. Однако я могу сделать это только в оттенках серого. Если я пытаюсь прочитать несколько каналов, я получаю исключение «нарушение прав чтения».
Код, который я использую для создания мата, выглядит следующим образом:
GstSample* sample;
GstBuffer* buffer;
GstMapInfo map;
g_signal_emit_by_name(sink, "pull-sample", &sample);
g_print("Check frame");
if (sample != NULL) {
buffer = gst_sample_get_buffer(sample);
if (gst_buffer_map(buffer, &map, GST_MAP_READ))
{
Mat frame(Size(width, height), CV_8UC3, map.data, cv::Mat::AUTO_STEP);
imwrite("elephant.jpg", frame);
}
g_print("Found frame");
return GST_FLOW_OK;
}
return GST_FLOW_ERROR;
Когда я раньше использовал файл-приемник для записи в файл, изображения были цветными.
Я использую следующие фильтры в моем коде:
filtercaps = gst_caps_new_simple("image/jpeg", "format", G_TYPE_STRING, "RGB", "width", G_TYPE_INT, width,
"height", G_TYPE_INT,
height, "framerate", GST_TYPE_FRACTION, 30,
1, NULL);
Я пытался установить этот фильтр сразу после источника и непосредственно перед приемником, но ни одна из них не решила проблему. У меня также есть JPEG-декодер в моем конвейере.
Я действительно понятия не имею, как это исправить. Любая помощь или советы с благодарностью!