<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

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

3天內不再提示

OpenCV4之圖像的輪廓

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

Part11. 圖像的輪廓

在該系列第三篇文章中,曾經簡單地介紹過輪廓和輪廓發現。

11.1 輪廓的基本概念

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

輪廓和邊緣的區別是:

輪廓是連續的,邊緣可以是連續的,也可以是離散的。

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

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

21.2 輪廓發現和輪廓提取

輪廓發現是指在圖像中找到所有可能的輪廓。

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

輪廓發現是輪廓提取的前提,輪廓提取在輪廓發現的基礎上進一步提取輪廓的形狀和位置信息等等。

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

#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函數實現二值化
imshow("mask",mask);

Matkernel=getStructuringElement(MORPH_RECT,Size(15,15));
morphologyEx(mask,mask,MORPH_CLOSE,kernel);//形態學操作
morphologyEx(mask,mask,MORPH_OPEN,kernel);//形態學操作
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 函數實現二值化。inRange 函數用于將圖像中的像素值限制在指定的范圍內,它會將滿足條件的像素設置為 255,不滿足條件的像素設置為 0,從而形成一個二值圖像。

二值化.png

對二值圖像進行一些形態學的操作,便于后續的輪廓分析。

形態學操作.png

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

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

執行結果:

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)是計算幾何(圖形學)中的概念。在一個實數向量空間 V 中,對于給定集合 X,所有包含 X 的凸集的交集 S 被稱為 X 的 凸包。

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

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

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

凸包的性質:

凸包是凸集。

凸包的周長是最小的。

凸包的面積是最小的。

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

OpenCV 提供了 convexHull() 函數尋找輪廓的凸包以及 isContourConvex() 函數用于判斷輪廓是否為凸輪廓。凸輪廓是指所有內角都小于或等于 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);//形態學操作
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

執行結果:

isHull=0
isHull=0

Part44. 總結

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

審核編輯:湯梓紅

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

    關注

    2

    文章

    1070

    瀏覽量

    40099
  • 代碼
    +關注

    關注

    30

    文章

    4569

    瀏覽量

    67053
  • OpenCV
    +關注

    關注

    29

    文章

    612

    瀏覽量

    40850

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

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

收藏 人收藏

    評論

    相關推薦

    OpenCV4.8 CUDA編程代碼教程

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

    小編帶你玩轉OpenCV跳一跳小程序

    了干貨滿滿的“小編帶你玩轉OpenCV跳一跳主題教程” . 在凡哥的公司網站上會陸續更新。 需要完整教程的同學也可加入學習交流群群:561213221。實際上,我們做的這個穩定的跳一跳圖像識別程序,用到
    發表于 03-01 14:16

    魯班貓0 -安裝opencv

    ON OPENCV_GENERATE_PKGCONFIG 因為opencv4默認不生成.pc文件,所以加上這句用于生成opencv4.pc文件,支持pkg-config功能。opencv4
    發表于 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
    發表于 05-09 11:32

    基于輪廓圖像檢索

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

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

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

    輪廓查找基礎_《OpenCV3編程入門》書本配套源代碼

    OpenCV3編程入門》書本配套源代碼:輪廓查找基礎
    發表于 06-06 15:39 ?4次下載

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

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

    opencv輪廓提取原理與代碼的實現

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

    opencv用序列存儲輪廓

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

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

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

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

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

    如何在Raspberry Pi 3上安裝OpenCV4

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

    學習OpenCV4的系統化路線圖

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

    OpenCV二值圖像分析

    二值圖像分析最常見的一個主要方式就是輪廓發現與輪廓分析,其中輪廓發現的目的是為輪廓分析做準備,經過輪廓
    的頭像 發表于 10-20 12:25 ?382次閱讀
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>