輪廓檢測

輪廓(Contours),指的是有相同顏色或者密度,連接所有連續點的一條曲線。檢測輪廓的工作對形狀分析和物體檢測與識別都非常有用。

在輪廓檢測之前,首先要對圖片進行二值化或者Canny邊緣檢測。在OpenCV中,尋找的物體是白色的,而背景必須是黑色的,因此圖片預處理時必須保證這一點。


cv2.findContours函數

Python版示例如下,也可以參考【OpenCV-Python教程(11、輪廓檢測)】【Contours : Getting Started】

contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

1. 完整例子

import cv2#讀入圖片
img = cv2.imread("1.png")# 必須先轉化成灰度圖
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 二值化
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINAEY)# 尋找輪廓
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)# 畫出輪廓,-1,表示所有輪廓,畫筆顏色為(0, 255, 0),即Green,粗細為3
cv2.drawContours(img, contours, -1, (0, 255, 0), 3)# 顯示圖片
cv2.namedWindow("Contours", cv2.NORMAL_WINDOW)
cv2.imshow("Contours", img)# 等待鍵盤輸入
cv2.waitKey(0)
cv2.destroyAllWindows()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

2. 參數解釋

這里的findContours函數,有三個參數

  • thresh -> 要尋找輪廓的圖片,注意這里的輪廓會直接改變在thresh上,記得備份
  • cv2.RETR_TREE -> 表示輪廓檢索模式(Contour retrieval mode)為,檢索所有的輪廓,且重組為一個有層次的嵌套輪廓。層次信息返回在hierarchy中。
  • cv2.CHAIN_APPROX_SIMPLE -> 表示輪廓近似方法(Contour approximation method)。SIMPLE可以這樣理解,假如一個矩形有1000個點,但是現在只用四個角的點表示就行了,即去掉冗余信息。

返回值也有兩個,contours?和?hierarchy

對contours的理解如下

print "找到 %d 個輪廓" %(len(contours))
print "第 0 個輪廓有 %d 個點" %(len(contours[0]))# 畫出第0個輪廓
cv2.drawContours(img, contours, 0, (0, 255, 0), 3)
cv2.imshow("first contours", img)# 畫出第1個輪廓
cv2.drawContours(img, contours, 1, (0, 255, 0), 3)
cv2.imshow("second contours", img)# 畫出所有的輪廓
cv2.drawContours(img, contours, -1, (0, 255, 0), 3)
cv2.imshow("all contours", img)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

對 hierarchy 的深究,可以參考這里:【Contours Hierarchy】


輪廓特征(Contour Features)

查找到輪廓以后,我們可以得出輪廓的一些特征信息,也可以在輪廓上做一些簡單的操作,參考Python教程:【Contour Features】

1. 面積和周長示例

# 尋找輪廓
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)# 取第 0 個輪廓
cnt = contours[0]# 輪廓面積
area = cv2.contourArea(cnt)# 周長,或者說,弧長;第二個參數的True表示該輪廓是否封閉
perimeter = cv2.arcLength(cnt, True)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

2. 輪廓近似

輪廓近似(Contour Approximation),要理解概念,先來看下面的三張圖。第一張是找到的輪廓;第二張近似的幅度很大,忽略了很多的細節;第三細節多一點.

hehe


OpenCV中是用 cv2.approxPolyDP()函數來進行輪廓的近似的。見代碼:

# 假設取第30個輪廓為例
cnt = contours[30]# 10%,即0.1的精確度
epsilon = 0.1 * cv2.arcLength(cnt, True)
approx = cv2.approxPolyDP(cnt, epsilon, True)# 這里是第二張,10%的精確度
cv2.imshow("10% approximation", approx)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

同理,第三張可以用1%的精確度來得到。


3. 計算凸包

涉及凸多面體和凹多面體的概念,不多解釋。如下圖,本來是一個手掌的形狀,現在用最小的凸多面體把它包起來。其中,凸進去(Bulge Inside)的部分,稱為凸包缺陷(Convexity Defects),即箭頭處,即偏導的局部最大值處。

convenHull

