【python-opencv】輪廓基本繪制


什么是輪廓?

輪廓可以簡單地解釋為連接具有相同顏色或強度的所有連續點(沿邊界)的曲線。輪廓是用於形狀分析以及對象檢測和識別的有用工具。

  • 為了獲得更高的准確性,請使用二進制圖像。因此,在找到輪廓之前,請應用閾值或canny邊緣檢測。
  • 從OpenCV 3.2開始,findContours()不再修改源圖像。
  • 在OpenCV中,找到輪廓就像從黑色背景中找到白色物體。因此請記住,要找到的對象應該是白色,背景應該是黑色。

findcontour()函數中有三個參數,第一個是源圖像,第二個是輪廓檢索模式,第三個是輪廓逼近方法。輸出等高線和層次結構。輪廓是圖像中所有輪廓的Python列表。每個單獨的輪廓是一個(x,y)坐標的Numpy數組的邊界點的對象。

注意 稍后我們將詳細討論第二和第三個參數以及有關層次結構。在此之前,代碼示例中賦予它們的值將適用於所有圖像。

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
from google.colab.patches import cv2_imshow
img=cv.imread('輪廓.jpg')
imgray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
ret, thresh = cv.threshold(imgray, 127, 255, 0)
contours, hierarchy = cv.findContours(thresh, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)

如何繪制輪廓?

要繪制輪廓,請使用cv.drawContours函數。只要有邊界點,它也可以用來繪制任何形狀。它的第一個參數是源圖像,第二個參數是應該作為Python列表傳遞的輪廓,第三個參數是輪廓的索引(在繪制單個輪廓時有用。要繪制所有輪廓,請傳遞-1),其余參數是顏色,厚度等等

  • 在圖像中繪制所有輪廓: python cv.drawContours(img, contours, -1, (0,255,0), 3)

  • 繪制單個輪廓,如第四個輪廓: python cv.drawContours(img, contours, 3, (0,255,0), 3)

  • 但是在大多數情況下,以下方法會很有用: python cnt = contours[4] cv.drawContours(img, [cnt], 0, (0,255,0), 3)

注意 最后兩種方法相似,但是前進時,您會發現最后一種更有用。

cv.drawContours(img, contours, -1, (0,255,0), 3)
cv2_imshow(img)

結果:很多人畫圖時明明用了彩色,但沒有效果,請檢查你是在哪個圖上畫,畫在灰度圖和二值圖上顯然是沒有彩色的(⊙o⊙)

 輪廓近似方法?

這是cv.findContours函數中的第三個參數。它實際上表示什么?

上面我們告訴我們輪廓是強度相同的形狀的邊界。它存儲形狀邊界的(x,y)坐標。但是它存儲所有坐標嗎?這是通過這種輪廓近似方法指定的。

如果傳遞cv.CHAIN_APPROX_NONE,則將存儲所有邊界點。但是實際上我們需要所有這些要點嗎?例如,您找到了一條直線的輪廓。您是否需要線上的所有點來代表該線?不,我們只需要該線的兩個端點即可。這就是cv.CHAIN_APPROX_SIMPLE所做的。它刪除所有冗余點並壓縮輪廓,從而節省內存。

下面的矩形圖像演示了此技術。只需在輪廓數組中的所有坐標上繪制一個圓(以藍色繪制)。第一幅圖像顯示了我用cv.CHAIN_APPROX_NONE獲得的積分(734個點),第二幅圖像顯示了我用cv.CHAIN_APPROX_SIMPLE獲得的效果(只有4個點)。看,它可以節省多少內存!!!

 

參考:http://woshicver.com/FifthSection/4_9_1_OpenCV%E4%B8%AD%E7%9A%84%E8%BD%AE%E5%BB%93/

具體的例子還可以殘參考:https://zhuanlan.zhihu.com/p/139532722


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM