Я написал программу, которая считывает кадры из конвейера 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.
queue
иmax-bytes
в конвейер поможет. (Я пытался, но все равно.) Поскольку при создании объекта захвата происходит сбой (он не открывается), он не запускает конвейер gstreamer. Я думаю, что это проблема между opencv и gstreamer, но не в конвейере. И поскольку он не запускает конвейер, я не могу отладить его с помощью GST_DEBUG. Попробую запустить программу на другой 32-битной машине. - person j0e1in   schedule 29.06.2016VideoCapture
илиVideoWriter
. - person j0e1in   schedule 30.06.2016