一、介紹
在圖像處理中,輪廓(contour)是一個非常重要的概念,通常指的是將物體從背景中分離出來的邊界線或曲線。在OpenCV庫中,可以使用findcontours函數來找到圖像中的輪廓。
本篇文章將詳細介紹如何使用OpenCV中的findcontours函數進行輪廓檢測。
二、必備知識
在開始介紹findcontours函數之前,需要了解以下幾個OpenCV函數:
- cvtColor:將圖像從一種顏色空間轉換為另一種顏色空間
- threshold:對圖像進行二值化處理,將圖像分為黑白兩部分
- findcontours:找到圖像中的輪廓,返回輪廓的信息
- drawContours:將輪廓在圖像上進行繪製,以便觀察和調試
三、使用findcontours函數進行輪廓檢測
1. 準備工作
在使用findcontours函數之前,需要加載一張圖像。代碼如下:
#include <opencv2/opencv.hpp> using namespace cv; int main() { Mat image = imread("image.jpg"); // 檢查圖像是否成功加載 if (image.empty()) { std::cout << "無法加載圖像!" << std::endl; return -1; } // 顯示原始圖像 imshow("Original Image", image); // 等待按下任意按鍵 waitKey(0); return 0; }
運行上述代碼,可以加載一張圖像並顯示在窗口中。
2. 進行輪廓檢測
在加載完圖像後,接下來就是使用findcontours函數進行輪廓檢測了。
在使用findcontours函數之前,需要對圖像進行一些預處理,如將圖像從彩色空間轉換為灰度空間,並進行二值化處理。代碼如下:
Mat grayImage, binaryImage; cvtColor(image, grayImage, COLOR_BGR2GRAY); // 將圖像轉換為灰度空間 threshold(grayImage, binaryImage, 50, 255, THRESH_BINARY); // 對圖像進行二值化處理
上述代碼中,我們將圖像從BGR彩色空間轉換為灰度空間,並使用閾值50將圖像二值化,使得圖像中明暗的部分被分為黑白兩部分。
接下來就是使用findcontours函數進行輪廓檢測了。代碼如下:
std::vector<std::vector<Point>> contours; std::vector<Vec4i> hierarchy; findContours(binaryImage, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point()); // 繪製輪廓 Mat contoursImage = Mat::zeros(binaryImage.size(), CV_8UC3); for (int i = 0; i < contours.size(); i++) { drawContours(contoursImage, contours, i, Scalar(0, 0, 255), 2, 8, hierarchy, 0, Point()); } imshow("Contours Image", contoursImage); waitKey(0);
上述代碼中,我們使用findcontours函數找到了圖像中的所有輪廓,並將結果存儲在contours向量中。同時,我們還使用了drawContours函數在contoursImage圖像上將所有輪廓繪製出來,並顯示在窗口中。
運行以上代碼,會得到圖像中所有輪廓的檢測結果,並且通過drawContours函數繪製出來。如下圖所示:
上述代碼中,在findcontours函數中,我們使用了以下參數:
- binaryImage:二值化後的圖像
- contours:存儲檢測到的輪廓
- hierarchy:表示輪廓的層級結構
- RETR_TREE:表示檢測所有輪廓,並重建完整的輪廓層次結構
- CHAIN_APPROX_SIMPLE:表示對輪廓中的所有點進行壓縮,並僅保留與輪廓形狀有關的重要點
- Point():表示輪廓的偏移量,一般都為(0,0)
其中,RETR_TREE和CHAIN_APPROX_SIMPLE是findcontours函數中的兩個比較重要的參數。
RETR_TREE表示檢測所有輪廓,並重建完整的輪廓層次結構。在重建層次結構時,每個輪廓都分配一個編號,這個編號就是hierarchy向量中的元素之一。
CHAIN_APPROX_SIMPLE表示對輪廓中的所有點進行壓縮,並僅保留與輪廓形狀有關的重要點。這樣做可以有效減小存儲輪廓信息所需的空間。
四、總結
本篇文章主要介紹了如何使用OpenCV中的findcontours函數進行輪廓檢測。首先介紹了幾個必備知識,然後詳細介紹了使用findcontours函數進行輪廓檢測的步驟。希望這篇文章能夠幫助大家更好地理解和使用OpenCV庫中的輪廓檢測函數。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/198439.html