Я использовал следующий код, чтобы получить выпуклую оболочку для изображения заданного вами:
import cv2
import numpy as np
img = cv2.imread('2.png')
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(img_gray, 127, 255, 0)
contours,hierarchy = cv2.findContours(thresh,2,1)
print len(contours)
cnt = contours[0]
hull = cv2.convexHull(cnt,returnPoints = False)
defects = cv2.convexityDefects(cnt,hull)
for i in range(defects.shape[0]):
s,e,f,d = defects[i,0]
start = tuple(cnt[s][0])
end = tuple(cnt[e][0])
far = tuple(cnt[f][0])
cv2.line(img,start,end,[0,255,0],2)
cv2.circle(img,far,5,[0,0,255],-1)
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
Поскольку контуры основаны на белой области в изображении, я был в состоянии для получения двух типы контуров путем изменения строка 5 в коде.
СЛУЧАЙ 1:
Я был в состоянии получить это:
СЛУЧАЙ 2: Теперь, когда я изменить пятую линию в сегменте кода, я получите это: , когда я инвертирую двоичное изображение ret, thresh = cv2.threshold(img_gray, 127, 255, 1)
Это происходит потому, что в случае 1 контур был найден на основе этого образа
Сейчас в случае 2 контур был найден на основе этого образа
Как вы можете видеть, контуры найдены основанный на белый регион в двоичном образе.
Надеюсь, это поможет.
Я использовал THIS LINK для получения кода и для справки.
Кто-нибудь знает? Все еще не удается найти исправление. –
Вы можете загрузить изображение, с которым работаете? –
@JeruLuke Много изображений, каждое из изображений ограничено. Я создаю платформу OCR, поэтому каждый ROI - это другой персонаж. –