C++?結合?opencv讀取圖片與視頻的方法
更新時間:2023年06月28日 10:02:04 作者:小啊磊_Vv
這篇文章主要介紹了C++?結合?opencv讀取圖片與視頻,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
一、安裝opencv
- 操作系統(tǒng): Linux(采用遠程服務器主機進行代碼編寫)
- 需提前配置(安裝)cmake
- 遠程連接服務器進行操作, 直接新建立的終端輸入
sudo apt install libopencv-dev
二 、配置文件準備
2.1 新建立文件夾
- 建立一個新的文件夾,并在文件夾下面建立如下面的子文件夾
- 其中CMakeLists.txt是txt形式的文件
- .vscode里面放的是配置文件
- media放的圖片和視頻
- output 是輸出的文件夾路徑
- src 放的是源代碼cpp文件
2.2 .vscode文件下配置文件
(1)配置tasks.json文件
{ "version": "2.0.0", "tasks": [ // 1.cmake 配置 { "type": "cppbuild", "label": "cmake配置", "command": "cmake", // cmake命令 "args": [ "-S .", // 源碼目錄 "-B build", // 編譯目錄 "-DCMAKE_BUILD_TYPE=Debug" // 編譯類型 ], "options": { "cwd": "${workspaceFolder}" // 工作目錄 }, "problemMatcher": [ "$gcc" ], "group": "build", }, // 2.cmake 編譯 { "type": "cppbuild", "label": "CMake編譯", "command": "cmake", // cmake命令 "args": [ "--build", // 編譯 "build", // 編譯目錄 ], "options": { "cwd": "${workspaceFolder}" // 工作目錄 }, "problemMatcher": [ "$gcc" ], "group": "build", "dependsOn": [ "CMake配置" // 依賴CMake配置,先執(zhí)行CMake配置 ] }, // 3.刪除build目錄 { "type": "shell", "label": "刪除build目錄", "command": "rm -rf build", "options": { "cwd": "${workspaceFolder}" // 工作目錄 }, "problemMatcher": [ "$gcc" ], "group": "build", }, // 4.運行可執(zhí)行文件 { "label": "運行可執(zhí)行文件", "type": "shell", "command": "./build/demo_${fileBasenameNoExtension}", "problemMatcher": [], "group": { "kind": "build", "isDefault": true }, "options": { "cwd": "${workspaceFolder}" }, "dependsOn": [ "cmake構建" ] } ] }
(1)配置launch.json
{ // 使用 IntelliSense 了解相關屬性。 // 懸停以查看現(xiàn)有屬性的描述。 // 欲了解更多信息,請訪問: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "name": "C++ Cmake Debug", "type": "cppdbg", "request": "launch", "program": "${workspaceFolder}/build/demo_${fileBasenameNoExtension}", // 編譯后的程序,需要結合CMakeLists.txt中的add_executable()函數(shù) "args": [], "stopAtEntry": false, "cwd": "${workspaceFolder}", "environment": [], "externalConsole": false, "MIMode": "gdb", "miDebuggerPath": "/usr/bin/gdb", "setupCommands": [ { "description": "Enable pretty-printing for gdb", "text": "-enable-pretty-printing", "ignoreFailures": true } ], "preLaunchTask": "CMake編譯" } ] }
三 、src文件下代碼編寫
3.1 圖片的讀取和顯示(代碼文件:1.img.cpp)
- 在導入 #include"opencv2/opencv.hpp" 會出現(xiàn)錯誤, 鼠標點擊頭文件并按住ctrl鍵,界面會出現(xiàn)配置,添加配置即可, 配置文件自動生成放在.vscode文件下。
- 由于是遠程服務器主機, 所以無法顯示圖片,只能另存為。
// 圖片的讀取和顯示 // 導入 opencv 頭文件 #include"opencv2/opencv.hpp" #include<iostream> int main(int argc, char** argv) { // 讀取圖片 // 讀取的數(shù)據保存在 Mat 類型的變量 image 中, Mat是 opencv 中的圖像數(shù)據結構,類似 numpy 中的 ndarray cv :: Mat image = cv :: imread("./media/cat.jpg"); // 判斷圖片是否讀取成功, 讀取不成功, 運行 if 語句直接退出主函數(shù) if(image.empty()) { std :: cout << "Could not read the image: " << std :: endl; return 1; } // 打印圖片寬度和高度 std :: cout << "圖片高度: " << image.rows << "圖片寬度: " << image.cols << std :: endl; // 打印圖片數(shù)據 // 以 numpy 的方式打印 std :: cout << "圖片的 data: " << cv :: format(image, cv :: Formatter :: FMT_NUMPY) << std :: endl; // 以 python list 格式輸出 std :: cout << "圖片的 data: " << cv :: format(image, cv :: Formatter :: FMT_PYTHON) << std :: endl; // 創(chuàng)建一個gray 圖 cv :: Mat gray; // 創(chuàng)建一個 hsv 圖 cv :: Mat hsv; // 創(chuàng)建一個 rgb 圖 cv :: Mat rgb; // BGR --> Gray cv :: cvtColor(image, gray, cv :: COLOR_BGR2GRAY); // BGR --> HSV cv :: cvtColor(image, hsv, cv :: COLOR_BGR2HSV); // BGR --> RGB cv :: cvtColor(image, rgb, cv :: COLOR_BGR2RGB); // 保存 gray 圖: 格式: (文件路徑, Mat 矩陣變量) cv :: imwrite("./output/gray.jpg", gray); // 顯示圖片 // cv :: imshow("圖片", image); // 等待按鍵 // cv :: waitKey(0); // 顯示多張圖片, 同時出現(xiàn)在兩個窗口 // cv :: imshow("原圖", image); // cv :: imshow("灰度圖", gray); // cv :: waitKey(0); return 0; }
3.2 視頻流的讀?。ùa文件:2.video.cpp)
// opencv 讀取視頻流 #include"opencv2/opencv.hpp" #include<iostream> #include<gflags/gflags.h> // 導入 gflags 庫 int main(int argc, char **argv) { // 解析命令行參數(shù) gflags :: ParseCommandLineFlags(&argc, &argv, true); // 創(chuàng)建一個 VideoCapture 對象, 參數(shù)為視頻路徑 cv :: VideoCapture capture("./media/dog.mp4"); // 判斷視頻是否讀取成功, 返回 True 表示成功 if(!capture.isOpened()) { std :: cout << "無法讀取視頻" << std :: endl; return 1; } // 讀取視頻幀, 使用 Mat 類型的 frame 存儲返回的幀 cv :: Mat frame; // 定義灰度圖 cv :: Mat gray; // 循環(huán)讀取視頻 while(true) { // 讀取視頻幀, 使用 >> 運算符 或者 read()函數(shù), 他的參數(shù)是返回的幀 capture.read(frame); // capture >> frame; // 判斷是否讀取成功 if(frame.empty()) { std :: cout << "文件讀取完畢: " << std :: endl; break; } // 將視頻的幀轉為灰度圖 cv :: cvtColor(frame, gray, cv :: COLOR_BGR2GRAY); // 顯示視頻幀 cv :: imshow("raw demo", frame); cv :: imshow("gray demo", gray); // 等待按鍵, 延遲 30ms, 否則視頻播放太快 int k = cv :: waitKey(30); // 按下Esc鍵退出 if(k == 27) { std :: cout << "退出" << std :: endl; break; } } return 0; }
3.3 視頻流的讀取并保存(代碼文件:3.write.cpp)
// opencv 讀取視頻流 #include"opencv2/opencv.hpp" #include<iostream> #include<gflags/gflags.h> // 導入 gflags 庫 int main(int argc, char **argv) { // 解析命令行參數(shù) gflags :: ParseCommandLineFlags(&argc, &argv, true); // 創(chuàng)建一個 VideoCapture 對象, 參數(shù)為視頻路徑 cv :: VideoCapture capture("./media/dog.mp4"); // 判斷視頻是否讀取成功, 返回 True 表示成功 if(!capture.isOpened()) { std :: cout << "無法讀取視頻" << std :: endl; return 1; } int frame_width = capture.get(cv :: CAP_PROP_FRAME_WIDTH); int frame_height = capture.get(cv :: CAP_PROP_FRAME_HEIGHT); double fps = capture.get(cv :: CAP_PROP_FPS); std :: cout << "圖像寬度: " << frame_width << std :: endl; std :: cout << "圖像高度: " << frame_height << std :: endl; std :: cout << "圖像幀率: " << fps << std :: endl; // 讀取視頻幀, 使用 Mat 類型的 frame 存儲返回的幀 cv :: Mat frame; // 定義灰度圖 cv :: Mat gray; //寫入MP4文件,參數(shù)分別是:文件名,編碼格式,幀率,幀大小 cv::VideoWriter writer("./output/record.avi", cv::VideoWriter::fourcc('M', 'J', 'P', 'G'), fps, cv::Size(frame_width, frame_height)); // 循環(huán)讀取視頻 while(true) { // 讀取視頻幀, 使用 >> 運算符 或者 read()函數(shù), 他的參數(shù)是返回的幀 capture.read(frame); // capture >> frame; // 判斷是否讀取成功 if(frame.empty()) { std :: cout << "文件讀取完畢: " << std :: endl; break; } // std :: cout << "圖片高度: " << frame.rows << "圖片寬度: " << frame.cols << std :: endl; // 將視頻的幀轉為灰度圖 cv :: cvtColor(frame, gray, cv :: COLOR_BGR2GRAY); // 將 gray 寫入 writer.write(frame); } return 0; }
四、cmake配置
在CMakeLists.txt文件中進行配置
# 最低版本要求 cmake_minimum_required(VERSION 3.10) # 項目信息 project(opencv_demo) # 使用find_package命令查找OpenCV庫 find_package(OpenCV REQUIRED) find_package(gflags REQUIRED) if (OpenCV_FOUND) message(STATUS "OpenCV library status:") message(STATUS " version: ${OpenCV_VERSION}") message(STATUS " libraries: ${OpenCV_LIBS}") message(STATUS " include path: ${OpenCV_INCLUDE_DIRS}") else() message(FATAL_ERROR "Could not find OpenCV library") endif() # 添加頭文件 include_directories(${OpenCV_INCLUDE_DIRS} ${gflags_INCLUDE_DIRS}) # 鏈接庫 link_libraries(${OpenCV_LIBS} ${gflags_LIBRARIES}) # 添加可執(zhí)行文件 add_executable(demo_1.img src/1.img.cpp) add_executable(demo_2.video src/2.video.cpp) add_executable(demo_3.write src/3.write.cpp)
五、運行
運行1.img.cpp,終端選項 – 運行任務
會出現(xiàn)下列界面, 依次點擊 刪除 build目錄表,在選擇終端 – 運行任務 – cmake 配置,結束后,在點擊終端 – 運行任務 – CMake 編譯
上述過程結束后,就會正常運行與輸出1.img.cpp
輸出后結果如圖所示, 主要看 output 文件夾,可能和我下面不一樣,因為我又在寫其他的代碼
到此這篇關于C++ 結合 opencv讀取圖片與視頻的文章就介紹到這了,更多相關C++ 讀取圖片與視頻內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
聊聊Qt+OpenCV聯(lián)合開發(fā)之圖像的創(chuàng)建與賦值問題
這篇文章主要介紹了Qt+OpenCV聯(lián)合開發(fā)之圖像的創(chuàng)建與賦值問題,給大家介紹了圖像的克隆及拷貝問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-01-01使用VS Code的開發(fā)環(huán)境配置教程圖文詳解
這篇文章主要介紹了使用VS Code的開發(fā)環(huán)境配置教程,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-05-05VS2019調試C語言程序(監(jiān)視操作)的詳細步驟
在很多時候我們在寫程序的過程中會發(fā)現(xiàn)一些非編程錯誤的問題,這樣的問題很難直接分辨出來,但是我們可以用調試了一步一步的模擬程序運行的過程,來找出程序的錯誤,下面這篇文章主要給大家介紹了關于VS2019調試C語言程序(監(jiān)視操作)的詳細步驟,需要的朋友可以參考下2022-11-11