当前位置:文档之家› 基于C语言的形状识别

基于C语言的形状识别


known triangle
Pen bluePen = new Pen( Color.Blue, 2 ); //
triangle
for ( int i = 0, n = blobs.Length; i < n; i++ )
{
List<IntPoint>
edgePoints
=
blobCounter.GetBlobsEdgePoints( blobs[i] );
(float) ( center.Y - radius ),
(float) ( radius * 2 ), (float)
( radius * 2 ) );
}
else
{
List<IntPoint> corners;
// 三角形 或者四边形
if
( shapeChecker.IsConvexPolygon( edgePoints, out corners ) )
是一个专门为开发者和研究者基于 C#框架设计的, 他包括计算机视觉与人工智能,图像处理,神经网络,遗传算法,机 器学习,模糊系统,机器人控制等领域。
这个框架由一系列的类库组成。主要包括有: AForge.Imaging —— 一些日常的图像处理和过滤器 AForge.Vision —— 计算机视觉应用类库
颜色特征提取后,如何用数值来有效的表示图像在颜色上的相似 程度,这便是相似度量问题
相似度量也是直接影响识别效果的重要环节,在模式识别技术 中,特征的相似度量均采用距离法 ,即特征的相似程度用特征向量 的空间距离来表示。
经过彩色边缘检测,图像分割和特征提取,对分割后的图像进行 模式匹配,并制作出用户界面,最终实现图像的分类和识别。 2.1.1 图形识别系统的设计
图 4 系统调用摄像头界面 2.1.3 系统识别效果
调用摄像头并进行识别的识别效果,如图 5 所示
图 5 图形识别
2.1.4 系统关键代码
(1) 图像处理关键代码:
// 图形识别
private void ProcessImage( Bitmap bitmap )
{
// 锁住图形
BitmapData bitmapData = bitmap.LockBits(
colorFilter.Red = new IntRange( 0, 64 );
colorFilter.Green = new IntRange( 0, 64 );
colorFilter.Blue = new IntRange( 0, 64 );
colorFilter.FillOutsideRange = false;
{
// 获取子类型
PolygonSubType
subType
=
shapeChecker.CheckPolygonSubType( corners );
Pen pen;
if
(
subType
==
PolygonSubType.Unknown )
{
pen = ( corners.Count == 4 ) ?
new Rectangle( 0, 0, bitmap.Width,
bitmap.Height ),
ImageLockMode.ReadWrite,
bitmap.PixelFormat );
// step 1 - 将背景转换为黑色
ColorFiltering
colorFilter
=
new
ColorFiltering( );
AForge.Neuro —— 神经网络计算库 AForge.Genetic -进化算法编 程库 AForge.MachineLearning —— 机器学习类库 AForge.Robotics —— 提供一些机器学习的工具类库 AForge.Video —— 一系列的视频处理类库 AForge.Fuzzy —— 模糊推理系统类库 AForge.Controls—— 图像,三维,图表显示控件
SimpleShapeChecker shapeChecker = new
SimpleShapeChecker( );
Graphics g = Graphics.FromImage( bitmap );
Pen yellowPen = new Pen( Color.Yellow, 2 ); //
circles
AForge.Point center;
float radius;
// 圆
if ( shapeChecker.IsCircle( edgePoints, out
center, out radius ) )
{
g.DrawEllipse( yellowPen,
(float) ( center.X - radius ),
greenPen.Dispose( );
blueP( );
g.Dispose( );
//将图形放入剪贴板
Clipboard.SetDataObject( bitmap );
// 显示识别后的图形
pictureBox.Image = bitmap;
Pen redPen = new Pen( Color.Red, 2 );
//
quadrilateral
Pen brownPen = new Pen( Color.Brown, 2 ); //
quadrilateral with known sub-type
Pen greenPen = new Pen( Color.Green, 2 ); //
本系统直接利用窗体设计实现,界面简单友好,方面用户使用, 如图 3 所示。
图 3 图像识别系统界面 本系统通过编程实现调用笔记本电脑的摄像头,利用摄像头拍摄 图片作为系统检测的图像, 之后通过编程检测图像的轮廓确定为何
种图形。在拍摄图片的过程中,由于摄像头像素有限,拍摄的图片存 在各种干扰,因此尽量在光线较好的环境下进行拍摄。在后续编程过 程中,也可以先将图片进行降噪处理,再对图片进行轮廓检测,提高 本系统的精确率,系统调用摄像头的界面如图 4 所示。
private int FrameNumber = 30;
public
void
InitializeWebCam(ref
System.Windows.Forms.PictureBox ImageControl)
redPen : bluePen;
}
else
{
pen = ( corners.Count == 4 ) ?
brownPen : greenPen;
}
g.DrawPolygon(
pen,
ToPointsArray( corners ) );
}
}
}
yellowPen.Dispose( );
redPen.Dispose( );
我们使用其中的 AForge.Imaging 进行了图形的识别,因为在此 命名空间里面包括了我们进行简单图形识别的类,所以我们的操作相 对就比较简单了,直接使用其中的类进行操作即可,在识别出对应的 形状之后,我们使用颜色进行标记,以此显示出,所对应的形状。
为了比较方便的对于一些纸质的图片进行是识别,我们使用了其 中的视频处理类 AForge.Video,可以很方便的调用摄像头,进行拍 照,并对拍照的图片进行识别。 2.1.2 系统界面
对于一个数字图形的识别可以分为以下四个步骤: (1) 数码图片的获取, (2 ) 图像的彩色边缘检测、图像的分割, (3) 图象的颜色特征和形状特征提取 (4) 图像的分类识别。
我们的设计主要是根据图形的边缘特征,以此来与机器记忆中的 特征值进行比较,如果比较相近,那么就可以认为是指定的图形形状。
边缘是图像的一个基本特征,携带了图像中的大量信息,边缘 检测不仅能得到关于边界的有用的结构信息,而且还能极大地减少要 处理的数据,很多图像处理和识别算法都以边缘检测为重要基础。
边缘按其颜色特征可分为灰度边缘和彩色边缘。 (1)灰度图像可由图像亮度函数来描述,灰度边缘可以定义为图像亮 度函数的具有边缘特征的不连续点的集合,它描述了灰度函数的局部 突变。 (2)彩色图像可由图像色彩函数来描述,彩色边缘可以定义为图像色 彩函数的具有边缘特征的不连续点的集合,它描述了色彩函数的局部 突变。
UpdatePictureBoxPosition( );
}
2 调用摄像头关键代码:
对于摄像头的操作进行了类的封装,方便对于摄像头的操作,包
括开启,停止,继续,以及进行捕捉、保存等操作。
class WebCam
{
private WebCamCapture webcam;
private System.Windows.Forms.PictureBox _FrameImage;
就是获得了目标的形状。 任何物体的形状特征均可由其几何属性(如长度、面积、距离、
凹凸等),统计属性(如投影)和拓扑属性(如连通、欧拉数)来进 行描述。
可以用来表示形状的特征包括几何特征和矩特征。 (2) 颜色特征:
由于颜色特征具有旋转不变性和尺度不变性,因而,在图象识别 技术,颜色是使用最广泛的特征之一。而颜色特征的提取是利用颜色 特征进行图象识别的关键之一。目前,大部分系统都采用颜色比例分 布作为颜色基本特征, 这就是图象领域中的直方图法。
长期以来人们主要致力于灰度边缘的研究并取得了很好的效 果。但彩色边缘能比灰度图像提供更多的信息。有研究表明,彩色图 像中,大约有 90%的边缘与灰度图像中的边缘相同,也就是说,有 10%的边缘在灰度图像中是检测不到的。因此,彩色边缘的检测受到 越来越多的重视。
彩色边缘检测的方法: (1)输出融合法
blobCounter.MinWidth = 5;
相关主题