
电路板识别
-
2023年3月16日发(作者:吸逼)武汉工程大学计算机科学与工程学院综合设计报告
-I-
摘要
图像处理技术,可以使模糊甚至不可见的图像变得清晰明亮。另一方面,通过数字
图像处理中的模式识别技术,可以将人眼无法识别的图像进行分类处理。OpenCV
是近年来推出的开源、免费的计算机视觉库,利用其所包含的函数可以很方便地实现数
字图像处理。同时利用面向对象的VC++6.0编程工具,用C++语言进行程序编写,大大
提高了计算机的运行速度。这次课程设计主要是了解和熟悉OpenCV的运用,并与VC++
结合,用MFC建立一个单文档程序,识别一些电路板上的焊点,系统要实现图片的检
测,然后利用阈值分割等方法识别了各种电路板上的焊点。我们也可以先确定“感兴趣”
的区域,再在这个区域之中进行识别,从而能够得到焊点的中心坐标。
关键词:OpenCV;图像处理;VC++;焊点识别
。
Abstract
Withimageprocessingtechnology,wecanmakeblurredorevennon-visibleimage
therhand,bypatternrecognitiontechnologyinthedigital
imageprocessing,
CVw
easilycarryoutdigitalimageprocessingbymakinguseofitsfunctions.C++programs
compiledintheVC++signismainlyto
understandandbefamiliarwiththeuseofOpenCVcombinedwithVC++.WeuseMFCto
createasing
shouldachievethefunctionofthedetectionofthepicture,andthenweusethethreshold
selso
determinethe"interested"region,andwecanidentifyinthisarea,sothatwecangetsolder
joints’centercoordinates.
Keywords:OpenCV;imageprocessing;VC++;Solderjointsrecognition
武汉工程大学计算机科学与工程学院综合设计报告
-1-
第一章课题背景(或绪论、概述)
1.1OpenCV简介
OpenCV是Intel开源计算机视觉库。它由一系列C函数和少量C++类构成,实现
了图像处理和计算机视觉方面的很多通用算法。OpenCV拥有包括300多个C函数的
跨平台的中、高层API。它不依赖与其它的外部库,尽管也可以使用某些外部库。OpenCV
还提供了Python、Ruby、MATLAB以及其他语言的接口。OpenCV的设计目标是执行
速度尽量快,主要关注实时应用。它采用优化的C代码编写,能够充分利用多核处理
器的优势因为计算机视觉和机器学习密切相关,所以OpenCV还提供了MLL(Machine
LearningLibrary)机器学习库。该机器学习库侧重于统计方面的模式识别和聚类
(clustering)。MLL除了用在视觉相关的任务中,还可以方便地应用于其他的机器学习场
合。机器视觉很广泛地被用在工厂中:差不多所有的大规模制造的产品都在流水线上的
某个环节上自动使用视觉检测。
1.2MFC简介
MFC是对WindowsAPI的封装,大大简化了我们的工作;学VC主要就是要学MFC,
大约有100多个类。CWnd:窗口,它是大多数“看得见的东西”的父类(Windows里几
乎所有看得见的东西都是一个窗口,大窗口里有许多小窗口),比如视图CView、框架
窗口CFrameWnd、工具条CToolBar、对话框CDialog、按钮CButton,etc;一个例外是
菜单(CMenu)不是从窗口派生的。CDocument文档,负责内存数据与磁盘的交互。CView
视图,负责内存数据与用户的交互。包括数据的显示、用户操作的响应(如菜单的选取、
鼠标的响应)。最重要的是OnDraw(重画窗口),通常用CWnd::Invalidate()来启动它。另
外,它通过消息映射表处理菜单、工具条、快捷键和其他用户消息。CWinApp应用程
序类。似于C中的main函数,是程序执行的入口和管理者,负责程序建立、消灭,主
窗口和文档模板的建立。最常用函数InitInstance():初始化。CDC设备文本。无论是
显示器还是打印机,都是画图给用户看。这图就抽象为CDC。CDC与其他GDI(图形
设备接口)一起,完成文字和图形、图像的显示工作。把CDC想象成一张纸,每个窗
口都有一个CDC相联系,负责画窗口。CDC有个常用子类CClientDC(窗口客户区),
画图通常通过CClientDC完成。等等还有很多类的应用。
1.3设计背景
计算机视觉是将来自静止图像或视频的数据转换成一个决策或者一种新的表达方
式的过程,所有的这些转换都是为了达到某个目标。输入数据可以包含一些辅助信息,
如"摄像机架在汽车上"或"激光扫描仪在1米处发现一个物体"。最终的决策可能是"场景
中有一个人"或"在这个切片中有14个肿瘤细胞"。一种新的表达方式可以是将一张彩色
照片转为灰度照片,或者从图像序列中去除摄像机晃动影响。计算机视觉拟根据摄像机
数据来采取行动或者做出决策,这样的行动或决策是在一个指特定目的或任务的环境中
来解决。
OpenCV的目标是为解决计算机视觉问题提供基本工具。在有些情况下,它提供的
高层函数可以高效地解决计算机视觉中的一些很复杂的问题。当没有高层函数时,它提
武汉工程大学计算机科学与工程学院综合设计报告
-2-
供的基本函数足够为大多数计算机视觉问题创建一个完整的解决方案。对于后者,有几
个经过检验且可靠的使用OpenCV的方法;所有这些方法都是首先大量使用OpenCV函
数来解决问题。一旦设计出解决方案的第一个版本,便会了解它的不足,然后可以使用
自己的代码和知识来解决(更为广知的一点是"解决实际遇到的问题,而不是你想像出来
的问题")。你可以使用第一个版本的解决方案作为一个基准,用之评价解决方案的改进
程度。解决方案所存在的不足可以通过系统所用的环境限制来解决。综合设计我们采用
OpenCV库与MFC库来进行完成相应的图像处理功能。
1.4系统意义
近年来,数字图像发展迅速,实用价值高,应用范围极为广泛,现已应用于军事技
术、政府部门和医疗卫生等多种领域。数字图像处理研究内容很广泛,归纳起来有如下
几个方面:图像数字化、图像压缩、图像增强、图像分析、图像复原。随着数字图像处
理的日益广泛,众多应用于计算机视觉和图像处理的软件相继被开发出来。大多数软件
包基于计算速度的角度考虑,采用C/C++编写的,但仍存在很大的不足。OpenCV图像
处理算法库在VC++编译环境下运行,为数字图像的处理、计算机视觉技术应用提供了
极大的方便。
武汉工程大学计算机科学与工程学院综合设计报告
-3-
第二章设计简介及设计方案论述
2.1模块分析
这次课程设计的目标是识别一些电路板上的焊点,主要分为三个大块:界面设计、
获取阈值和寻找中心。
第一大块是软件的界面设计,在菜单栏添加“寻找”,“停止寻找”,“更新阈值”,“重
置阈值”,“R分量图”,“G分量图”,“B分量图”,“特征区域”,“焊点”,“自动换图”
和“停止自动换图”等12个按钮,并为每个按钮添加消息响应,也要为文件里面的打
开添加消息响应,并能够将最后的结果显示出来。
第二大块是获取阈值,查找图片中的特征区域,采用了查找具有与特征区域相同或
者相近的RGB值的区域,所以首先要获得特征区域RGB值的阈值。在打开的图片中点
击需要查找阈值的区域,就会在窗口中显示出R,G,B的阈值范围,如果已经得到阈
值,也可以直接在窗口中直接调出阈值。
第三大块是寻找中点。对于一张电路板,其中会有大量焊点,如果直接寻找焊点会
有较大的难度,所以可以先寻找焊点周围某些特有特征,将寻找范围缩小,再在较小的
区域内寻找焊点,所以将寻找焊点分为两部分,寻找唯一特征区域,将寻找范围缩小,
在缩小后的范围再次寻找焊点。
2.2OpenCV设置
一、在VC编译器下,在Project菜单下选择setting,弹出对话框。
1、设置预编译的头文件
选择C/C++【Category】,在下拉菜单中选择Preprocessor,然后在Additional
Includedirectories中输入以下几项:
C:ProgramFilesOpenCVcvinclude(根据本人机器上OpenCV的安装路径进行设置,
如在D盘,则写D:,以下同)
C:ProgramFilesOpenCVotherlibshighgui
C:ProgramFilesOpenCVcxcoreinclude(新版本需要)
C:ProgramFilesOpenCVotherlibscvcaminclude
每一条之间用逗号隔开。其中C:ProgramFilesIntelopencv为OpenCV的安装路径,
这是通用的安装路径,
2、设置链接库
在Link按键下的Category下拉菜单中选择Input选项,在Additionallibrarypath中,
输入:C:ProgramFilesOpenCVlib。最后在SettingFor下拉菜单中依次选择Win32
Debug和Win32Release,分别在Object/librarymodules输入:
。注意每个库之间用一个空格隔开。如下图:
武汉工程大学计算机科学与工程学院综合设计报告
-4-
图2.1VC++项目设置
二、如果一直要使用OpenCV的函数,把其路径设置到系统目录下
在Tools菜单下选择Options子菜单,在弹出的对话框中选择Directory,将用到的
几个库的路径添加进去。以后只需将所用的库在Object/librarymodules下输入就可以了,
不用再每次指定路径。在Showdirectoriesfor下拉菜单中选择Includefiles,输入:
C:ProgramFilesOpenCVcvinclude
C:ProgramFilesOpenCVotherlibshighgui
C:ProgramFilesOpenCVcxcoreinclude(新版本需要)
C:ProgramFilesOpenCVotherlibscvcaminclude
在Showdirectoriesfor下拉菜单中选择Libraryfiles,输入:
C:ProgramFilesOpenCVlib,如下图:
图2.2VC++的全局配置(1)
武汉工程大学计算机科学与工程学院综合设计报告
-5-
图2.3VC++的全局配置(2)
三、设置环境变量
按照如下步骤来进行环境变量的设置:我的电脑—属性—高级—环境变量—path—
C:ProgramFilesOpenCVbin。如下图:
图2.4环境变量配置
武汉工程大学计算机科学与工程学院综合设计报告
-6-
第三章详细设计
3.1前期工作
3.1.1图片准备
对电路板进行拍照,每张电路板根据需要,垂直拍摄多张不同角度的图片,要求亮
度差别较小,对识别的效率和速度都有很大的帮助。由于实验条件所限,对摄像头的标
定校正,对实际光照的影响都没有进行详细的比对和记录。然后一个较大的限制是图像
的不清晰可能会导致部分关键颜色阈值的缺失,从而影响实验的效果。
拍摄的照片将作为焊点的识别训练和检验的主要样例。
3.1.2软件准备
设计需要使用VisualC++6.0和OpenCV,下载和安装VisualC++6.0,并在其中配
置。OpenCV图像处理算法在VC++编译环境下运行,为数字图像的处理、计算机视觉
技术应用提供了极大的方便。它不紧是完全免费的开源软件而且它包含非常丰富的各类
图像处理及识别的函数。本次综合设计旨在利用OpenCV图形处理框架与MFC界面相
结合,能够精确得识别出一块电路板上的焊点,并且在处理时间上能够达到工业的要求。
VC++只要根据步骤安装就可以了。在OpenCV配置中需要设置预编译的头文件,
设置链接库和设置环境变量。
3.2界面设计
创建一个单文档MFC工程,如图3-1所示。
武汉工程大学计算机科学与工程学院综合设计报告
-7-
图3-1建立一个单文档
单击完成即可完成单文档MFC工程的创建。接下来,切换到“ResourceView”视图,
双击“Menu”选项下的“IDC_MAINFRAME”,即该单文档的主窗口。这里我们可以很容
易的添加一些我们需要的菜单选项并添加对应的响应函数。下面详细说明如何新建一个
菜单选项。首先,如图3-2所示,新建一个菜单项。
图3-2新建一个“寻找”的菜单项
使用鼠标右键点击新建的菜单项,单击“建立类向导”,在View类为其添加
COMMAND响应函数,如图3-3所示。
图3-3为新建的菜单项添加响应函数
编译运行工程后,会发现单击新建好的菜单项“寻找”,在菜单栏中依次添加“停止
寻找”,“更新阈值”,“重置阈值”,“R分量图”,“G分量图”,“B分量图”,“特征区域”,
“焊点”,“自动换图”和“停止自动换图”等12个按钮,添加完后,运行界面如图3-4
所示。
武汉工程大学计算机科学与工程学院综合设计报告
-8-
图3-4设计完成的界面
分别为每个按钮添加消息响应,并为文件里面的打开添加消息响应。
3.3图片的打开
打开图片,一是为了将图片显示出来,用于监测识别准确度,二是为了处理图片,
从而检测得到焊点,所以定义CImageimg_rgb和IplImage*rgb,其中img_rgb用来将图
片输出到屏幕显示,rgb用来在内部处理得到焊点位置,打开图片如图3-5所示:
图3-5打开并显示图片
武汉工程大学计算机科学与工程学院综合设计报告
-9-
CImage和IplImage分别使用两个不同的导入图片的方法,CImage使用
img_(),其函数原型为:
boolCvvImage::Load(constchar*filename,intdesired_color);装载一个图像。
filename图像文件名称
desired_color图像波段数和cvLoadImage类似IplImage
IplImage使用cvLoadImage函数,其原型为:
IplImage*cvLoadImage(constchar*filename,intflags=CV_LOAD_IMAGE_COLOR);
filename要被读入的文件的文件名。
flags指定读入图像的颜色和深度:
指定的颜色可以将输入的图片转为3信道(CV_LOAD_IMAGE_COLOR),单信道
(CV_LOAD_IMAGE_GRAYSCALE),或者,可以保持不变
(CV_LOAD_IMAGE_ANYCOLOR)。
深度指定输入的图像是否转为每个颜色信道每象素8位,(OpenCV的早期版本一
样),或者同输入的图像一样保持不变。
选中CV_LOAD_IMAGE_ANYDEPTH,则输入图像格式可以为8位无符号,16位
无符号,32位有符号或者32位浮点型。
如果输入有冲突的标志,将采用较小的数字值。比如CV_LOAD_IMAGE_COLOR|
CV_LOAD_IMAGE_ANYCOLOR将载入3信道图。CV_LOAD_IMAGE_ANYCOLOR
和CV_LOAD_IMAGE_UNCHANGED是等值的。但是,
CV_LOAD_IMAGE_ANYCOLOR有着可以和CV_LOAD_IMAGE_ANYDEPTH同时使
用的优点,所以CV_LOAD_IMAGE_UNCHANGED不再使用了。
如果想要载入最真实的图像,选择CV_LOAD_IMAGE_ANYDEPTH|
CV_LOAD_IMAGE_ANYCOLOR。
函数cvLoadImage从指定文件读入图像,返回读入图像的指针。
图像的显示使用的是img_DrawToHDC(),其原型为:
voidCImage::DrawToHDC(HDChDCDst,RECT*pDstRect);
绘制图像的ROI区域到DC的pDstRect,如果图像大小和pDstRect不一致,图像会
拉伸/压缩。
hDCDst设备描述符。pDstRect对应的设备描述符区域。
3.4获取阈值
在RGB图像中,在计算机中的存贮顺序为B(蓝)G(绿)R(红),即先存贮蓝分量,接
着存绿分量,后存红分量。
查找图片中的特征区域,采用了查找具有与特征区域相同或者相近的RGB值的区
域,所以首先要获得特征区域RGB值的阈值。
首先打开图片,点击寻找会弹出图3-6的窗口:
武汉工程大学计算机科学与工程学院综合设计报告
-10-
图3-6寻找阈值的窗口
该窗口从上到下分别指示:R分量的最大值,R分量的最小值,G分量的最大值,
G分量的最小值,B分量的最大值,B分量的最小值。
在打开的图片中点击需要查找阈值的区域,就会在窗口中显示出R,G,B的阈值
范围,如果已经得到阈值,也可以直接在窗口中直接调出阈值。
如果想重置阈值,可以点击重置阈值,这是R分量的最大值,G分量的最大值,B
分量的最大值均被设置为0,R分量的最小值,G分量的最小值,B分量的最小值均被
设置为255。
点击更新阈值,将窗口中的阈值输入程序。
点击取消查找,将窗口关闭。
点击重新查找,使用新输入的阈值重新在图片中查找特征区域,如果没有更新阈值,
将使用原阈值再次查找特征区域。
3.5寻找中点
对于一张电路板,其中会有大量焊点,如果直接寻找焊点会有较大的难度,所以可
以先寻找焊点周围某些特有特征,将寻找范围缩小,再在较小的区域内寻找焊点,所以
将寻找焊点分为两部分,寻找唯一特征区域,将寻找范围缩小,在缩小后的范围再次寻
找焊点。
3.5.1寻找唯一特征区域
在得到唯一特征区域的阈值之后,即可进行第一步的区域寻找,首先将图片分割为
三幅灰度图像,分别存储原RGB图像的R分量,G分量和B分量,从图片第一个像素
点开始逐行扫描图片中的像素点,如果在阈值范围内,则在另一幅描述特征区域的图片
中,将该位置涂为红色,如图3-7所示:
武汉工程大学计算机科学与工程学院综合设计报告
-11-
图3-7特征区域图
初步得到的特征图会很多噪声点,为降低噪声,将图片进行滤波,滤波采用了均值
滤波,然后再对滤波后的图像进行阈值分割,怎会减少大部分的噪声点,滤波和阈值分
割后的图像如图3-8:
图3-8滤波并阈值分割后效果
统计得到具有特征区域像素最多的区域,将其他区域屏蔽后,得到如图3-9的图片:
武汉工程大学计算机科学与工程学院综合设计报告
-12-
图3-9屏蔽干扰后的唯一特征区域
3.5.2寻找中心
在找到第一个特征区域后,分别提取该区域中,x的最大值和最小值,y的最大值
和最小值,将这个范围内的矩形区域从原图中提取出来,如图3-10:
图3-10提取出的目标区域
然后在这个区域中再次寻找焊区,经过同原图像同样的处理方法后,得到焊区的特
征区域,如图3-11所示:
图3-11得到的焊区特征
得到该区域后,分别找到其x和y的最大值和最小值,将x的最大值最小值求平均
作为中点的x值,将y的最大值最小值求平均,作为中点的y值,这样便得到了特征区
域的中心焊点。
3.6寻找结果的显示
当寻找到中心点后,会弹出窗口显示其中心点的坐标,如图3-12所示:
武汉工程大学计算机科学与工程学院综合设计报告
-13-
图3-12显示中心点坐标
同时,会在图片中以中心点为圆心,2为半径画出一个黑色圆,如图3-13所示:
图3-13标出中心点的图片
武汉工程大学计算机科学与工程学院综合设计报告
-14-
第四章设计结果及分析
4.1设计经过和结果
4.1.1遇到的问题
设计过程中,运行和调试过程中,遇到了一些问题:
一、最常遇到的问题——内存不足
因为在运行过程中经常申请内存空间,用来存储新图片,每打开一次图片,就要申
请五六个图片存储空间,用来存储中间图片,申请之后没有销毁,多次打开后,就出现
了大量使用内存,将内存占满的现象,导致内存不足。另外,在有些循环中,有时会跟
图片颜色有关,当图片颜色模糊时,会导致不满足退出循环条件,无限循环出现内存不
足。
解决方法:每次打开图片之前,将前一次申请的空间全部释放,在循环中增加退出
循环的判断,不单依靠一种退出循环的方法。
二、最难寻找的问题——越界访问
运行中常出现的也是最难发现的问题就是越界访问,例如在没有找到特征点的时
候,要对第一个特征区域进行操作,就会出现越界访问,还有在循环体内,在超过数组
范围后还继续寻找,也会出现越界访问,这种错误由于不存在语法的错误,无法预估何
时出现,出现时需要一行一行的寻找,所以最难发现。
解决方法:耐心寻找,逐个排除,编码前尽量考虑全面。
三、最关键的问题——阈值选择
阈值的是决定寻找的精确度的最主要的因素,阈值相差一点点,寻找到的区域就会
有很大不同,刚开始的阈值选择的单幅图像的,对其他图片有时就找不到特征区域。
解决方法:寻找多张图片,综合求阈值,精挑细选阈值。
4.1.2设计结果
设计最终可以找到目标区域的中点,即焊区中心焊点,并且可以将找的中心在图片
中表示出来,将坐标以窗口形式弹出如图4-1和4-2所示:
图4-1弹出的中心坐标窗口
武汉工程大学计算机科学与工程学院综合设计报告
-15-
图4-2找到中心并标示的电路板图
4.2结果分析
本方法可以较快的找到目标,但是也会有一些偏差,主要原因最可能为阈值的选取
原因,滤波方法和阈值分割的阈值也会有一些影响,但其精度和效率可以满足一般的要
求,在对10张图片,循环寻找,计时计数后得到结果如图4-3所示,其运行环境为Win7
系统,2GHz处理器,2GB内存,平均每秒可以处理12~13张图片,即约为处理一张图
片80毫秒:
图4-3总结测算处理图片时间
武汉工程大学计算机科学与工程学院综合设计报告
-16-
总结
在为期两个星期的课程设计中,我始终以一个积极认真的态度来面对我的任务。这
次任务主要使用OpenCV,并在VC++6.0下编程下识别一些电路板上的焊点。以前虽
然没有接触过OpenCV,但是它并不是非常难的上手,我们主要学会使用它里面的一些
函数就可以了,VC++6.0我们以前多次接触过。尽管这样,要完成这次任务也不是很容
易。在其中也遇到了很多问题,还有编程的思路也不是很清晰,不能真正找到问题的切
入点,同时我也明白了系统设计的严谨性,即使是很小的系统的设计,也要用严肃严谨
的态度去设计完成。在设计开发过程中,有很多难题不可能靠我自己一个人解决,多亏
了身边的同学与我的指导老师,给了我很多帮助。希望自己在以后的学习生活中,可以
改掉在课程设计中出现的浮躁问题,更上一层楼。
经过两个星期的设计,系统基本完成。其功能基本符合老师的要求。由于实验条件
所限,对摄像头的标定校正,对实际光照的影响都没有进行详细的比对和记录。然后一
个较大的限制是图像的不清晰可能会导致部分关键颜色阈值的缺失,从而影响实验的效
果。通过本次课程设计,我基本掌握了OpenCV基于VC++的编程,使我更进一步了解
了编程的内涵,领略了VC的方便、高效,使我觉得MFC真的是一个不错开发工具。
我也认识到自己在编程中还有很多不足,一些函数的功能还是不是很了解。在今后的日
子里,我要加紧学习和工作,争取掌握更多的编程技巧,丰富和补充自己。由于本人知
识的限制,设计出的系统只能基本满足要求,一些界面的设计也不是很完善,这些都是
我以后可以改进的。
武汉工程大学计算机科学与工程学院综合设计报告
-17-
致谢
在本次系统设计过程中,感谢老师悉心的安排与指导,为我们安排了两周有趣的综
合设计,让我们有一个将理论与实践相结合的平台,提高我们的动手能力和独立思考的
能力。通过老师的指导和帮助,我能按照进度一步一步地进行开发设计,并从老师身上
学到很多东西。老师认真负责的工作态度,严谨的治学精神和深厚的理论水平都使我收
益非浅。无论在理论上还是在实践中,都给予我很大的帮助,这对于我以后的工作和学
习都有一种巨大的帮助,在此对老师对我的指导和帮助表示诚挚的感谢!
武汉工程大学计算机科学与工程学院综合设计报告
-18-
参考文献
[1].张基温,C++程序设计基础,高等教育出版社;
[2].侯俊杰,深入浅出MFC,华中科技大学出版社。
[3].冈萨雷斯,数字图像处理(第二版),电子工业出版社
[4].于仕琪译,学习OpenCV(中文版),清华大学出版社
[5].刘瑞祯,于仕琪,OpenCV教程——基础篇,北京航空航天大学出版社