OpenCV 是一個基於BSD許可(開源)發行的跨平台計算機視覺和機器學習軟件庫,可以運行在Linux、Windows及Android等多個操作系統上。OpenCV提供了豐富的接口,支持多種編程語言,能夠快速實現圖像、視頻處理、目標檢測等功能。
一、基礎概念
1、OpenCV中的圖像
OpenCV中的圖像是以二維矩陣(Mat)的形式保存的,圖像的每個像素點都有一個數值,代表該像素點的亮度值。對於彩色圖像,同一位置有B、G、R三個通道的亮度值。一張寬為w,高為h的彩色圖像可以表示為三維矩陣(Mat):B(w,h),G(w,h),R(w,h)。
// 讀入並顯示圖像
#include
using namespace cv;
int main(void)
{
Mat img = imread("path/to/image.png"); // 讀入圖像
namedWindow("Display Image", WINDOW_AUTOSIZE ); // 創建一個GUI窗口
imshow("Display Image", img); // 在窗口中顯示圖像
waitKey(0); // 等待用戶按下鍵盤
return 0;
}
2、圖像處理
OpenCV提供了豐富的圖像處理功能,比如:圖像過濾、卷積、圖像增強、圖像變換、二值化、像素操作等。
// 圖像灰度化
#include
using namespace cv;
int main(void)
{
Mat img = imread("path/to/image.png"); // 讀入圖像
Mat img_gray;
cvtColor(img, img_gray, COLOR_BGR2GRAY); // 灰度化
namedWindow("Display Image", WINDOW_AUTOSIZE ); // 創建一個GUI窗口
imshow("Display Image", img_gray); // 在窗口中顯示圖像
waitKey(0); // 等待用戶按下鍵盤
return 0;
}
二、圖像處理實戰
1、圖像濾波
通常情況下,圖像中可能存在各種各樣的噪聲,比如高斯噪聲、椒鹽噪聲等,這些噪聲會導致圖像質量下降,因此需要進行濾波處理。OpenCV中提供了多種圖像濾波函數,比如高斯濾波、中值濾波、均值濾波等。
// 圖像平滑處理(均值濾波)
#include
using namespace cv;
int main(void)
{
Mat img = imread("path/to/image.png"); // 讀入圖像
Mat img_blur;
blur(img, img_blur, Size(5, 5)); // 均值濾波
namedWindow("Display Image", WINDOW_AUTOSIZE ); // 創建一個GUI窗口
imshow("Display Image", img_blur); // 在窗口中顯示圖像
waitKey(0); // 等待用戶按下鍵盤
return 0;
}
2、圖像邊緣檢測
圖像邊緣檢測是圖像處理中一個非常重要的問題,它可以用來尋找圖像的邊緣、輪廓等特殊部分,是很多圖像處理算法的前置步驟。OpenCV中提供了多種邊緣檢測算法,比如Sobel算子、Laplacian算子、Canny算子等。
// 圖像邊緣檢測(Canny算子)
#include
using namespace cv;
int main(void)
{
Mat img = imread("path/to/image.png"); // 讀入圖像
Mat img_edges;
Canny(img, img_edges, 50, 150); // Canny邊緣檢測
namedWindow("Display Image", WINDOW_AUTOSIZE ); // 創建一個GUI窗口
imshow("Display Image", img_edges); // 在窗口中顯示圖像
waitKey(0); // 等待用戶按下鍵盤
return 0;
}
三、圖像識別和機器學習
1、目標檢測
目標檢測是計算機視覺中的一個重要分支,主要是指在圖像或視頻中自動檢測和識別出目標。OpenCV中提供了多種目標檢測算法,比如Haar特徵檢測、HOG特徵檢測、Cascade分類器等。
// 人臉檢測
#include
using namespace cv;
int main(void)
{
// 加載預訓練的分類器
CascadeClassifier face_cascade;
face_cascade.load("path/to/haarcascade_frontalface_alt.xml");
// 讀入圖像
Mat img = imread("path/to/image.png");
// 轉換為灰度圖像
Mat img_gray;
cvtColor(img, img_gray, COLOR_BGR2GRAY);
// 目標檢測
std::vector faces;
face_cascade.detectMultiScale(img_gray, faces, 1.1, 2, 0|CASCADE_SCALE_IMAGE, Size(30, 30));
// 在圖像中標記出人臉
for (size_t i = 0; i < faces.size(); i++)
{
rectangle(img, faces[i], Scalar(0, 255, 0), 2);
}
// 顯示結果
namedWindow("Display Image", WINDOW_AUTOSIZE );
imshow("Display Image", img);
waitKey(0);
return 0;
}
2、機器學習分類
OpenCV中的機器學習模塊提供了眾多機器學習算法,其中包括分類算法、回歸算法、聚類算法等。通過機器學習算法,可以訓練一個模型,將輸入數據映射到輸出結果。
// KNN分類器
#include
using namespace cv;
int main(void)
{
// 準備訓練數據和標籤
Mat trainingDataMat(3, 2, CV_32FC1);
Mat labelsMat(3, 1, CV_32FC1);
trainingDataMat.at(0,0) = 10; trainingDataMat.at(0,1) = 10;
trainingDataMat.at(1,0) = 20; trainingDataMat.at(1,1) = 20;
trainingDataMat.at(2,0) = 30; trainingDataMat.at(2,1) = 30;
labelsMat.at(0,0) = 1;
labelsMat.at(1,0) = 2;
labelsMat.at(2,0) = 3;
// 創建KNN分類器
Ptr knn = ml::KNearest::create();
knn->train(trainingDataMat, ml::ROW_SAMPLE, labelsMat);
// 預測分類
Mat testDataMat(1, 2, CV_32FC1);
testDataMat.at(0,0) = 15; testDataMat.at(0,1) = 15;
Mat response;
knn->findNearest(testDataMat, 1, response);
// 顯示結果
std::cout << response << std::endl;
return 0;
}
四、結語
本文對OpenCV進行了全面詳細的介紹,包括了OpenCV中的基礎概念、圖像處理實戰和機器學習分類等內容。希望本文能夠對大家了解OpenCV和圖像處理算法有所幫助。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/253339.html