网站导航网学 原创论文 网站设计 最新系统 最新研究 原创论文 获取论文 论文降重 发表论文 论文发表 UI设计定制 论文答辩PPT格式排版 期刊发表 论文专题
返回网学首页
网学原创论文
最新论文 推荐专题 热门论文 论文专题
当前位置: 网学 > 设计下载 > VC与C++类别 > 正文

对简单图形的识别[Bmp文件]

来源:http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 13/05/14

网学网为需要VC与C++类别的朋友们搜集整理了对简单图形的识别[Bmp文件]相关资料,希望对各位网友有所帮助!

QQ交谈客服咨询,网学网竭诚为您服务,本站永久域名:myeducs.cn

2.3 多义域分裂和单义域的识别
对2.1中得到的多义域,运用最小二乘法进行拟合,对于拟合不成功的多义域运用首尾相连最大距离法进行分裂,得到单义域,并记录下各单义域的拟合结果,供全局考虑,识别直线和圆用。
算法描述如下:
1. 从2.1得到的多义域列表里取第一个多义域;
2. 对选中的多义域运用最小二乘法进行圆的拟合;如果得到的平均径向误差和最大径向误差小于指定阈值,则认为拟合成功,该多义域为一圆弧的单义域;记录拟合的结果,作为总体识别的种子圆,转向5执行,否则执行3。
3. 对选中的多义域运用最小二乘法进行直线拟合;如果得到的平均距离误差和最大距离误差小于指定阈值,则认为拟合成功,该多义域为一线段的单义域;记录拟合结果,作为总体识别的种子直线,转向5执行,否则执行4。
4. 该多义域为多个线段或圆弧的组合。将该多义域的头尾节点连接,计算该多义域中各点与头尾节点连线的距离,取距离最大的点,对该多义域进行分裂,得到两个新的多义域,取代原先的多义域;转向2执行。
5. 取多义域列表中的下一个,转向2执行。
由此,所有的多义域都分裂为单义域,并对各单义域进行了拟合。
2.4 总体整合,识别直线和圆
对2.3得到的单义域列表进行总体的整合,得到直线和圆。
1. 选取单义域列表中的第一个单义域,将其拟合的图形(直线或圆)作为种子图形;
2. 将列表中其他单义域的识别结果与种子图形进行比较,如果误差小于指定阈值,则属于同一直线或同一圆,将其与选定单一域进行合并,从列表中删除该单义域;
3. 计算选定单义域的几何数据,得到图形;
4. 选取列表中的下一个单义域,转动2执行。
3. 主要技术
3.1 Borland C++ Builder
本论文的编程环境之所以选用c++ builder 是因为他有以下的优点:
⑴.输出入接口设计简单
⑵.提供一流的开发环境
⑶.提供最标准的C/C++鲁开发工具
⑷.提供丰富的组件与最强劲的调试工具VCL类库中封装了Windows的图形设备接口(GDI),使得用户很方便地在应用程序添加图像或处理图像。
图像类主要有Tbitmap、TBrush、TCanves、TFont、TgraphakControl、Tgraphic、Ticon、TJPEGImage、TPen和Tpictur以Tmatifile类。
3.2 虚类及虚方法的使用
虚类和虚方法的使用在本论文中主要是Cshapes基类及虚方法的实现。
第三章 直线和圆的识别和编辑的实现
第一节 系统的层次结构的图示
 

第二节 系统数据结构及类的设计
1. 主要类的层次结构
1.1 图形处理类:

1.2 识别用类:
 

2. 图形基类(CShape)
2.1 描述
图形基类,提供所有图形的标准属性和方法。其他图形类(直线、圆)等都是该类的子类,继承其所有的public属性和方法,对其中的虚方法(virtual)进行重定义和实现。
该类为虚类,其成员函数主要为虚函数,为其所有子类提供统一的接口,但是没有实现。其他模块对图形进行操作时,除非生成新的实例(Instance),都无须知道所操作的是哪个具体的图形,而统一使用Cshape类型,为程序的实现、扩充和维护提供很大方便。
2.2 实现
class CShape {
public:
/* 属性定义 */
//前景色(由于时间等的限制,本系统暂时只定义该图形的属性,其
// 他如:填充色,线条型,填充型等可扩充)
TColor color;
/* 编辑用属性 */
//编辑时标志该图形是否被选择
bool isSelected;
//编辑操作所选中的点
TPoint * editP
/* 识别用属性 */
// 识别的效果描述,值越小说明识别效果越好
// 最小二乘法的平均误差;
// 霍夫变换:1 - 参数空间中该图形的值/最大值
double chance;
//图形上点的数量
int pointCount;
/* 成员函数定义 */
/* 显示和描述用方法 */
// 显示图形:在指定的位图上显示图形
virtual void draw(Graphics::TBitmap * argDest);
// 描述图形:作为TtreeView的节点(主窗体使用)
virtual void discript(int index, TTreeView * tree);
// 描述图形:返回描述图形的字符串
virtual String discript();
/* 识别用 */
// 比较两个图形,如果是同一个图形,返回True,否则False。
// 直线上的两个线段;圆上面的两个圆弧
virtual bool similarWith(CShape * argShape);
// 合并两个图形
// 经过判断为相同的图形进行合并,返回True;否则返回False。
virtual bool mergeWith(CShape * argShape);
// 判断图形存在的可能性(利用具体图形的几何规则)
virtual bool checkPossible();
/* 编辑用 */
// 判断是否点击该图形,若选中则当前编辑的图形改为当前图形
virtual bool isClickOnShape(int x, int y);
// 取得鼠标形状:鼠标移动到选中图形的可操作点上时,显示为编辑形状
virtual TCursor getCursor(int x, int y);
// 更新图形:将编辑点移动到(x, y)点。更新成功返回True,否则False。
virtual bool update(int x, int y);
};
3. 图形类(CLine、CCircle)
3.1 描述
图形类是几何图形的具体实现,实现对应几何图形的描述和相关操作。图形类有共同的父类CShape,对父类中定义的虚方法根据本几何图形的特征进行实现。
根据要求,本系统中实现了直线(CLine)和圆(CCircle)两个图形类。其他简单的几何图形如椭圆、矩形等也可以类似的方法实现,作为本系统的一个扩充。
本系统中,直线类采用直观的 的形式来描述直线(既避免点斜式不能描述竖直直线,也避免极坐标方程转换的问题)。因为成比例的两组 和 表示同一条直线,所以规定,如果B参数不为0,则 ,否则A必定不为0,则 。由于要识别图像中的线段,所以增加两个端点进行限制。
直线类有三个点可以编辑:1)两个端点,选中一个端点并移动,是以另一端点为轴进行旋转;2)线段的中点,选中中点并移动,是平移整个直线。
圆类采用 的形式描述(其中 为圆心,R为半径),直观方便。圆上有两个点支持编辑操作:1)圆心,选中圆心并移动,是平移整个圆;2)圆上的一个点,选中该点并移动,是改变圆的半径,圆心不变。
3.2 实现
 直线类(CLine)
