OpenCV-Python 輪廓特徵|二十二

2021-01-11 人工智慧遇見磐創

目標

在本文中,我們將學習

如何找到輪廓的不同特徵,例如面積,周長,質心,邊界框等。您將看到大量與輪廓有關的功能。1. 特徵矩

特徵矩可以幫助您計算一些特徵,例如物體的質心,物體的面積等。請查看特徵矩上的維基百科頁面。函數cv.moments()提供了所有計算出的矩值的字典。見下文:

import numpy as npimport cv2 as cvimg = cv.imread('star.jpg',0)ret,thresh = cv.threshold(img,127,255,0)contours,hierarchy = cv.findContours(thresh, 1, 2)cnt = contours[0]M = cv.moments(cnt)print( M )從這一刻起,您可以提取有用的數據,例如面積,質心等。質心由關係給出,$Cx = frac{M{10}}{M{00}}$ 和 $Cy = frac{M{01}}{M{00}}$。可以按照以下步驟進行:

cx = int(M['m10']/M['m00'])cy = int(M['m01']/M['m00'])2. 輪廓面積

輪廓區域由函數cv.contourArea()或從矩M['m00']中給出。

area = cv.contourArea(cnt) 3. 輪廓周長

也稱為弧長。可以使用cv.arcLength()函數找到它。第二個參數指定形狀是閉合輪廓(True)還是曲線。

perimeter = cv.arcLength(cnt,True)4. 輪廓近似

根據我們指定的精度,它可以將輪廓形狀近似為頂點數量較少的其他形狀。它是Douglas-Peucker算法的實現。檢查維基百科頁面上的算法和演示。

為了理解這一點,假設您試圖在圖像中找到一個正方形,但是由於圖像中的某些問題,您沒有得到一個完美的正方形,而是一個「壞形狀」(如下圖所示)。現在,您可以使用此功能來近似形狀。在這種情況下,第二個參數稱為epsilon,它是從輪廓到近似輪廓的最大距離。它是一個精度參數。需要正確選擇epsilon才能獲得正確的輸出。

epsilon = 0.1*cv.arcLength(cnt,True) approx = cv.approxPolyDP(cnt,epsilon,True)下面,在第二張圖片中,綠線顯示了ε=弧長的10%時的近似曲線。第三幅圖顯示了ε=弧長度的1%時的情況。第三個參數指定曲線是否閉合。

5. 輪廓凸包

凸包外觀看起來與輪廓逼近相似,但不相似(在某些情況下兩者可能提供相同的結果)。在這裡,cv.convexHull()函數檢查曲線是否存在凸凹缺陷並對其進行校正。一般而言,凸曲線是始終凸出或至少平坦的曲線。如果在內部凸出,則稱為凸度缺陷。例如,檢查下面的手的圖像。紅線顯示手的凸包。雙向箭頭標記顯示凸度缺陷,這是凸包與輪廓線之間的局部最大偏差。

關於它的語法,有一些需要討論:

