Не удалось открыть конвейер gstreamer с помощью opencv VideoCapture на Jetson TK1

Я написал программу, которая считывает кадры из конвейера gstreamer, обрабатывает их с помощью библиотек opencv и затем записывает обратно в конвейер gstreamer.

Фрагмент кода:

cv::VideoCapture cap("v4l2src ! video/x-raw, framerate=30/1, width=640, height=480, format=RGB ! videoconvert ! appsink");
if (!cap.isOpened()) {
    printf("=ERR= can't create video capture\n");
    return -1;
}

cv::VideoWriter writer;
writer.open("appsrc ! videoconvert ! x264enc noise-reduction=10000 tune=zerolatency byte-stream=true threads=4 key-int-max=15 ! mpegtsmux ! udpsink host=localhost port=9999"
            , 0, (double)15, cv::Size(640, 480), true);
if (!writer.isOpened()) {
    printf("=ERR= can't create video writer\n");
    return -1;
}

/* Read/write frames as usual */
// Mat frame
// while true
//     cap >> frame
//     process the frame
//     writer << frame

Программа отлично работает на моей 64-битной виртуальной машине Ubuntu 14.04. Однако, когда я пытаюсь запустить его на Jetson TK1, VideoCapture и VideoWriter всегда возвращают false на isOpened().

Я использовал Opencv4Tegra, затем собрал opencv из исходников и установил его. У обоих была одна и та же проблема. Кто-нибудь знает, почему VideoCapture не может открыть конвейер gstreamer на Jetson TK1? Это потому, что он не работает на 32-битных машинах?

Обратите внимание, что я использую Opencv 2.4.13 и Gstreamer 1.2 и камеру Logitech C310.


person j0e1in    schedule 19.06.2016    source источник
comment
мое личное мнение таково, что appsin/appsrc заблокированы либо для пустого буфера, либо для полного буфера. Наличие appsrc и appsink обычно очень сложно — у вас есть логика обработки в том же потоке, в котором живут конвейеры (это основной поток?)? попробуйте добавить очереди, а затем попробуйте добавить параметр max-bytes (учтите, что это может съесть всю оперативную память!) .. также очень важна отладка - научитесь отлаживать gstreamer (подсказка GST_DEBUG) - gl   -  person nayana    schedule 20.06.2016
comment
@otopolsky Спасибо за ваш ответ. Я не думал, что добавление queue и max-bytes в конвейер поможет. (Я пытался, но все равно.) Поскольку при создании объекта захвата происходит сбой (он не открывается), он не запускает конвейер gstreamer. Я думаю, что это проблема между opencv и gstreamer, но не в конвейере. И поскольку он не запускает конвейер, я не могу отладить его с помощью GST_DEBUG. Попробую запустить программу на другой 32-битной машине.   -  person j0e1in    schedule 29.06.2016
comment
Он выдал ту же ошибку, когда я попытался выполнить его на 32-битной виртуальной машине Ubuntu 14.04. Так что я почти уверен, что это проблема с 32-битным opencv, который не может открыть конвейер gstreamer, используя VideoCapture или VideoWriter.   -  person j0e1in    schedule 30.06.2016
comment
Может быть, это потому, что 64-битная машина более мощная и не будет так сильно загружать буферы. Я думаю, что то же самое, что ваш дизайн appsrc + appsink блокирует сам себя. машина..   -  person nayana    schedule 30.06.2016
comment
также это может быть проблема с связыванием ... может быть, библиотеки gstreamer или opencv не найдены или что-то еще ... вы должны проверить все это самостоятельно;)   -  person nayana    schedule 30.06.2016