目录
- 关于自带opencv
- 第一步:实现简单rtsp拉流
- 1.1. 代码
- 1.2. 编译
- 第二步:多线程rtsp拉流
- 1.2. 编译
关于自带opencv
jetson nano用镜像烧录时,已经预装了opencv,通过如下命令获得版本
opencv_version
我的是4.1.1。我们直接使用即可。
第一步:实现简单rtsp拉流
1.1. 代码
创建项目文件夹test_rtsp,在文件夹中分别创建test_rtsp.cpp和CMakeLists.txt,内容分别如下:
- test_rtsp.cpp
#include<iostream>
#include "opencv2/opencv.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
using namespace std;
int main()
{
cv::VideoCapture capture;
capture.open("rtsp://账户:密码@IP地址");
for(;;)
{
cv::Mat frame;
capture >> frame;
if (frame.empty())
{
continue;
}
cv::imshow("test", frame);
cv::waitKey(30);
}
}
这里的rtsp地址,需要根据你自己的摄像头ip地址进行改变,如果不熟悉,可以百度 opencv rtsp拉流 相关文档学习。
- CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
project(DisplayRTSP)
find_package(OpenCV REQUIRED)
add_executable(test_rtsp test_rtsp.cpp)
target_link_libraries(test_rtsp ${OpenCV_LIBS})
message(${OpenCV_DIR})
1.2. 编译
在项目文件夹test_rtsp中创建文件夹build,进入build文件夹,分别输入
cmake ..
make
这样,在build文件夹中,会生成test_rtsp可执行文件,如图
然后输入
./test_rtsp
运行该可执行文件即可。
第二步:多线程rtsp拉流
参考博客:《OpenCV视频流的C++多线程处理方式》
整体思路为:
注意:为了较为让程序较为稳定运行,对显示窗口分配线程,即,在创建窗口后,使用命令 cv::startWindowThread()。
创建项目文件夹test_rtsp,在文件夹中分别创建test_rtsp.cpp和CMakeLists.txt,内容分别如下:
- test_rtsp.cpp
// video_test.cpp
#include <iostream>
#include <thread>
#include <mutex>
#include <atomic>
#include <opencv2/core/core.hpp>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
static std::mutex mutex;
static std::atomic_bool isOpen;
static void cameraThreadFunc(cv::Mat* pFrame)
{
//rtsp拉流地址为:“rtsp://账号:密码@ip地址”
cv::VideoCapture capture("rtsp://用户名:密码@地址");
if (!capture.isOpened()) {
isOpen = false;
std::cout << "Failed to open camera " << std::endl;
}
cv::Mat frame;
while (isOpen) {
capture >> frame;
if (mutex.try_lock()) {
frame.copyTo(*pFrame);
mutex.unlock();
}
cv::waitKey(5);
}
capture.release();
}
int main(int argc, char* argv[])
{
isOpen = true;
cv::Mat frame, gray;
std::thread thread(cameraThreadFunc, &frame);
// 视频窗口设置
cv::namedWindow("video", cv::WINDOW_NORMAL);
//给窗口显示设置线程
cv::startWindowThread();
while (isOpen) {
if (frame.empty()){
std::cout << "frame is empty!" << std::endl;
continue;
}
mutex.lock();
frame.copyTo(gray);
mutex.unlock();
if (gray.empty()) {
break;
}
//cv::cvtColor(frame, gray, cv::COLOR_BGR2GRAY);
//cv::blur(gray, gray, cv::Size(3, 3));
//cv::Canny(gray, gray, 5 , 38 , 3);
cv::waitKey(100);
cv::imshow("video", gray);
if (cv::waitKey(1) == 'q') {
break;
}
}
cv::destroyAllWindows();
isOpen = false;
thread.join();
return 0;
}
这里的rtsp地址,需要根据你自己的摄像头ip地址进行改变,如果不熟悉,可以百度 opencv rtsp拉流 相关文档学习。
- CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
project(DisplayRTSP)
find_package(OpenCV REQUIRED)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread")
add_executable(test_rtsp test_rtsp.cpp)
target_link_libraries(test_rtsp ${OpenCV_LIBS})
message(${OpenCV_DIR})
1.2. 编译
在项目文件夹test_rtsp中创建文件夹build,进入build文件夹,分别输入
cmake ..
make
这样,在build文件夹中,会生成test_rtsp可执行文件,如图
然后输入
./test_rtsp
运行该可执行文件即可。