获取图像(Linux)
1、使用OpenCV获取RTSP视频流示例:
使用JETSON NX获取RTSP视频(硬件解码):
环境需求:
- AllSpark Ⅰ NX
- OpenCV (需要和gstreamer一起编译过的)
- Gstreamer
- C++ 环境
rtsp_capture.cpp
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/imgproc.hpp>
int main()
{
std::string pipline_str = "rtspsrc location=rtsp://192.168.2.64:/H264?W=1920&H=1080&FPS=30&BR=4900000 latency=100 !\
application/x-rtp,media=video ! rtph264depay ! parsebin ! nvv4l2decoder enable-max-performancegst=1 ! \
nvvidconv ! video/x-raw, width=(int)1280, height=(int)720, format=(string)BGRx ! videoconvert !\
appsink sync=false";
cv::VideoCapture capture;
cv::Mat frame;
capture.open(pipline_str);
if (!capture.isOpened())
{
std::cout << "Can not open web camera !" << std::endl;
return -1;
}
while (1)
{
capture.read(frame);
if (frame.empty())
{
break;
}
cv::imshow("video", frame);
cv::waitKey(20);
}
capture.release();
return 0;
}
CMakeLists.txt
cmake_minimum_required(VERSION 2.6)
project(rtsp_capture)
find_package(OpenCV REQUIRED)
add_definitions(-std=c++11)
include_directories(
${OpenCV_INCLUDE_DIRS}
)
add_executable(rtsp_capture src/rtsp_capture.cpp)
target_link_libraries(rtsp_capture ${OpenCV_LIBS})
获取720P视频流:
std::string pipline_str="rtsp://192.168.2.64:554/H264?W=1280&H=720&BR=10000000&FPS=30";
获取1080P视频流:
std::string pipline_str="rtsp://192.168.2.64:554/H264?W=1920&H=1080&BR=10000000&FPS=30"
获取2.7K视频流:
std::string pipline_str="rtsp://192.168.2.64:554/H264?W=2704&H=1520&BR=10000000&FPS=30"
获取低于720P视频:
- 修改
nvvidconv ! video/x-raw, width=(int)640, height=(int)360, format=(string)BGRx
std::string pipline_str = "rtspsrc location=rtsp://192.168.2.64:/H264?W=1920&H=1080&FPS=30&BR=4900000 latency=100 \
caps='application/x-rtp,media=(string)video,clock-rate=(int)90000,encoding-name=\
(string)H264,width=1920,height=1080,framerate=30/1' !\
rtph264depay ! h264parse ! omxh264dec ! nvvidconv ! \
video/x-raw, width=(int)640, height=(int)360, format=(string)BGRx ! \
videoconvert ! appsink sync=false";
其他平台(软件解码)
rtsp_capture.cpp
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/imgproc.hpp>
int main()
{
std::string pipline_str = "rtsp://192.168.2.64:/H264?W=1920&H=1080&FPS=30&BR=4900000";
cv::VideoCapture capture;
cv::Mat frame;
capture.open(pipline_str);
if (!capture.isOpened())
{
std::cout << "Can not open web camera !" << std::endl;
return -1;
}
while (1)
{
capture.read(frame);
if (frame.empty())
{
break;
}
cv::imshow("video", frame);
cv::waitKey(20);
}
capture.release();
return 0;
}
CMakeLists.txt
cmake_minimum_required(VERSION 2.6)
project(rtsp_capture)
find_package(OpenCV REQUIRED)
add_definitions(-std=c++11)
include_directories(
${OpenCV_INCLUDE_DIRS}
)
add_executable(rtsp_capture src/rtsp_capture.cpp)
target_link_libraries(rtsp_capture ${OpenCV_LIBS})
2、获取图像常见问题:
吊舱无法获取图像?
- 是否能够PING通吊舱?能打开说明网络通讯正常
- 使用AmovGimbalStudio是否能够打开视频流?能打开则说明Gstreamer环境正常
- OpenCV是否能够打开视频流?不能打开则说明OpenCV编译的时候并未勾选with gstreamer选项,建议重新编译OpenCV即可
为啥我在Jetson平台上的延迟比较高?
- 可能是并未启动Jetson的硬件解码器NVENC
- 通过输入 jtop 命令,观察NVENC是否被调用
- 如果显示为OFF,则需要使用上面比较长的pipline_str
DEMO与自己代码一起运行时图像延迟特别高?
- 我们已经使用了硬件解码,但是把这个代码与自己的代码放在一起用的使用会有很大的延迟
- 建议给获取吊舱图像功能开一个线程,使用多线程解决