我有一张图纸(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 作为文本文件读取时要寻找什么来识别不同的形状?