一個空心的形狀,以下面的情況為例,被檢測為 2 個物件,外部三角形(可以看作只是一個輪廓)以某種方式被檢測為 2 個物件,如第二張影像所示(2 個綠色輪廓內外的外部黑色三角形)。
第一張圖片:

第二張圖片(我的代碼的結果):

預期結果:

我的代碼:
import os
import cv2
import numpy as np
file_name = os.path.join(os.path.dirname(__file__),'hollowtri.png')
assert os.path.exists(file_name)
a = cv2.imread(file_name)
#Convert image to gray image
imgGray = cv2.cvtColor(a,cv2.COLOR_BGR2GRAY)
#Doing threshold on the image
_,thresh = cv2.threshold(imgGray,100,255,cv2.THRESH_BINARY_INV)
#Finding objects
contours,_ = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
#Print the result based on the contours found
num = 0
for contour in contours:
cv2.drawContours(a,contours,num,(0,255,0),2)
num =1
cv2.imshow("Thresh", thresh)
cv2.imshow("Triangle", a)
cv2.waitKey(0)
我不想用cv2.RETR_EXTERNAL是因為我想檢測到內部實心三角形,那么有沒有解決這個問題的辦法呢?我希望將外部三角形檢測為僅 1 個物件。
注意:只有黑色的形狀是關注的物件。所以結果應該只包含 2 個物件,但在影像 2 中,外部三角形在內部和外部用綠色勾勒了兩次,我的目標是只勾勒一次,因為空心三角形只是 1 個物件,而不是 2 個。
uj5u.com熱心網友回復:
為了解決您的問題,選擇flag很重要。我們正在處理一個輪廓位于另一個輪廓內的情況。我們可以RETR_CCOMP在尋找輪廓時使用標志cv2.findContours()。并分析層次輸出。
介紹
在下面的二值影像中,我們有一個物件,但在尋找輪廓時,我們最終得到 2 個(意味著 2 個不同的物件)。
- 輪廓 1(以紅色表示)是物件的外邊界 - 這是具有值的父物件
-1 - 輪廓 2(以綠色表示)是物件的內邊界 - 這是具有值的子物件
0

我們感興趣的是只找到每個不同物件的外邊界。在上圖中,這只是輪廓 1。
代碼:
img = cv2.imread(r'C:\Users\524316\Desktop\Stack\tri.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
th = cv2.threshold(gray,100,255,cv2.THRESH_BINARY_INV)[1]
# using cv2.RETR_CCOMP flag
contours,hierarchy = cv2.findContours(th,cv2.RETR_CCOMP,cv2.CHAIN_APPROX_NONE)
# initializing an index list
contour_index_list = []
# draw every contour whose 4th column in hierarch array is -1
for index in range(0, len(contours)):
if (hierarchy[:,index][0][3] == -1):
contour_index_list.append(index)
cv2.drawContours(img, [contours[index]], 0, (0, 255, 0), 3)
結果:

細節:
觀察hierarchy變數給出一個陣列,每一行分配給每個輪廓:
array([[[ 1, -1, -1, -1],
[-1, 0, 2, -1],
[-1, -1, -1, 1]]], dtype=int32)
根據檔案,第 4 串列示父子關系。如果值為:
- -1 輪廓是父級
- 0 輪廓是一個孩子
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/471834.html
標籤:Python opencv 图像处理 计算机视觉 轮廓
上一篇:如何檢測帶顏色的圓圈
下一篇:影像混合:透明黑色區域
