明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4261|回复: 11

关于Autocad中图形识别的问题

  [复制链接]
发表于 2003-2-6 01:45:00 | 显示全部楼层 |阅读模式
本人先正在用V lisp编写一可在AutoCAD视图中识别相应图形的程序,目前只能识别出相当简单的图形,而且当Autocad文件中enitiy很多时正确率相当底。另外在对图片放大或缩小后,识别也回发生问题。我想可能那高手也曾经做过类似的程序,可否指点本人一下。
发表于 2003-2-6 09:46:00 | 显示全部楼层

识别什么东西?

 楼主| 发表于 2003-2-6 23:49:00 | 显示全部楼层

识别各种有意义的图形

在Autocad 文件中识别各种有意义的图形,并用block命令将组成该图形的entity关联起来。例如:一张Autocad建筑设计图纸中可能包含为数相当多的插座图形。这些图形的形状相同,但分布在不同的位置(也可能会有不同的大小和角度)。我要做的就是识别所有的电灯图形,并将它们make block。
发表于 2003-2-7 09:33:00 | 显示全部楼层

电灯图形的识别条件是什么?

发表于 2003-2-7 13:01:00 | 显示全部楼层

你这些电灯图形是怎么画进去的,不是都是一笔一划地画上去的吧

 楼主| 发表于 2003-2-7 19:40:00 | 显示全部楼层

我的项目介绍,希望大家指点

电灯是一笔一笔画上去的,至少第一个电灯是这样,其他的只不过是copy并给以不同的角度。 我现在要做的是把所有这些一笔一笔画上去的电灯图形自动的make block.

其实这是一个公司给我们学校的项目,先由我来做。 该公司的业务就是为其他设计公司处理AUTOCAD设计文件。所谓处理,既规范化这些图纸。将所有重复的一笔一笔画上去的图形(如电灯)全部由block来代替,并在block中添加与网页的连接。因此在图纸上点击已经替换为block的电灯图形后,就可以访问到相关的网页,得到相关的信息,(如设计使用的电灯的品牌,数量,价格等等)。目前这个规范过程是由手工完成的,即操作员发现一个重复图形,如果是第一次发现就选择所有组成该图形的entity并调用autocad的block命令将其convert成BLOCK。如果已经有相应的BLOCK就删除所有组成该图形的entity并用相应的block替换。但公司希望能过利用图形识别技术来自动完成。这就是我要做的。
 楼主| 发表于 2003-2-7 19:50:00 | 显示全部楼层

不懂

斑竹问我什么是识别条件,我很难理解其中的意思。
识别就是在AUTOCAD文件中自动找到我想要的图形。
我认为如果一个图形是设计师一笔一笔画上去的,那么这些在文件中是没有任何关系的。唯一能够将他们联系起来成为一个有意义图形的关系是:在视图上线条与线条之间的位置关系。这种关系有可分解为每条线条与其他线条的距离,角度,以及相对程度。这个位置关系是识别的基础。
我想你所指的条件应该是指这个吧,只有在这个条件的下识别才是可行的。
 楼主| 发表于 2003-2-7 21:03:00 | 显示全部楼层

先介绍以下目前的进展

关于我这个项目的背景我在“我的项目介绍,希望大家指点”一帖中已经做了简单的介绍。我想我还是有必要阐述以下我自己关于该项目的想法和该项目目前的进展,抛砖引玉。

我认为,如果一个图形是由设计者一笔一笔画上的,那这个图形中的所有线条,除了在视图中有相对的位置和大小关系外,不存在其他关系。
因此,若要识别该图形,我们所能利用的只有这种位置大小关系。
因此,我们必须事先定义识别的模板,该模板描述了图形的特征,这些特征是由线条之间相互关系统计出来的。可能包括图形的线段的数量,fourier descriptor Spline值等信息。

所谓识别就是那被识别的图形与预定义的模板比较,但问题是,如何才能找出被识别的图形。在autocad视图中不仅仅有组成我们要识别的图形的线条,还有更多属于其他图形的线条,和独立线条。我们如何才能把组成我们要识别的图形的线条从中分离出来?

