本文中代碼所采用的是OpenCV4.6.0,采用Cmake來(lái)管理工程,mac系統(tǒng)
OpenCV簡(jiǎn)介
OpenCV是“開(kāi)源計(jì)算機(jī)視覺(jué)庫(kù)”,「Open Sourec Computer Vision Library」,是一個(gè)基于開(kāi)源發(fā)行的跨平臺(tái)計(jì)算機(jī)視覺(jué)庫(kù),包含了許多圖像處理和計(jì)算機(jī)視覺(jué)方面的通用算法,這里主要學(xué)習(xí)其api的應(yīng)用。
快速上手OpenCV圖像處理
- 第一個(gè)程序:圖像顯示,代碼如下
//
// Created by on 2022/11/9.
//
#include //相關(guān)頭文件
using namespace std;
int main() {
cv::Mat srcImage = cv::imread("../dog.jpg"); //載入圖像
cv::imshow("[原始圖]", srcImage); //顯示圖像
cv::waitKey(0); //等待用戶任意鍵按下才終止窗口
return 0;
}
- 第二個(gè)程序:圖像腐蝕
腐蝕是最基本的形態(tài)學(xué)運(yùn)算之一:就是用圖像中的暗色部分“腐蝕”掉圖像中的高亮部分
部分。
顯示效果如上圖
代碼如下:
//
// Created by on 2022/11/9.
//
#include //模塊頭文件
#include //圖像處理頭文件
//using namespace cv; //cv命名空間
int main() {
//載入原圖,保存在Mat矩陣類(lèi)對(duì)象中
cv::Mat srcImage = cv::imread("../cat.jpeg");
//顯示原圖
cv::imshow("faster",srcImage);
//進(jìn)行腐蝕操作
cv::Mat element = cv::getStructuringElement(cv::MORPH_RECT,cv::Size(15, 15));
cv::Mat dstImage;
cv::erode(srcImage, dstImage, element);
//顯示效果圖
cv::imshow("laster", dstImage);
cv::waitKey(0);
return 0;
}
getStructuringElement函數(shù)返回一個(gè)指定形狀和尺寸的內(nèi)核矩陣,然后調(diào)用erode函數(shù)進(jìn)行圖像腐蝕操作。
- 第三個(gè)程序:圖像模糊
對(duì)圖像進(jìn)行均值濾波操作,主要使用到blur函數(shù)
代碼如下:
//
// Created by on 2022/11/9.
//
#include
#include
//using namespace cv;
int main() {
cv::Mat srcImage = cv::imread("../cat.jpeg");
cv::imshow("src picture", srcImage);
//進(jìn)行均值濾波操作
cv::Mat dstImage;
cv::blur(srcImage, dstImage, cv::Size(7, 7));
//顯示效果圖
cv::imshow("last picture", dstImage);
cv::waitKey(0);
return 0;
}
先載入圖像,并將其轉(zhuǎn)成灰度圖,再用blur函數(shù)進(jìn)行圖像模糊以降噪,然后用canny函數(shù)進(jìn)行邊緣檢測(cè),最后進(jìn)行顯示
代碼如下:
//
// Created by on 2022/11/9.
//
#include
#include
//using namespace std;
int main() {
cv::Mat srcImage = cv::imread("../cat.jpeg");
cv::imshow("canny test", srcImage); //顯示原始圖
//將原始圖像轉(zhuǎn)化為灰度圖像
cv::Mat dstImage, edge, grayImage;
//創(chuàng)建與原圖同類(lèi)型和大小的矩陣 dst
dstImage.create(srcImage.size(), srcImage.type());
//將原圖像轉(zhuǎn)換為灰度圖像
cv::cvtColor(srcImage, grayImage, cv::COLOR_BGR2GRAY);
//先使用3x3的內(nèi)核矩陣來(lái)降噪
cv::blur(grayImage, edge, cv::Size(3, 3));
//運(yùn)行Canny 算子
cv::Canny(edge, edge, 3, 9, 3);
//顯示效果圖
cv::imshow("edge test", edge);
cv::waitKey(0);
return 0;
}
- 第五個(gè)程序:讀取并播放視頻
使用VideoCapture從視頻文件或攝像頭捕獲視頻并顯示出來(lái)
有兩種寫(xiě)法,分別是:
- 先實(shí)例化,再初始化
VideoCapture video; video.open("one.mp4");
- 在實(shí)例化的同時(shí)進(jìn)行初始化
VideoCapture video("one.mp4");
視頻讀入到VideoCapture類(lèi)對(duì)象之后,緊接著可以用一個(gè)循環(huán)將每一幀顯示出來(lái),相關(guān)代碼如下:
等)時(shí),在頭部直接指定,如:```javascript,如下:
//
// Created by 方 on 2022/11/9.
//
#include
using namespace cv;
int main() {
//1. 讀入視頻
VideoCapture video("../one.mov");
//2. 循環(huán)顯示每一幀
while(1) {
Mat frame; //定義一個(gè)Mat對(duì)象,用來(lái)存儲(chǔ)每一幀圖像
video>>frame; //讀取當(dāng)前幀
imshow("read_video", frame); //顯示當(dāng)前幀
waitKey(30); //延時(shí)30ms
}
return 0;
}
- 第六個(gè)程序:調(diào)用攝像頭采集圖像
只需將上述代碼中的視頻文件名“one.mov”換成0就行,即VideoCapture(0)表示調(diào)用攝像頭而不是從文件中讀取視頻, 注意不要添加""
結(jié)合攝像頭調(diào)用實(shí)例程序來(lái)配合canny邊緣檢測(cè),得到canny邊緣檢測(cè)并高斯模糊后的攝像頭采集視頻,代碼如下:
//
// Created by on 2022/11/9.
//
#include
int main() {
//從攝像頭讀入視頻
cv::VideoCapture video(0);
cv::Mat edge;
//循環(huán)顯示每一幀
while(1) {
//1. 讀入圖像
cv::Mat frame; //定義一個(gè)Mat變量,用于存儲(chǔ)每一幀的圖像
video >> frame; //讀取當(dāng)前幀
//2. 將原圖轉(zhuǎn)換成灰度圖
cv::cvtColor(frame, edge, cv::COLOR_BGR2GRAY);
//3. 使用3x3的內(nèi)核矩陣來(lái)進(jìn)行降噪 2x3+1=7
cv::blur(edge, edge, cv::Size(7,7)); //進(jìn)行模糊
//4. 進(jìn)行canny邊緣檢測(cè)并顯示
cv::Canny(edge, edge, 0, 30, 3);
cv::imshow("the video after canny", edge); //顯示經(jīng)過(guò)處理后的當(dāng)前幀
if(cv::waitKey(30) >= 0)
break; //延時(shí)30ms
}
return 0;
}
-
圖像處理
+關(guān)注
關(guān)注
27文章
1300瀏覽量
56894 -
API
+關(guān)注
關(guān)注
2文章
1511瀏覽量
62396 -
開(kāi)源
+關(guān)注
關(guān)注
3文章
3407瀏覽量
42712 -
OpenCV
+關(guān)注
關(guān)注
31文章
635瀏覽量
41556
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論