Невозможно получить контур правильно
Я играю с openCV и делаю простую задачу ниже.
1) Читать изображение
2) порог
3) Нахождение контуров.
4) Рисование всех контуров на чистом изображении.
5) Нанесение индивидуального контура.
Рисование всех контуров на фиктивном изображении выглядит хорошо, тогда как рисование одного контура создает рассеянный контур, как показано на изображениях ниже.
Оригинал:
Все контуры:
Одиночный контур:
Пожалуйста, найдите код ниже.
import cv2
import numpy as np
#Reading Image.
srcImg = cv2.imread("./bottle.jpeg")
#Color Conversion.
grayedImg = cv2.cvtColor(srcImg,cv2.COLOR_RGB2GRAY)
__, thresholdedImg = cv2.threshold(grayedImg, 240, 255, cv2.THRESH_BINARY)
#Noice Removal
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))
erodeImage = cv2.erode(thresholdedImg,kernel, iterations=1)
dilatedImg = cv2.dilate(erodeImage,kernel, iterations=1)
_, contours, _ = cv2.findContours(dilatedImg,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
#draw All Contours.
dummyImg = np.zeros(grayedImg.shape, dtype=grayedImg.dtype)
cv2.drawContours(dummyImg, contours, -1, 255, 1)
cv2.imshow("All Contours", dummyImg)
cv2.imwrite("allContours.jpeg",dummyImg)
#draw Individual Contours.
mask = np.zeros(dummyImg.shape[:2], dtype= dummyImg.dtype)
isolatedImg = cv2.drawContours(mask, contours[9], -1, 255, 1)
cv2.imshow("Indivial Contours.", isolatedImg)
cv2.imwrite("single.jpeg",isolatedImg)
cv2.waitKey(0)
1 ответ
Решение
Вы должны заключить еще один набор квадратных скобок:
isolatedImg = cv2.drawContours(mask, [contours[9]], -1, 255, 1)
Ожидаемый результат:
Если вы копаете глубоко, cv2.findContours()
возвращает list
массивов. Теперь каждый array
содержит сведения о количестве точек, составляющих контур.