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