函數調用,以后用到再來細究吧!

hull = cv2.convexHull(cnt)
cv2.imshow("hull", hull)
  • 1
  • 2
  • 1
  • 2

4. 矩形邊框

矩形邊框(Bounding Rectangle)是說,用一個最小的矩形,把找到的形狀包起來。還有一個帶旋轉的矩形,面積會更小,效果見下圖

Bounding Rectangle

上代碼

# 用綠色(0, 255, 0)來畫出最小的矩形框架
x, y, w, h = cv2.boundingRect(cnt)
cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)# 用紅色表示有旋轉角度的矩形框架
rect = cv2.minAreaRect(cnt)
box = cv2.cv.BoxPoints(rect)
box = np.int0(box)
img = cv2.drawContours(img, [box], 0, (0, 0, 255), 2)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

PS其他的形狀,如?封閉的圓形橢圓直線?等,例子見這里【Contour Features】,原理差不多,不再贅述。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/387671.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/387671.shtml
英文地址,請注明出處:http://en.pswp.cn/news/387671.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【大數據】阿里云大數據助理工程師認證(ACA)課程

阿里云大數據助理工程師認證(Alibaba Cloud Certified Associate,ACA) 是面向使用阿里云大數據產品的專業技術認證,主要涉及阿里云的大數據計算、存儲、開發平臺,數據應用類的基礎產品。是對學員掌握阿里云大數據產品技…

WebGL——osg框架學習一

從今天開始,我們開始正式的學習osg框架,今天我們學習的是osg的渲染模塊,我們來看一下代碼結構。 所有DrawXXX的js模塊都是渲染的模塊,我們逐一來簡單介紹一下,第一個Drawable.js,這個模塊是描述可繪制對象的…

EmguCV 一些基本操作

一、先是在程序中圖像的導入,我是根據圖像路徑實現,其中path是string類型,是圖像路徑。 IntPtr imgCvInvoke.cvLoadImage(path, Emgu.CV.CvEnum.LOAD_IMAGE_TYPE.CV_LOAD_IMAGE_ANYCOLOR); 二、圖像灰度化處理,先創建一幅尺寸大小…

Java字符串分割

java中字符串的分割函數,split("你想要分割的字符", 你想要最多分割為多少段,正整數) 注意事項: 1.分割特殊字符考慮轉義字符的使用。如: . \ | 2.第二個參數: 無: 不傳默認分割全部…

OpenCV人臉識別的原理 .

