获取图像(Linux)

1、使用OpenCV获取RTSP视频流示例:

使用JETSON NX获取RTSP视频(硬件解码):

环境需求:

  1. AllSpark Ⅰ NX
  2. OpenCV (需要和gstreamer一起编译过的)
  3. Gstreamer
  4. 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、获取图像常见问题:

吊舱无法获取图像?

  1. 是否能够PING通吊舱?能打开说明网络通讯正常
  2. 使用AmovGimbalStudio是否能够打开视频流?能打开则说明Gstreamer环境正常
  3. OpenCV是否能够打开视频流?不能打开则说明OpenCV编译的时候并未勾选with gstreamer选项,建议重新编译OpenCV即可

为啥我在Jetson平台上的延迟比较高?

  1. 可能是并未启动Jetson的硬件解码器NVENC
  2. 通过输入 jtop 命令,观察NVENC是否被调用
  3. 如果显示为OFF,则需要使用上面比较长的pipline_str

DEMO与自己代码一起运行时图像延迟特别高?

  1. 我们已经使用了硬件解码,但是把这个代码与自己的代码放在一起用的使用会有很大的延迟
  2. 建议给获取吊舱图像功能开一个线程,使用多线程解决