Сопоставление форм в Autodesk DXF
У меня есть рисунок (в формате DXF), содержащий 9 различных форм, расположенных в случайном порядке. Мне нужно найти центральную точку каждой фигуры и вывести ее координаты x, y, чтобы я мог добавить ее в список для обработки.
Проблема в том, что я использую autocad, который сохраняет каждую фигуру как серию вершин, даже если я сначала конвертирую их в отдельные объединенные полилинии. Другими словами, открытие чертежа в текстовом редакторе просто дает мне стандартный список вершин, из которого невозможно сказать, где заканчивается одна фигура и начинается следующая.
Пока единственные решения, с которыми я добился успеха, кажутся ужасно голдбергскими. В качестве примера я могу экспортировать dxf в bmp, а затем использовать python и Opencv для идентификации каждой фигуры на основе числа контуров, которые она содержит:
import sys
import numpy as np
import cv2
im = cv2.imread('drawing.bmp')
im3 = im.copy()
gray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray,(5,5),0)
thresh = cv2.adaptiveThreshold(blur,255,1,1,11,2)
contours0, hierarchy = cv2.findContours( thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
contours = [cv2.approxPolyDP(cnt, 4, True) for cnt in contours0]
samples = np.empty((0,100))
responses = []
keys = [i for i in range(30,90)]
for cnt in contours:
tot = cv2.contourArea(cnt)
[x,y,w,h] = cv2.boundingRect(cnt)
if tot in range(1200,1250):
cv2.putText(im,"shape 3",(x+(w/2),y+(h/2)),0,1,(0,255,0))
cv2.imshow('norm',im)
key = cv2.waitKey(0)
Затем я могу взять вывод, масштабировать его по мере необходимости и перечислить x, y. Однако это занимает невероятно много времени и может в конечном итоге потерять слишком большую точность, чтобы его можно было использовать (пиксели не являются плавающими).
Должен быть какой-то способ найти эти фигуры, просто прочитав dxf, иначе autocad не сможет их отобразить, и у меня будет только облако точек.
Так как именно он узнает, чтобы я мог сказать python, что нужно искать, чтобы определить отличительную форму при чтении dxf в виде текстового файла?