opencv(c++)讀取rtsp視頻流並保存幀爲jpg圖片 1.linux下配置opencv開發環境 2.讀取視頻流並保存圖片

本想簡單寫個demo程序,讀取攝像頭的rtsp視頻流,將最新幀保存爲jpg圖片傳給AI程序進行識別,結果網上針對linux下c++版讀取視頻流保存圖片的資料,凌亂且各種錯誤。現將踩坑後成功執行的流程和代碼整理出來,供有需之人蔘考。

1.linux下配置opencv開發環境

  1. 安裝必要的庫
    [compiler] sudo apt-get install build-essential
    [required] sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
    [optional] sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
  2. 下載opencv源碼
    https://opencv.org/,這裏下載最新的opencv-4.2.0.zip。
  3. 編譯源碼,並安裝
    解壓後進入opencv-4.2.0目錄,mkdir build,進入build目錄,然後執行
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..

make # 開始編譯,等待編譯完成

sudo make install # 安裝

2.讀取視頻流並保存圖片

編寫demo文件,包含opencv_demo.cpp、CMakeLists.txt兩個文件。
1. CMakeLists.txt內容

cmake_minimum_required(VERSION 2.8)
add_definitions(-std=c++11)
project(demo)
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
add_executable(demo opencv_demo.cpp)
target_link_libraries(demo ${OpenCV_LIBS})

2. opencv_demo.cpp

#include <string>
#include <iostream>
#include <time.h>
#include <opencv2/highgui/highgui.hpp>

using namespace std;
using namespace cv;

void Video_to_Image(Mat& frame);

int main()
{
    //string filename = "Wildlife.wmv";
    string filename = "rtsp://admin:[email protected]/ch1/stream1";
    Mat frame;
    VideoCapture cap;
    cap.open(filename);
    if (!cap.isOpened()) {
        cerr << "ERROR! Unable to open camera\n";
        return -1;
    }

    //--- GRAB AND WRITE LOOP
    cout << "Start grabbing" << endl
        << "Press any key to terminate" << endl;
    time_t start_time = time(NULL);
    for (;;)
    {
        // wait for a new frame from camera and store it into 'frame'
        cap.read(frame);
        // check if we succeeded
        if (frame.empty()) {
            cerr << "ERROR! blank frame grabbed\n";
            break;
        }
        // show live and wait for a key with timeout long enough to show images
        imshow("Live", frame);

        // 每隔2s保存圖片
        time_t end_time = time(NULL);
        if ((end_time - start_time) >=2)
        {
            cout << "2s capture" << endl;
            Video_to_Image(frame);
            start_time = time(NULL);
        }

        if (waitKey(5) >= 0)
            break;
    }
    cap.release();

    return 0;
}

void Video_to_Image(Mat& frame)
{

    char image_name[PATH_MAX];
    sprintf(image_name, "%s%s", "test_image", ".jpg");
    imwrite(image_name, frame);

}

3. 編譯執行

cmake .
make
./demo
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章