我正计划从OpenCV中为视频文件流/实时rtsp流进行VideoCapture。但是,在我的程序中使用VideoCapture时会有很多延迟,因此我决定改用gstreamer管道。例如,我曾经
VideoCapture capVideo("filesrc location=CarsDriving.mp4 ! qtdemux ! h264parse ! nvv4l2decoder ! nvvidconv ! video/x-raw, format=BGRx ! videoconvert ! video/x-raw, format=BGR ! appsink ", CAP_GSTREAMER);
我的程序可以运行,但是如果我要执行类似的操作capVideo.get(CAP_PROP_FRAME_COUNT)
它总是返回-1,因为GStreamer有此警告[WARN:0]全局/home/nvidia/Downloads/opencv-4.4.0/source/modules/videoio/src/cap_gstreamer.cpp(898)打开OpenCV | GStreamer警告:无法查询流的持续时间
[WARN:0]全局/home/nvidia/Downloads/opencv-4.4.0/source/modules/videoio/src/cap_gstreamer.cpp(935)打开OpenCV | GStreamer警告:无法查询视频位置:status = 1,value = 1,duration = -1
如果我将gstreamer用于视频管道,如何在opencv中获取帧数?我需要异常(exception)的帧数和视频处理技术。
最佳答案
这是一个错误,@alekhin提到了here和here。还提到了如何解决。更改后,您应该重建opencv。
您也说过:
However, the VideoCapture has alot of latency when used in my program so i decided to use the gstreamer pipeline instead.
rtsp摄像机通常将流作为
h264/h265
编码数据。如果您尝试通过CPU而不是GPU解码数据,那么速度不会有太大提高。为什么不选择CAP_FFMPEG
标志而不是CAP_GSTREAMER
? CAP_FFMPEG
将比CAP_GSTREAMER
更快
关于c++ - GStreamer + OpenCV视频处理问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63684485/