hull = cv.convexHull(points[, hull[, clockwise[, returnPoints]] 參數詳細信息:

點是我們傳遞到的輪廓。凸包是輸出,通常我們忽略它。順時針方向:方向標記。如果為True,則輸出凸包為順時針方向。否則,其方向為逆時針方向。returnPoints:默認情況下為True。然後返回凸包的坐標。如果為False,則返回與凸包點相對應的輪廓點的索引。因此,要獲得如上圖所示的凸包,以下內容就足夠了:

hull = cv.convexHull(cnt) 但是,如果要查找凸度缺陷,則需要傳遞returnPoints = False。為了理解它,我們將拍攝上面的矩形圖像。首先,我發現它的輪廓為cnt。現在,我發現它的帶有returnPoints = True的凸包,得到以下值:[[[234 202]],[[51 202]],[[51 79]],[[234 79]]],它們是四個角 矩形的點。現在,如果對returnPoints = False執行相同的操作,則會得到以下結果:[[129],[67],[0],[142]]。這些是輪廓中相應點的索引。例如,檢查第一個值:cnt [129] = [[234,202]]與第一個結果相同(對於其他結果依此類推)。

當我們討論凸度缺陷時,您將再次看到它。

6. 檢查凸度

cv.isContourConvex()具有檢查曲線是否凸出的功能。它只是返回True還是False。沒什麼大不了的。

k = cv.isContourConvex(cnt) 7. 邊界矩形

有兩種類型的邊界矩形。

7.a.直角矩形

它是一個矩形,不考慮物體的旋轉。所以邊界矩形的面積不是最小的。它是由函數cv.boundingRect()找到的。

令(x,y)為矩形的左上角坐標,而(w,h)為矩形的寬度和高度。

x,y,w,h = cv.boundingRect(cnt)cv.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)7.b. 旋轉矩形

這裡,邊界矩形是用最小面積繪製的,所以它也考慮了旋轉。使用的函數是cv.minAreaRect()。它返回一個Box2D結構,其中包含以下細節 -(中心(x,y),(寬度,高度),旋轉角度)。但要畫出這個矩形,我們需要矩形的四個角。它由函數cv.boxPoints()獲得

rect = cv.minAreaRect(cnt)box = cv.boxPoints(rect)box = np.int0(box)cv.drawContours(img,[box],0,(0,0,255),2)兩個矩形都顯示在一張單獨的圖像中。綠色矩形顯示正常的邊界矩形。紅色矩形是旋轉後的矩形。

8. 最小閉合圈

接下來,使用函數**cv.minEnclosingCircle(*()查找對象的圓周。它是一個以最小面積完全覆蓋物體的圓。

(x,y),radius = cv.minEnclosingCircle(cnt)center = (int(x),int(y))radius = int(radius)cv.circle(img,center,radius,(0,255,0),2)

9. 擬合一個橢圓

下一個是把一個橢圓擬合到一個物體上。它返回內接橢圓的旋轉矩形。

ellipse = cv.fitEllipse(cnt)cv.ellipse(img,ellipse,(0,255,0),2)

10. 擬合直線

同樣,我們可以將一條直線擬合到一組點。下圖包含一組白點。我們可以近似一條直線。

rows,cols = img.shape[:2][vx,vy,x,y] = cv.fitLine(cnt, cv.DIST_L2,0,0.01,0.01)lefty = int((-x*vy/vx) + y)righty = int(((cols-x)*vy/vx)+y)cv.line(img,(cols-1,righty),(0,lefty),(0,255,0),2)

相關焦點

  • opencv-python圖像預處理-濾波
    頻率域是指從函數的頻率角度出發分析函數,對圖像進行傅立葉變換可以將圖像由圖像空間轉換到頻域空間,然後在頻率域中對圖像的頻譜作分析處理,以改變圖像的頻率特徵。空間域與頻率域是兩種不同的技術,都可以實現對圖像的濾波、增強,只是有些處理方式更適合在空間域完成,而有些則更適合在頻率域中完成。
  • 如何快速簡單的安裝opencv-python
    這樣就會從清華鏡像安裝opencv-contrib-python庫。目前opencv最新版本為4.1.1 ----2019-8-28在opencv-contrib-python 版本中含有額外模塊( Extra modules ),而 opencv-python 版本中只含有基礎模塊。
  • 使用OpenCV和Python構建自己的車輛檢測模型
    utm_source=blog&utm_medium=vehicle-detection-opencv-python)利用深度學習的計算機視覺(https://courses.analyticsvidhya.com/courses/computer-vision-using-deep-learning-version2?
  • 「python opencv視覺零基礎」十、圖片效果毛玻璃
    一、學習目標了解高斯模糊的使用方法了解毛玻璃的圖片效果添加了解如何自己做一個噪聲圖片目錄「python opencv 計算機視覺零基礎實戰」 第一節「python opencv視覺入門到實戰」二、格式與攝像頭「python opencv 視覺入門到實戰」 三、圖像編輯「python opencv視覺入門到實戰
  • 【OpenCV+Python】輪廓特徵中階
    本次我們將討論OpenCV中圖像輪廓的另一些特徵,它們將非常有用。有兩類邊界矩形。
  • 「python opencv視覺零基礎」十四、直方圖反向投影
    前文提醒:博主正在參加博客之星評比,成功入選Top200,現在暫居第九歡迎各位點擊了解更多幫我投票,非常感謝~目錄「python opencv 計算機視覺零基礎實戰」 第一節「python opencv視覺入門到實戰」二、格式與攝像頭「python opencv 視覺入門到實戰」 三、圖像編輯「python
  • 基於opencv 的圖像處理入門教程
    /opencv_noteshttps://github.com/ccc013/CodesNotes/blob/master/opencv_notes/opencv_image_process_tutorial.ipynb1.
  • 「python opencv視覺零基礎實戰」七邏輯運算應用
    一、學習目標了解opencv中圖像的邏輯運算了解opencv中邏輯運算的應用如有錯誤歡迎指出~目錄「python opencv 計算機視覺零基礎實戰」 第一節「python opencv視覺入門到實戰」二、格式與攝像頭「python opencv 視覺入門到實戰」 三、圖像編輯「python
  • 「python opencv計算機視覺零基礎到實戰」九模糊
    一、學習目標了解什麼是卷積了解模糊的使用方法與應用目錄「python opencv 計算機視覺零基礎實戰」 第一節「python opencv視覺入門到實戰」二、格式與攝像頭「python opencv 視覺入門到實戰」 三、圖像編輯「python opencv視覺入門到實戰」 第四節色彩空間
  • opencv-python獲取圖像:面向對象與面向過程
    這裡需要注意以下,opencv讀取圖片默認通道為BGR的格式,當在其他UI用戶界面顯示圖像時注意轉換一下通道順序,例如BGR轉換成RGB:Image1=cv2.cvtColor(image, cv2.COLOR_BGR2RGB)下面讀取一張圖片並顯示
  • 「python opencv視覺零到實戰」八、圖片選區操作
    一、學習目標了解什麼是ROI了解floodFill的使用方法如有錯誤歡迎指出~目錄「python opencv 計算機視覺零基礎實戰」 第一節「python opencv視覺入門到實戰」二、格式與攝像頭「python opencv 視覺入門到實戰」 三、圖像編輯「python opencv視覺入門到實戰
  • 資料| Practical Python and OpenCV 一周時間帶你入門CV
  • Python中如何利用Opencv打開視頻或圖像並用PyQt控制項顯示
    一、python中opencv打開圖像方法:import cv2filename='dog.jpg'img=cv2.imread(filename)cv2.imshow('Main Window',img)cv2.waitKey() #任意鍵退出cv2.destroyAllWindows()二、python中用opencv打開視頻頭的方法:
  • OpenCV中的快速直線檢測
    本文範例運行環境FastLineDetectors運行必要條件FastLineDetectors屬於opencv-contrib中的模塊,需要安裝opencv-contrib-python。在python的opencv相關的安裝包中,opencv-python 包含主要模塊,opencv-contrib-python 包含主要模塊以及一些擴展模塊。但這兩個模塊並不兼容,如果已經安裝過opencv-python,需要先卸載,再安裝opencv-contrib-python。
  • OpenCV特徵點檢測——ORB特徵
    這個特徵描述子是由EPFL的Calonder在ECCV2010上提出的。主要思路就是在特徵點附近隨機選取若干點對,將這些點對的灰度值的大小,組合成一個二進位串,並將這個二進位串作為該特徵點的特徵描述子。
  • OpenCV測量物體的尺寸技能 get~
    實際上相當於參考物的作用,例如已知圖上的參考物多大,我們便可以利用這個參考物體換算到圖上其他物體的尺寸大小。cv2.CHAIN_APPROX_SIMPLE)cnts = imutils.grab_contours(cnts)# 從左往右對輪廓進行排序# 初始化'pixels per metric' 校準變量(cnts, _) = contours.sort_contours(cnts)pixelsPerMetric = None2-4行 從磁碟中導入圖片,轉換為灰度圖,然後用高斯濾波進行平滑
  • OpenCV-Python 輪廓屬性|二十三
    範圍範圍是輪廓區域與邊界矩形區域的比值。area = cv.contourArea(cnt)x,y,w,h = cv.boundingRect(cnt)rect_area = w*hextent = float(area)/rect_area3. 堅實度堅實度是等高線面積與其凸包面積之比。
  • 基於python+OpenCV模塊的人臉識別定位技術
    本文將基於OpenCV模塊,在windows作業系統上,利用python語言,進行人臉識別技術的研究。當然OpenCV的應用領域很廣,除了人臉識別之外,它還支持圖像分割、動作識別、視頻處理等技術。代碼第1行導入opencv模塊。代碼的第3行(以上圖為準,空行也算一行),導入別人已經訓練好的臉部識別資料庫。這裡用到的數據是在github上開源的已經訓練好的分類器,如圖所示:需要將對應的數據文件(.xml文件)下載到指定目錄(代碼中的示例,展示的是與.py文件同一目錄下)。
  • 基於OpenCv 和 Python 的手指識別及追蹤
    翻譯 | 餘杭 Lamaric 校對 | 吳曉曼 審核 | 餘杭詳細代碼參考:https://github.com/amarlearning/opencv手指追蹤是許多計算機視覺應用的重要特徵。在該應用中,使用基於直方圖的方法將手與背景幀分離。
  • Python第三方庫安裝
    pypi.org其中PyPI: Python Package Index是由PSF維護的展示全球Python計算生態的主站如要安裝圖像處理opencv-python庫可以搜索 opencv,但結果如下: