導(dǎo)言
在計(jì)算機(jī)視覺領(lǐng)域,圖像處理是一項(xiàng)重要的任務(wù)。而在圖像處理的過程中,輪廓(Contours)的提取是一項(xiàng)基礎(chǔ)且關(guān)鍵的操作。OpenCV庫中的findContours函數(shù)就是用于找到圖像中的輪廓的工具之一。本文將深入介紹findContours函數(shù)的作用、原理、應(yīng)用場(chǎng)景,并結(jié)合C++和OpenCV提供一些簡(jiǎn)單的示例代碼,方便讀者入門。
findContours函數(shù)的作用
findContours函數(shù)的主要作用是在二值化圖像中找到輪廓,這些輪廓是由相鄰的像素組成的對(duì)象的邊界。該函數(shù)能夠識(shí)別并返回圖像中所有的輪廓,并以一種易于處理的數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)。
findContours函數(shù)詳解
findContours是OpenCV中用于在二值化圖像中查找輪廓的函數(shù)之一。下面詳細(xì)介紹該函數(shù)的原型及參數(shù)作用。
函數(shù)原型
void findContours(InputOutputArray image, OutputArrayOfArrays contours, OutputArray hierarchy, int mode, int method, Point offset = Point());
參數(shù)說明
image:輸入輸出參數(shù),是二值化的源圖像。在函數(shù)執(zhí)行后,該圖像可能會(huì)被修改,以強(qiáng)調(diào)輪廓。注意,輸入圖像必須是8位單通道圖像。
contours:輸出參數(shù),存儲(chǔ)找到的輪廓的容器。它是一個(gè)向量的向量(vector<vector>),每個(gè)元素都代表一個(gè)輪廓,其中每個(gè)Point表示輪廓上的一個(gè)點(diǎn)。
hierarchy:輸出參數(shù),用于存儲(chǔ)輪廓的層級(jí)信息。它是一個(gè)向量,每個(gè)元素包含了關(guān)于一個(gè)輪廓的層級(jí)關(guān)系,包括下一個(gè)輪廓、上一個(gè)輪廓、子輪廓和父輪廓的索引。
mode:表示輪廓的檢索模式,是一個(gè)整數(shù)值。常見的模式有:
RETR_EXTERNAL:只檢索最外層的輪廓。
RETR_LIST:檢索所有輪廓并存儲(chǔ)為列表。
RETR_CCOMP:檢索所有輪廓并組織為兩層的層級(jí)結(jié)構(gòu)。
RETR_TREE:檢索所有輪廓并完整重構(gòu)輪廓層級(jí)。
method:表示輪廓的逼近方法,同樣是一個(gè)整數(shù)值。常見的方法有:
CHAIN_APPROX_NONE:存儲(chǔ)所有的輪廓點(diǎn),不進(jìn)行任何壓縮。
CHAIN_APPROX_SIMPLE:壓縮水平、垂直和對(duì)角方向,只保留終點(diǎn)。
CHAIN_APPROX_TC89_L1和CHAIN_APPROX_TC89_KCOS:應(yīng)用 Teh-Chin 鏈逼近算法。
offset:可選參數(shù),表示輪廓中所有點(diǎn)的偏移。默認(rèn)為Point(),即無偏移。
函數(shù)作用
findContours函數(shù)的主要作用是根據(jù)給定的模式和方法,在二值化圖像中找到并提取輪廓。以下是各參數(shù)的作用:
image:作為輸入,傳入函數(shù)的二值化圖像。
contours:作為輸出,包含找到的輪廓信息。
hierarchy:作為輸出,包含了輪廓之間的關(guān)系信息,如子輪廓、父輪廓等。
mode:決定了輪廓的檢索模式,即找到哪些輪廓。
method:決定了輪廓的逼近方法,即如何表示輪廓的形狀。
offset:可選參數(shù),用于指定輪廓中所有點(diǎn)的偏移。
通過使用findContours函數(shù),我們可以方便地在圖像中定位并提取感興趣的對(duì)象輪廓,為后續(xù)的圖像處理和分析提供了基礎(chǔ)。
原理分析
findContours函數(shù)的工作原理主要基于圖像的邊緣檢測(cè)和連接分析。它的實(shí)現(xiàn)步驟可以概括為以下幾個(gè)步驟:
圖像預(yù)處理:首先,輸入圖像通常需要進(jìn)行二值化處理,將圖像轉(zhuǎn)換為黑白兩色,以便更容易檢測(cè)輪廓。
邊緣檢測(cè):利用一些邊緣檢測(cè)算法(如Sobel、Canny等),找到圖像中的邊緣。
輪廓查找:根據(jù)邊緣信息,找到輪廓的起點(diǎn),并按照一定規(guī)則遍歷整個(gè)輪廓,將輪廓上的點(diǎn)存儲(chǔ)起來。
輪廓連接:將相鄰的輪廓點(diǎn)連接成完整的輪廓。
存儲(chǔ)結(jié)果:將找到的輪廓以一種數(shù)據(jù)結(jié)構(gòu)(通常是向量)存儲(chǔ),以便后續(xù)使用。
應(yīng)用場(chǎng)景
findContours函數(shù)在許多計(jì)算機(jī)視覺任務(wù)中都得到廣泛應(yīng)用,例如:
目標(biāo)檢測(cè):用于識(shí)別圖像中的物體輪廓,從而進(jìn)行目標(biāo)檢測(cè)。
圖像分割:通過輪廓提取,可以將圖像分割成不同的區(qū)域,有助于進(jìn)一步的分析。
手寫體識(shí)別:在手寫體數(shù)字或字符識(shí)別中,findContours可以用于提取數(shù)字的輪廓。
醫(yī)學(xué)圖像分析:在醫(yī)學(xué)圖像中,該函數(shù)可用于分割和分析組織結(jié)構(gòu)。
代碼示例
使用C++與OpenCV寫代碼
以下是一個(gè)簡(jiǎn)單的C++代碼示例,演示了如何使用OpenCV的findContours函數(shù)來查找并繪制圖像中的輪廓:
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main() {
// 讀取圖像
Mat image = imread("example.jpg", IMREAD_GRAYSCALE);
if (image.empty()) {
cerr << "Unable to read the image" << endl;
return -1;
}
// 二值化圖像
Mat binaryImage;
threshold(image, binaryImage, 128, 255, THRESH_BINARY);
// 查找輪廓
vector<vector<Point>> contours;
vector<Vec4i> hierarchy;
findContours(binaryImage, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
// 繪制輪廓
Mat contourImage = Mat::zeros(image.size(), CV_8UC3);
drawContours(contourImage, contours, -1, Scalar(0, 255, 0), 2);
// 顯示原始圖像和帶有輪廓的圖像
imshow("Original Image", image);
imshow("Contours", contourImage);
waitKey(0);
return 0;
}
在這個(gè)示例中,首先讀取一幅灰度圖像,然后通過二值化處理。接著使用findContours函數(shù)找到圖像中的輪廓,最后使用drawContours函數(shù)將輪廓繪制在一張空白圖像上。最終,通過OpenCV的imshow函數(shù)顯示原始圖像和包含輪廓的圖像。文章來源:http://www.zghlxwxcb.cn/news/detail-810878.html
結(jié)語
通過findContours函數(shù),我們能夠方便地在圖像中找到并提取出對(duì)象的輪廓,為后續(xù)的圖像處理和分析提供了基礎(chǔ)。希望通過本文的介紹和代碼示例,讀者能夠更好地理解并運(yùn)用這一強(qiáng)大的函數(shù)。文章來源地址http://www.zghlxwxcb.cn/news/detail-810878.html
到了這里,關(guān)于探秘OpenCV中的findContours函數(shù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!