C++?結(jié)合?opencv讀取圖片與視頻的方法
一、安裝opencv
- 操作系統(tǒng): Linux(采用遠(yuǎn)程服務(wù)器主機(jī)進(jìn)行代碼編寫)
- 需提前配置(安裝)cmake
- 遠(yuǎn)程連接服務(wù)器進(jìn)行操作, 直接新建立的終端輸入
sudo apt install libopencv-dev
二 、配置文件準(zhǔn)備
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.運(yùn)行可執(zhí)行文件 { "label": "運(yùn)行可執(zhí)行文件", "type": "shell", "command": "./build/demo_${fileBasenameNoExtension}", "problemMatcher": [], "group": { "kind": "build", "isDefault": true }, "options": { "cwd": "${workspaceFolder}" }, "dependsOn": [ "cmake構(gòu)建" ] } ] }
(1)配置launch.json
{ // 使用 IntelliSense 了解相關(guān)屬性。 // 懸停以查看現(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}", // 編譯后的程序,需要結(jié)合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)
- 在導(dǎo)入 #include"opencv2/opencv.hpp" 會出現(xiàn)錯誤, 鼠標(biāo)點(diǎn)擊頭文件并按住ctrl鍵,界面會出現(xiàn)配置,添加配置即可, 配置文件自動生成放在.vscode文件下。
- 由于是遠(yuǎn)程服務(wù)器主機(jī), 所以無法顯示圖片,只能另存為。
// 圖片的讀取和顯示 // 導(dǎo)入 opencv 頭文件 #include"opencv2/opencv.hpp" #include<iostream> int main(int argc, char** argv) { // 讀取圖片 // 讀取的數(shù)據(jù)保存在 Mat 類型的變量 image 中, Mat是 opencv 中的圖像數(shù)據(jù)結(jié)構(gòu),類似 numpy 中的 ndarray cv :: Mat image = cv :: imread("./media/cat.jpg"); // 判斷圖片是否讀取成功, 讀取不成功, 運(yùn)行 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ù)據(jù) // 以 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> // 導(dǎo)入 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) { // 讀取視頻幀, 使用 >> 運(yùn)算符 或者 read()函數(shù), 他的參數(shù)是返回的幀 capture.read(frame); // capture >> frame; // 判斷是否讀取成功 if(frame.empty()) { std :: cout << "文件讀取完畢: " << std :: endl; break; } // 將視頻的幀轉(zhuǎn)為灰度圖 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> // 導(dǎo)入 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) { // 讀取視頻幀, 使用 >> 運(yùn)算符 或者 read()函數(shù), 他的參數(shù)是返回的幀 capture.read(frame); // capture >> frame; // 判斷是否讀取成功 if(frame.empty()) { std :: cout << "文件讀取完畢: " << std :: endl; break; } // std :: cout << "圖片高度: " << frame.rows << "圖片寬度: " << frame.cols << std :: endl; // 將視頻的幀轉(zhuǎn)為灰度圖 cv :: cvtColor(frame, gray, cv :: COLOR_BGR2GRAY); // 將 gray 寫入 writer.write(frame); } return 0; }
四、cmake配置
在CMakeLists.txt文件中進(jìn)行配置
# 最低版本要求 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)
五、運(yùn)行
運(yùn)行1.img.cpp,終端選項 – 運(yùn)行任務(wù)
會出現(xiàn)下列界面, 依次點(diǎn)擊 刪除 build目錄表,在選擇終端 – 運(yùn)行任務(wù) – cmake 配置,結(jié)束后,在點(diǎn)擊終端 – 運(yùn)行任務(wù) – CMake 編譯
上述過程結(jié)束后,就會正常運(yùn)行與輸出1.img.cpp
輸出后結(jié)果如圖所示, 主要看 output 文件夾,可能和我下面不一樣,因?yàn)槲矣衷趯懫渌拇a
到此這篇關(guān)于C++ 結(jié)合 opencv讀取圖片與視頻的文章就介紹到這了,更多相關(guān)C++ 讀取圖片與視頻內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
聊聊Qt+OpenCV聯(lián)合開發(fā)之圖像的創(chuàng)建與賦值問題
這篇文章主要介紹了Qt+OpenCV聯(lián)合開發(fā)之圖像的創(chuàng)建與賦值問題,給大家介紹了圖像的克隆及拷貝問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-01-01C語言實(shí)現(xiàn)旅游資訊管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)旅游資訊管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03使用VS Code的開發(fā)環(huán)境配置教程圖文詳解
這篇文章主要介紹了使用VS Code的開發(fā)環(huán)境配置教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-05-05VS2019調(diào)試C語言程序(監(jiān)視操作)的詳細(xì)步驟
在很多時候我們在寫程序的過程中會發(fā)現(xiàn)一些非編程錯誤的問題,這樣的問題很難直接分辨出來,但是我們可以用調(diào)試了一步一步的模擬程序運(yùn)行的過程,來找出程序的錯誤,下面這篇文章主要給大家介紹了關(guān)于VS2019調(diào)試C語言程序(監(jiān)視操作)的詳細(xì)步驟,需要的朋友可以參考下2022-11-11C++紅黑樹的底層實(shí)現(xiàn)機(jī)制詳解
紅黑樹與AVL樹一樣,也是一種自平衡的二叉搜索樹,它在每個結(jié)點(diǎn)上增加一個存儲位表示結(jié)點(diǎn)的顏色,可以是Red或Black,通過對任何一條從根到葉子的路徑上各個結(jié)點(diǎn)著色方式的限制,本文介紹了C++紅黑樹的底層實(shí)現(xiàn)機(jī)制,需要的朋友可以參考下2024-08-08