class CLine: public CShape {
public:
/* 初始化 */
CLine(double argA, double argB, double argC);
/* 直线的属性 */
// 线段的两个端点
TPoint *startP, *endP;
// 直线方程的参数:A,B,C
double A, B, C;
/* 对父类虚方法的实现 */
// 在目标位图上画出直线(本系统中的实现为画线段)
void draw(Graphics::TBitmap * argDest);
// 在TTreeView中描述
void discript(int index, TTreeView * tree);
// 返回描述用字符串
String discript();
// 判断该直线是否与指定图形相同
// 将指定图形强制转化为CLine类型,比较其参数A, B, C,
// 若小于指定阈值,则返回Ture,否则返回False。
bool similarWith(CShape * argShape);
// 合并同一直线上的两个线段
// 若目标图形与该图形属同一直线,进行合并,返回True;
// 否则返回False。
void mergeWith(CShape * argShape);
// 判断是否选择该直线进行编辑。
// 判断指定点(x, y)到该直线的距离,
// 如果小于指定阈值则返回True,否则False。
bool isClickOnShape(int x, int y);
// 取得鼠标形状。
// 端点时返回45度,135度的双向箭头形状表示旋转;
// 中点时返回垂直的四个方向箭头的形状表示移动
TCursor getCursor(int x, int y);
// 更新直线
bool update(int x, int y);
};
 圆类(CCircle)
class CCircle: public CShape {
public:
/* 初始化 */
CCircle(int argX, int argY, int argR);
/* 圆的属性 */
// 圆心
TPoint * centerP;
// 半径
int R;
/* 对父类虚方法的实现 */
// 在目标位图上画出圆
void draw(Graphics::TBitmap * argDest);
// 在TTreeView中描述
void discript(int index, TTreeView * tree);
// 返回描述用字符串
String discript();
// 判断该圆是否与指定图形相同
// 将指定图形强制转化为CCircle类型,比较其参数圆心坐标和半径,
// 若小于指定阈值,则返回Ture,否则返回False。
bool similarWith(CShape * argShape);
// 合并同一圆上的两个圆弧
// 若目标图形与该图形属同一圆,进行合并,返回True;
// 否则返回False。
void mergeWith(CShape * argShape);
// 判断是否选择该圆进行编辑。
// 计算指定点(x, y)到圆心的距离,并与半径比较,
// 如果小于指定阈值则返回True,否则False。
bool isClickOnShape(int x, int y);
// 取得鼠标形状。
// 圆上点时返回水平的双向箭头形状表示改变半径;
// 圆心时返回垂直的四个方向箭头的形状表示移动
TCursor getCursor(int x, int y);
// 更新圆
bool update(int x, int y);
};
4. 图形容器类(CShapes)
4.1 描述
图形容器类是图形类的集合类,由C++ Builder的TList继承得到。用来组织对图像的识别结果、组织当前编辑工作的图形对象集。提供添加图形、删除图形、图形编辑等接口。
4.2 实现
class CShapes : public TList {
public:
/* 初始化 */
CShapes();
// 从TreeView得到Shapes
CShapes(TTreeView * tree);
//在目标位图上画出所有的图形
void drawShapes(Graphics::TBitmap * argDest);
//描述图形
void discript(TTreeView * tree);
};
5. 点类(CPoint)
5.1 描述
点类对于与图像上的前景点。由于识别时需要判断是否为交点,在一般的点的基础上增加是否为交点的属性。由C++ Builder的TPoint继承得到。
5.2 实现
class CPoint : public TPoint {
public:
/* 初始化 */
CPoint() {isCrossPoint = false; };
CPoint(int argx, int argy, bool isCross);
CPoint(int argx, int argy, Graphics::TBitmap * argImg);
/* 属性:是否为交点 */
bool isCrossPoint;
};
6. 单义域类(CSegment)
 


 

 

本站发布的计算机毕业设计均是完整无错的全套作品,包含开题报告+程序+论文+源代码+翻译+答辩稿PPT

本文选自计算机毕业设计http://myeducs.cn
论文文章部分只是部分简介,如需了解更多详情请咨询本站客服!QQ交谈QQ3710167

原创论文

设为首页 | 加入收藏 | 论文首页 |原创论文 |
版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
Copyright 2008-2020 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号 常年法律顾问:王律师