Маркировка контуров числами и затем извлечение координат любого нумерованного контура - PullRequest
0 голосов
/ 09 мая 2018

Мне нужно обозначить каждый контур числами, чтобы с помощью следующего кода я мог извлечь координаты этого конкретного контура.

Вот изображение:

image

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()`

1 Ответ

0 голосов
/ 12 мая 2018

В вашем коде необходимо упомянуть пару вещей:

  1. Во-первых, когда вы хотите найти контуры, форма должна быть белого цвета.Предоставленное вами изображение имеет темные фигуры.Поэтому мне пришлось инвертировать ваше изображение и затем найти контуры.

  2. Во-вторых, вы сохраняли координаты только одного контура.Я изменил ваш код для хранения координат для каждого контура в отдельном файле.

Код:

import numpy as np
import cv2

THRESHOLD = 55

path = 'C:/Users/Desktop/'
im = cv2.imread(path + 'date.jpg')
imgray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
cv2.imshow("imgray", imgray)

ret, thresh = cv2.threshold(imgray, THRESHOLD, 255, 0)
cv2.imshow('thresh', thresh)

_th, contours, hierarchy = cv2.findContours(cv2.bitwise_not(thresh),     cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
print "Number of contours detected = %d" % len(contours)

cv2.drawContours(im, contours, -1, (1, 70, 255), 2)
cv2.imshow("Contours", im)

contour_num = 0 
for i in range(0, len(contours)):
    coords = np.array2string(contours[i])
    contour_num+=1
    open(path + 'contour_%d.txt' %contour_num, "w").write(coords)

cv2.waitKey(0)
cv2.destroyAllWindows()

Запустите код как онесть и посмотреть сохраненные файлы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...