Как извлечь координаты из определенного контура?

Мне нужно найти специфичные для контура координаты, как видно на этом изображении. Я могу нарисовать определенный контур (выделен красным), но .txt Файл дает тот же набор координат, даже если я изменяю контур.

import numpy as np
import cv2
im = cv2.imread("ceramic.bmp")
imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(imgray,55,255,0)
_th,contours, hierarchy = 
cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
print" Number of contours detected %d.>"%len(contours)
cv2.drawContours(im,contours,55,(1,70,255)) #-1 fills it
area = cv2.contourArea(contours[55])
print (area)
cv2.imshow("Contours",im)
text_file = open("contour_list_55.txt", "w")    ##### Write the 
coordinates (x,y) of a contour in an txt file python 
text_file.write( "%s"% contours) 
text_file.close()
cv2.waitKey(0)
cv2.destroyAllWindows()`

1 ответ

Это потому, что вы записываете все контуры в файл, а не только один контур.

Вы рисуете контур с индексом 55:

area = cv2.contourArea(contours[55])

Но ваша команда для файла.txt:

text_file.write( "%s"% contours)

Это должно быть что-то вроде:

text_file.write( "%s" % contours[55] )

То есть, если вы хотите получить координаты того же контура, который вы рисуете.

Я также обычно советую вам следовать принципу СУХОЙ (не повторять себя) в программировании. Если у вас есть константа (например, 55), вы должны определить ее и использовать по имени в коде. Например:

import numpy as np
import cv2

THRESHOLD = 55
CONTOUR = 55

im = cv2.imread("ceramic.bmp")
imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(imgray,THRESHOLD,255,0)
_th,contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
print "Number of contours detected = %d" % len(contours)
cv2.drawContours(im,contours,CONTOUR,(1,70,255))
area = cv2.contourArea(contours[CONTOUR])
print (area)
cv2.imshow("Contours",im)
np.set_printoptions(threshold=np.inf)
coords = np.array2string(contours[CONTOUR])
open("contour_%d.txt" % CONTOUR, "w").write(coords)
cv2.waitKey(0)
cv2.destroyAllWindows()`

Он запишет координаты в файл contour_55.txt, А если вы хотите изменить другой контур, вам просто нужно изменить константу CONTOUR.

Другие вопросы по тегам