RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

OpenCV4之圖像的輪廓

OpenCV學堂 ? 來源:OpenCV學堂 ? 2024-01-02 12:24 ? 次閱讀

Part11. 圖像的輪廓

在該系列第三篇文章中,曾經(jīng)簡單地介紹過輪廓和輪廓發(fā)現(xiàn)。

11.1 輪廓的基本概念

圖像的輪廓是指圖像中具有相同顏色灰度值的連續(xù)點的曲線。輪廓和邊緣是有聯(lián)系的,邊緣是輪廓的基礎,輪廓是邊緣的連續(xù)集合。

輪廓和邊緣的區(qū)別是:

輪廓是連續(xù)的,邊緣可以是連續(xù)的,也可以是離散的。

輪廓是完整的,邊緣可以是完整的,也可以是不完整的。

輪廓可以有各種形狀,邊緣通常是線性的。

21.2 輪廓發(fā)現(xiàn)和輪廓提取

輪廓發(fā)現(xiàn)是指在圖像中找到所有可能的輪廓。

輪廓提取是指從圖像中找到所有有效的輪廓和輪廓的具體信息。

輪廓發(fā)現(xiàn)是輪廓提取的前提,輪廓提取在輪廓發(fā)現(xiàn)的基礎上進一步提取輪廓的形狀和位置信息等等。

下面的代碼,經(jīng)過一系列操作找到二值圖像的有效輪廓后,獲取這些輪廓的最小外接矩形,最后用線在原圖中框出這些外接矩形,從而在原圖中找到比較明顯的蘋果。

#include
#include"opencv2/imgproc.hpp"
#include"opencv2/highgui.hpp"

usingnamespacestd;
usingnamespacecv;

boolascendSort(vectora,vectorb)
{
returncontourArea(a)>contourArea(b);
}

