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 新建立文件夾
- 建立一個(gè)新的文件夾,并在文件夾下面建立如下面的子文件夾
- 其中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)有屬性的描述。
// 欲了解更多信息,請(qǐng)?jiān)L問(wè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" 會(huì)出現(xiàn)錯(cuò)誤, 鼠標(biāo)點(diǎn)擊頭文件并按住ctrl鍵,界面會(huì)出現(xiàn)配置,添加配置即可, 配置文件自動(dòng)生成放在.vscode文件下。
- 由于是遠(yuǎn)程服務(wù)器主機(jī), 所以無(wú)法顯示圖片,只能另存為。
// 圖片的讀取和顯示
// 導(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 語(yǔ)句直接退出主函數(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)建一個(gè)gray 圖
cv :: Mat gray;
// 創(chuàng)建一個(gè) hsv 圖
cv :: Mat hsv;
// 創(chuàng)建一個(gè) 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);
// 顯示多張圖片, 同時(shí)出現(xiàn)在兩個(gè)窗口
// 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 庫(kù)
int main(int argc, char **argv)
{
// 解析命令行參數(shù)
gflags :: ParseCommandLineFlags(&argc, &argv, true);
// 創(chuàng)建一個(gè) VideoCapture 對(duì)象, 參數(shù)為視頻路徑
cv :: VideoCapture capture("./media/dog.mp4");
// 判斷視頻是否讀取成功, 返回 True 表示成功
if(!capture.isOpened())
{
std :: cout << "無(wú)法讀取視頻" << std :: endl;
return 1;
}
// 讀取視頻幀, 使用 Mat 類型的 frame 存儲(chǔ)返回的幀
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 庫(kù)
int main(int argc, char **argv)
{
// 解析命令行參數(shù)
gflags :: ParseCommandLineFlags(&argc, &argv, true);
// 創(chuàng)建一個(gè) VideoCapture 對(duì)象, 參數(shù)為視頻路徑
cv :: VideoCapture capture("./media/dog.mp4");
// 判斷視頻是否讀取成功, 返回 True 表示成功
if(!capture.isOpened())
{
std :: cout << "無(wú)法讀取視頻" << 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 存儲(chǔ)返回的幀
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)
# 項(xiàng)目信息
project(opencv_demo)
# 使用find_package命令查找OpenCV庫(kù)
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})
# 鏈接庫(kù)
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,終端選項(xiàng) – 運(yùn)行任務(wù)

會(huì)出現(xiàn)下列界面, 依次點(diǎn)擊 刪除 build目錄表,在選擇終端 – 運(yùn)行任務(wù) – cmake 配置,結(jié)束后,在點(diǎn)擊終端 – 運(yùn)行任務(wù) – CMake 編譯

上述過(guò)程結(jié)束后,就會(huì)正常運(yùn)行與輸出1.img.cpp
輸出后結(jié)果如圖所示, 主要看 output 文件夾,可能和我下面不一樣,因?yàn)槲矣衷趯懫渌拇a

到此這篇關(guān)于C++ 結(jié)合 opencv讀取圖片與視頻的文章就介紹到這了,更多相關(guān)C++ 讀取圖片與視頻內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
聊聊Qt+OpenCV聯(lián)合開(kāi)發(fā)之圖像的創(chuàng)建與賦值問(wèn)題
這篇文章主要介紹了Qt+OpenCV聯(lián)合開(kāi)發(fā)之圖像的創(chuàng)建與賦值問(wèn)題,給大家介紹了圖像的克隆及拷貝問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-01-01
C語(yǔ)言實(shí)現(xiàn)旅游資訊管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)旅游資訊管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
使用VS Code的開(kāi)發(fā)環(huán)境配置教程圖文詳解
這篇文章主要介紹了使用VS Code的開(kāi)發(fā)環(huán)境配置教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05
VS2019調(diào)試C語(yǔ)言程序(監(jiān)視操作)的詳細(xì)步驟
在很多時(shí)候我們?cè)趯懗绦虻倪^(guò)程中會(huì)發(fā)現(xiàn)一些非編程錯(cuò)誤的問(wèn)題,這樣的問(wèn)題很難直接分辨出來(lái),但是我們可以用調(diào)試了一步一步的模擬程序運(yùn)行的過(guò)程,來(lái)找出程序的錯(cuò)誤,下面這篇文章主要給大家介紹了關(guān)于VS2019調(diào)試C語(yǔ)言程序(監(jiān)視操作)的詳細(xì)步驟,需要的朋友可以參考下2022-11-11
C++紅黑樹(shù)的底層實(shí)現(xiàn)機(jī)制詳解
紅黑樹(shù)與AVL樹(shù)一樣,也是一種自平衡的二叉搜索樹(shù),它在每個(gè)結(jié)點(diǎn)上增加一個(gè)存儲(chǔ)位表示結(jié)點(diǎn)的顏色,可以是Red或Black,通過(guò)對(duì)任何一條從根到葉子的路徑上各個(gè)結(jié)點(diǎn)著色方式的限制,本文介紹了C++紅黑樹(shù)的底層實(shí)現(xiàn)機(jī)制,需要的朋友可以參考下2024-08-08