在之前講到的人臉測試后,提取出人臉來,并且保存下來,以供訓練或識別是用,提取人臉的代碼如下: [html] view plaincopy print?void GetImageRect(IplImage* orgImage, CvRect rectInImage, IplImage* imgRect,double s…

說一下SEO和SEM到底有哪些區別?

開場白免了,我們直接說與主題相關的。 SEO和SEM到底有什么區別? SEO和SEM到底有什么區別 我們先理解字面意思: SEO(Search Engine Optimization):漢譯為搜索引擎優化。 SEM(Search Engine Marke…

django模型的繼承

很多時候,我們都不是從‘一窮二白’開始編寫模型的,有時候可以從第三方庫中繼承,有時候可以從以前的代碼中繼承,甚至現寫一個模型用于被其它模型繼承。這樣做的好處,我就不贅述了,每個學習Django的人都非常…

SpringBoot部署項目到Docker倉庫

SpringBoot部署項目到Docker倉庫1.開啟遠程控制端口Centos7開啟方式: vim /lib/systemd/system/docker.service找到ExecStart行 ExecStart/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock 重啟docker 啟動 systemctl start docker守護進程…

人臉識別經典方法

這篇文章是擼主要介紹人臉識別經典方法的第一篇,后續會有其他方法更新。特征臉方法基本是將人臉識別推向真正可用的第一種方法,了解一下還是很有必要的。特征臉用到的理論基礎PCA在另一篇博客里:特征臉(Eigenface)理論基礎-PCA(主成分分析法)…

Jquery常用正則驗證

常用校驗的正則表達式var rulesConfig { /** * str.replace(/^\s|\s$/g, ) 解析: str:要替換的字符串 \s : 表示 space ,空格 : 一個或多個 ^: 開始,^\s,以空格開始 $: 結束&#x…

svm參數說明

svm參數說明---------------------- 如果你要輸出類的概率,一定要有-b參數 svm-train training_set_file model_file svm-predict test_file model_fileoutput_file 自動腳本:Python easy.py train_data test_data 自動選擇最優參數,自動進行…

poj-3667(線段樹區間合并)

題目鏈接&#xff1a;傳送門 參考文章&#xff1a;傳送門 思路&#xff1a;線段樹區間合并問題&#xff0c;每次查詢到滿足線段樹的區間最左值&#xff0c;然后更新線段樹。 #include<iostream> #include<cstdio> #include<cstring> using namespace std; co…

面試題編程題11-python 生成隨機數

隨機整數&#xff1a; random.randint(a,b), [a,b] random.randrange(a,b,step) [a,b) 隨機實數 random.random()返回0 到1 之間的浮點數轉載于:https://www.cnblogs.com/feihujiushiwo/p/10922454.html

車牌識別之顏色選取

車牌定位是車牌識別中第一步&#xff0c;也是最重要的一步。 由于中國車牌種類多樣&#xff0c;顏色不一&#xff0c; 再加上車牌經常有污損&#xff0c;以及車牌周圍干擾因素太多&#xff0c;都成為了車牌定位的難點。 這里首先使用最簡單算法來描述車牌定位&#xff0c;以及他…

Python - 排序( 插入, 冒泡, 快速, 二分 )

插入排序 算法分析 兩次循環, 大循環對隊列中的每一個元素拿出來作為小循環的裁定對象 小循環對堆當前循環對象在有序隊列中尋找插入的位置 性能參數 空間復雜度  O(1) 時間復雜度  O(n^2) 詳細代碼解讀 import randomdef func(l):# 外層循環: 對應遍歷所有的無序數據for i…

[EmguCV|C#]使用CvInvoke自己繪製色彩直方圖-直方圖(Hitsogram)系列(4)

2014-02-0610325 0C# 檢舉文章 過年結束了&#xff0c;雖然還是學生所以其實還有兩個禮拜的假期&#xff0c;不過為了不讓自己發慌&#xff0c;趁著假期多利用充實自己&#xff0c;所以提早回到開工狀態&#xff0c;而這次總算要把一直說的自己動手繪製猜色直方圖文章寫出。 …

G.點我

鏈接&#xff1a;https://ac.nowcoder.com/acm/contest/903/G 題意&#xff1a; X腿與隊友到河北省來參加2019河北省大學生程序設計競賽&#xff0c;然而這場比賽的題目難度實在是太高了。比賽開始一個小時后&#xff0c;X腿仍然沒有做出一個題。這時候&#xff0c;X腿驚訝的發…

輪廓的查找、表達、繪制、特性及匹配(How to Use Contour? Find, Component, Construct, Features Match)

前言 輪廓是構成任何一個形狀的邊界或外形線。前面講了如何根據色彩及色彩的分布&#xff08;直方圖對比和模板匹配&#xff09;來進行匹配&#xff0c;現在我們來看看如何利用物體的輪廓。包括以下內容&#xff1a;輪廓的查找、表達方式、組織方式、繪制、特性、匹配。 查…

Android:IntentService的學習

在Android的四大組件中&#xff0c;Service排行老二&#xff0c;在Android中的主要作用是后臺服務&#xff0c;進行與界面無關的操作。由于Service運行在主線程&#xff0c;所以進行異步操作需要在子線進行。為此Android為我們提供了IntentService。 IntentService是一個抽象類…

智能商業大會構造信息化交流平臺

在快速發展的當今社會&#xff0c;所有事物都在日新月異地變化著&#xff0c;相較于過去的傳統商業的變化速度&#xff0c;現今基于數據的互聯網商業變化速度高出了一個量級&#xff0c;同時市場對于企業的應對速度也有了更高的要求&#xff0c;然而面對大體量的數據&#xff0…