这个问题我也仍然没有解决,我尝试了不少方法。
我用的第1中方法是试图在图形模板中定义一条关键线段,并列出一些公式包含在模板中。这些公式是用来计算图形的选取框的。在AUTOCAD遍历每一条线段,套用公式计算出选取框,用ssget选取区域,然后再叫所选种的这组线条与模板比较。相同则认为找到,不同则掠过。这种方法在图纸相当简单的情况下工作的不错,但一旦图纸比较复杂,选取选取框时会选种其他不属于该图形的线条,这样原本应该被识别的却被掠过了。

后来,我改进了这中方法,不仅仅计算出选取框,而是计算出图形的整个轮廓,但是在lisp中ssget函数好象不支持超过4个点的选取范围,因此也没成功。

我用的第2种方法是在模板中详细定义每条线条与其他线条之间的关系,确保中一条线段出发,我们可以找到整个图形。这种方法比较精确,但是计量太大,大的无法忍受,没寻找一条线就要遍历整个视图。而且抗干扰,自动纠正能力很低,手工绘制的图形不可能完全一样。漏掉不重要的线条,或角度有点偏差是很常见的。在这种情况下用这种方法,识别率很低。

我用的第3种方法是融合第1第2种。在一个选择集内采用方法2的检查,这种方法比较好,但只是在与识别图形相当简单的情况下。当图形比较复杂时定义图形中每条线段之间的位置关系变的相当麻烦。但是我对第3中方法还是比较满意,需要改进的是如何用一个比较智能的描述来代替现有的复杂的描述。

其实写这篇东西也帮我自己理了以下思路,关键的问题仍然在模板的定义上。该模板应该有两大功能,
第一,能够依据模板在AUTOCAD众多的线段中提取出被识别的图形。
第二,进一不检查被识别图形的特征,提高识别准确性。

我觉得我这个项目似乎和OCR比较相似,OCR识别汉字,我的则识别图形,而我要识别的图形与汉字有十分相似。所不同的是被识别图形分离这个过程。OCR的过程是扫描,分行,分字,矢量化,特征识别。而我的项目必须通过线段之间的位置关系来分离出被识别图形,再特征识别。但第一个步骤中也要包含到识别,不然无法提取。脑子又有点糊涂了,不要说我的项目比OCR还难吧,中国可是用了怎么多人花了20年才研究出OCR汉字识别!
发表于 2003-2-8 13:30:00 | 显示全部楼层

您想做的已经有若干人试过,可能都没成功,因为“电脑”可不是您的脑子...

必须限定清晰、有限的、确定的识别条件。
发表于 2003-2-8 22:29:00 | 显示全部楼层

一个想法

你的模板应该包含你所要的图形,然后取一个比较有特征的对象(也就是比较特殊一点)做为特征对象,再取第二个对象为第二特征对象,其实第一对象与第二对象的相对关系也应该明确。还有该对象的选择框(一般需要定义多点,也就是多边形窗选用的点,越接近对象的外框越好)。
通过第一个特征对象对整个图形进行SSGET,特征包括图层、对象名称。这个特征对象最好是圆弧或圆,这样就可以包含半径等过滤器条件,这样在整个图形的过滤中过滤出的对象可能会比较少,这是第一步。
通过过滤出的对象逐一再比较它的其它属性,如果是直接则比较长度,如果是圆弧则比较弧长或夹角。这样又可以过滤出更少的对象了。
这样的话,已经比较接近你的需要了。对逐一对象按与源对象的相对关系(也就是角度及坐标位置)转换多边形窗选用的点坐标来形成要选取的对象的点坐标,然后对每一对象进行SSGET。
如果选取出的对象总数小于模板的对象数,则可略过,如果等于或大于,则有可能,这样就可对第二特征对象进行识别,如果第二特征对象也吻合(包括对象本身相符及与第一特征对象的相对位置相符),这时如果也相同时应该可以判断该选择集是否有效了。
如果选择集对象数相同,则这时应该可以判定相同了,如果大于,则应该从头到尾把不属于该图块的对象过滤出去了。
注意选择第一特征对象及第二特征对象很重要,如果图中有许多类似的图形,则更为重要,不然会出些大的错误了。
此想法不知可否。
另外,SSGET是可以使用多边形选择对象的,如仔细看看帮助文件吧。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-26 05:29 , Processed in 0.187849 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表