intmain(intargc,char**argv){
Matsrc=imread(".../apple.jpg");
imshow("src",src);

Mathsv,edge;
cvtColor(src,hsv,cv::COLOR_BGR2HSV);//BGR轉換到HSV色彩空間
imshow("hsv",hsv);

cv::Scalarlower_red(0,43,46);
cv::Scalarupper_red(10,255,255);//定義紅色的HSV范圍

Matmask;
inRange(hsv,lower_red,upper_red,mask);//通過inRange函數(shù)實現(xiàn)二值化
imshow("mask",mask);

Matkernel=getStructuringElement(MORPH_RECT,Size(15,15));
morphologyEx(mask,mask,MORPH_CLOSE,kernel);//形態(tài)學操作
morphologyEx(mask,mask,MORPH_OPEN,kernel);//形態(tài)學操作
imshow("morphology",mask);

vector>contours;
vectorhierarchy;

findContours(mask,contours,hierarchy,RETR_EXTERNAL,CHAIN_APPROX_SIMPLE);
sort(contours.begin(),contours.end(),ascendSort);//ascendingsort

for(size_ti=0;i

展示原圖

將原圖轉換成 HSV 類型,用于提取特定顏色。

hsv.png

通過 inRange 函數(shù)實現(xiàn)二值化。inRange 函數(shù)用于將圖像中的像素值限制在指定的范圍內(nèi),它會將滿足條件的像素設置為 255,不滿足條件的像素設置為 0,從而形成一個二值圖像。

二值化.png

對二值圖像進行一些形態(tài)學的操作,便于后續(xù)的輪廓分析。

形態(tài)學操作.png

通過 findContours() 函數(shù)進行輪廓發(fā)現(xiàn)。最后,篩選出有效的輪廓,并獲取最小外接矩形,用線畫出在原圖上展示出來。

Part22. 輪廓特征的分類

圖像的輪廓特征可以分為以下幾類:

基礎特征:面積、周長、質心、凸包、最小外接矩形等。這些特征可以直接從輪廓序列中計算得到。

矩特征:Hu 矩、中心矩、慣性矩等。這些特征可以用于描述輪廓的形狀和大小。

幾何特征:最小閉合圓、擬合橢圓等。這些特征可以用于描述輪廓的幾何形狀。

Part33. 輪廓的基礎特征

33.1 面積、周長、最小外接矩形

輪廓面積 contourArea()

輪廓周長 arcLength()

輪廓外接矩形 boundingRect()

輪廓最小外接矩形 minAreaRect()

下面的例子獲取圖中回形針的輪廓,以及輪廓的面積、周長、最小外接矩形等。

#include
#include"opencv2/imgproc.hpp"
#include"opencv2/highgui.hpp"

usingnamespacestd;
usingnamespacecv;

boolascendSort(vectora,vectorb)
{
returncontourArea(a)>contourArea(b);
}

intmain(intargc,char**argv){
Matsrc=imread(".../paperclip.jpg");
imshow("src",src);

Matgray,thresh;
cvtColor(src,gray,cv::COLOR_BGR2GRAY);
imshow("gray",gray);

threshold(gray,thresh,0,255,THRESH_BINARY_INV|THRESH_OTSU);
imshow("thresh",thresh);

vector>contours;
vectorhierarchy;

findContours(thresh,contours,hierarchy,RETR_EXTERNAL,CHAIN_APPROX_SIMPLE);
sort(contours.begin(),contours.end(),ascendSort);//ascendingsort

for(size_ti=0;i

執(zhí)行結果:

area=101573,length=2461.71
area=41757.5,length=1256.08
area=41348,length=1152.56
area=39717.5,length=1616.13
area=37503,length=1230.47
area=36742.5,length=1037.21
area=4142,length=706.357

外接矩形是指可以包圍輪廓所有點的矩形,而最小外接矩形是指包含輪廓中所有點的最小矩形。

下面的例子,獲取圖中最大輪廓的外接矩形和最小外接矩形,分別用黃色和藍色表示。

#include"opencv2/imgproc.hpp"
#include"opencv2/highgui.hpp"

usingnamespacestd;
usingnamespacecv;

boolascendSort(vectora,vectorb)
{
returncontourArea(a)>contourArea(b);
}

intmain(intargc,char**argv){
Matsrc=imread(".../fruit.jpg");
imshow("src",src);

Matgray,thresh;
cvtColor(src,gray,cv::COLOR_BGR2GRAY);

threshold(gray,thresh,0,255,THRESH_BINARY|THRESH_OTSU);

vector>contours;
vectorhierarchy;
findContours(thresh,contours,hierarchy,RETR_EXTERNAL,CHAIN_APPROX_SIMPLE);
sort(contours.begin(),contours.end(),ascendSort);//ascendingsort

RotatedRectrrt=minAreaRect(contours[0]);//獲取最大輪廓的最小外接矩形

Point2fpt[4];
rrt.points(pt);
line(src,pt[0],pt[1],Scalar(255,0,0),8,8);
line(src,pt[1],pt[2],Scalar(255,0,0),8,8);
line(src,pt[2],pt[3],Scalar(255,0,0),8,8);
line(src,pt[3],pt[0],Scalar(255,0,0),8,8);

Rectrect=boundingRect(contours[0]);//獲取最大輪廓的外接矩形
rectangle(src,rect,Scalar(0,255,255),8,8);//繪制外接矩形

imshow("result",src);

waitKey(0);
return0;
}

通過上述例子可以看到,最小外接矩形能夠更精確地描述輪廓的形狀和大小。

外接矩形和最小外接矩形有各自的使用場景,例如在對象檢測中,可以使用外接矩形來粗略定位物體,而使用最小外接矩形來精確定位物體。

43.2 凸包

凸包(Convex Hull)是計算幾何(圖形學)中的概念。在一個實數(shù)向量空間 V 中,對于給定集合 X,所有包含 X 的凸集的交集 S 被稱為 X 的 凸包。

在二維歐幾里得空間中,凸包可想象為一條剛好包著所有點的橡皮圈。

平面的一個子集 S 被稱為是“凸”的,當且僅當對于任意兩點 p,s ∈S,線段 ps 都完全屬于S。

一個點集 P 的凸包CH(P),就是包含 P 的最小凸集——即包含P的所有凸集的交。

凸包的性質:

凸包是凸集。

凸包的周長是最小的。

凸包的面積是最小的。

凸包的質心是所有點的質心的均值。

OpenCV 提供了 convexHull() 函數(shù)尋找輪廓的凸包以及 isContourConvex() 函數(shù)用于判斷輪廓是否為凸輪廓。凸輪廓是指所有內(nèi)角都小于或等于 180 度的輪廓。

#include
#include"opencv2/imgproc.hpp"
#include"opencv2/highgui.hpp"

usingnamespacestd;
usingnamespacecv;

intmain(intargc,char**argv){
Matsrc=imread(".../hand.jpg");
imshow("src",src);

Matgray,thresh;
cvtColor(src,gray,cv::COLOR_BGR2GRAY);

threshold(gray,thresh,0,255,THRESH_BINARY_INV|THRESH_OTSU);
imshow("thresh",thresh);

Matmask;
Matkernel=getStructuringElement(MORPH_RECT,Size(31,31));
morphologyEx(thresh,mask,MORPH_CLOSE,kernel);//形態(tài)學操作
imshow("morphology",mask);

vector>contours;
vectorhierarchy;

findContours(mask,contours,hierarchy,RETR_EXTERNAL,CHAIN_APPROX_SIMPLE);

vector>hull(contours.size());

Matdrawing=Mat::zeros(mask.size(),CV_8UC3);
for(size_ti=0;i

執(zhí)行結果:

isHull=0
isHull=0

Part44. 總結

輪廓的基礎特征是計算機視覺中的重要工具,這些特征可以應用于對象檢測、形狀識別、測量等各種應用場景。后續(xù)還會介紹更多的輪廓特征。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 圖像
    +關注

    關注

    2

    文章

    1083

    瀏覽量

    40449
  • 代碼
    +關注

    關注

    30

    文章

    4779

    瀏覽量

    68521
  • OpenCV
    +關注

    關注

    31

    文章

    634

    瀏覽量

    41337

原文標題:OpenCV4之圖像的輪廓和輪廓的基礎特征

文章出處:【微信號:CVSCHOOL,微信公眾號:OpenCV學堂】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    OpenCV4.8 CUDA編程代碼教程

    OpenCV4支持通過GPU實現(xiàn)CUDA加速執(zhí)行,實現(xiàn)對OpenCV圖像處理程序的加速運行,當前支持加速的模塊包括如下。
    的頭像 發(fā)表于 12-05 09:56 ?1021次閱讀
    <b class='flag-5'>OpenCV</b>4.8 CUDA編程代碼教程

    魯班貓0 -安裝opencv

    ON OPENCV_GENERATE_PKGCONFIG 因為opencv4默認不生成.pc文件,所以加上這句用于生成opencv4.pc文件,支持pkg-config功能。opencv4
    發(fā)表于 04-09 13:29

    CMake在Linux 6.1.1-1.0.0中搜索包opencv損壞了嗎?

    ] 但是這個文件不存在。 并嘗試使用圖像 imx-image-full 的 SDK,我收到以下錯誤: sysroots/armv8a-poky-linux/usr/lib/cmake/opencv4
    發(fā)表于 05-09 11:32

    基于輪廓圖像檢索

    基于輪廓圖像檢索:提出了一種針對多紋理圖像的基于輪廓和紋理分割的檢索策略.首先提取一幅圖像中各個紋理基元的
    發(fā)表于 10-31 09:03 ?12次下載

    創(chuàng)建包圍輪廓的矩形邊界初級圖像混合_《OpenCV3編程入門》書本配套源代碼

    OpenCV3編程入門》書本配套源代碼:創(chuàng)建包圍輪廓的矩形邊界初級圖像混合
    發(fā)表于 06-06 15:39 ?1次下載

    OpenCV3編程入門-源碼例程全集-創(chuàng)建包圍輪廓的矩形和圓形邊

    OpenCV3編程入門-源碼例程全集-創(chuàng)建包圍輪廓的矩形和圓形邊界框
    發(fā)表于 09-17 22:54 ?2次下載

    輪廓查找基礎_OpenCV3編程入門-源碼例程

    OpenCV3編程入門-源碼例程全集-輪廓查找基礎,感興趣的小伙伴們可以瞧一瞧。
    發(fā)表于 09-18 16:55 ?0次下載

    opencv輪廓提取原理與代碼的實現(xiàn)

    在檢測物體的輪廓時,我們通常會使用到opencv中的findcontour和drawcontour,比較常用而且效果不錯。那么findcontour是基于什么原理來實現(xiàn)輪廓的提取呢?在目標識別中我們
    發(fā)表于 12-04 16:29 ?3.2w次閱讀

    opencv用序列存儲輪廓

    輪廓到底是什么?一個輪廓一般對應一系列的點,也就是圖像中的一條曲線.表示的方法可能根據(jù)不同情況而有所不同.
    的頭像 發(fā)表于 02-02 17:25 ?4258次閱讀
    <b class='flag-5'>opencv</b>用序列存儲<b class='flag-5'>輪廓</b>

    如何才能提取二值圖像中的最大輪廓OpenCV程序免費下載

      本文檔的主要內(nèi)容詳細介紹的是如何才能提取二值圖像中的最大輪廓OpenCV程序免費下載。
    發(fā)表于 10-10 16:49 ?3次下載
    如何才能提取二值<b class='flag-5'>圖像</b>中的最大<b class='flag-5'>輪廓</b><b class='flag-5'>OpenCV</b>程序免費下載

    基于opencv4和Yolo-Fastest,實現(xiàn)PC和單片機通信,控制步進電機捕獲目標

    效果視頻 基于opencv4和yolo,實現(xiàn)PC和單片機通信,控制步進電機捕獲目標
    發(fā)表于 11-23 17:36 ?16次下載
    基于<b class='flag-5'>opencv4</b>和Yolo-Fastest,實現(xiàn)PC和單片機通信,控制步進電機捕獲目標

    OpenCV中幾何形狀識別與測量

    什么是輪廓,簡單說輪廓就是一些列點相連組成形狀、它們擁有同樣的顏色、輪廓發(fā)現(xiàn)在圖像的對象分析、對象檢測等方面是非常有用的工具,在OpenCV
    的頭像 發(fā)表于 06-02 15:31 ?1920次閱讀

    如何在Raspberry Pi 3上安裝OpenCV4

    今天我們將學習如何在 Raspberry Pi 3 上安裝 OpenCV4 庫,以便我們可以將其用于計算機視覺應用程序。這將允許 OpenCV 在像 Pi 這樣的便攜式設備上運行,從而打開許多可能性的大門。所以讓我們開始吧
    的頭像 發(fā)表于 09-08 16:09 ?1593次閱讀
    如何在Raspberry Pi 3上安裝<b class='flag-5'>OpenCV4</b>庫

    學習OpenCV4的系統(tǒng)化路線圖

    OpenCV4發(fā)布測試版本開始,作者就一直關注!根據(jù)自己近十年圖像處理OpenCV開發(fā)相關工作經(jīng)驗,花了七個月的時間,針對OpenCV4、精心選擇
    的頭像 發(fā)表于 07-05 11:30 ?631次閱讀
    學習<b class='flag-5'>OpenCV4</b>的系統(tǒng)化路線圖

    OpenCV4圖像分析BLOB特征分析

    BLOB是圖像中灰度塊的一種專業(yè)稱呼,更加變通一點的可以說它跟我們前面二值圖像分析的聯(lián)通組件類似,通過特征提取實現(xiàn)常見的各種灰度BLOB對象組件檢測與分離。使用該檢測器的時候,可以根據(jù)需要輸入不同參數(shù),得到的結果跟輸入的參數(shù)息息相關。
    的頭像 發(fā)表于 12-28 12:28 ?1332次閱讀
    <b class='flag-5'>OpenCV4</b><b class='flag-5'>圖像</b>分析<b class='flag-5'>之</b>BLOB特征分析
    RM新时代网站-首页