机器视觉实验合集:
机器视觉-模板匹配实验(vc++6.0 + opencv1.0)
机器视觉-数米粒实验(vc++6.0 + opencv1.0)
机器视觉-手写数字识别(vc++6.0 + opencv1.0)
本实验基于学校课程要求,实验环境采用vc++6.0 + opencv1.0
模板匹配:在一幅图像中寻找和模板图像最相似的区域
原理:遍历图像中每一个可能的位置,比较各处与模板是否相似,当相似度足够高时,就认为找到了目标。
具体实现思路:函数通过在输入图像image中滑动(从左到右,从上到下),寻找各个位置的区块(搜索窗口)与模板图像templ的相似度,并将结果保存在结果图像result中。该图像中的每一个点的亮度表示该处的输入图像与模板图像的匹配程度,然后可以通过某方法(一般使用函数cvMinMaxLoc)定位result中的最大值或者最小值得到最佳匹配点,最后根据匹配点和模板图像的矩形框标出匹配区域。
步骤如下:
1.创建文件工程中,创建控制台程序,选择存储位置并命名,如图所示:
2.点击确定完成,默认是一个空的工程,可以看到图中三个文件此时都是空的
3.按照下图依次点击,创建c++source file,并命名为main,记住一定要勾选右上角添加到工程(图片中忘记了!!!)然后点击确认
4.创建完成后,点击打开main.cpp文件,如下图所示
5.然后在该文件中编写如下代码(此时各种头文件还未引入!!!)
int main(int argc, char* argv[])
{
IplImage*src,*templat,*result,*show;
int srcW,templatW,srcH,templatH,resultW,resultH;
//加载源图像
src = cvLoadImage("C:\\Users\\zxl\\Desktop\\4.png" , CV_LOAD_IMAGE_GRAYSCALE);
//用于显示结果
show = cvLoadImage("C:\\Users\\zxl\\Desktop\\4.png");
//加载模板图像
templat = cvLoadImage("C:\\Users\\zxl\\Desktop\\1.png" , CV_LOAD_IMAGE_GRAYSCALE);
if(!src || !templat){
printf("打开图片失败");
return 0;
}
srcW = src->width;
srcH = src->height;
templatW = templat->width;
templatH = templat->height;
if(srcW<templatW || srcH<templatH){
printf("模板不能比原图大");
return 0;
}
//计算结果矩阵的大小
resultW = srcW - templatW + 1;
resultH = srcH - templatH + 1;
//创建存放结果的空间
result = cvCreateImage(cvSize(resultW,resultH),32,1);
double minVal,maxVal;
CvPoint minLoc,maxLoc;
//调用模板匹配函数
cvMatchTemplate(src,templat,result,CV_TM_SQDIFF);
//查找最相似的值及其所在坐标
cvMinMaxLoc(result,&minVal,&maxVal,&minLoc,&maxLoc,NULL);
printf("minVal %f maxVal %f\n ",minVal,maxVal);
//绘制结果
cvRectangle(show,minLoc,cvPoint(minLoc.x+templat->width,minLoc.y+templat->height),CV_RGB(0,255,0),1);
//显示结果
cvNamedWindow("show");
cvNamedWindow("tem");
cvShowImage("show",show);
cvShowImage("tem" , templat);
cvWaitKey(0);
return 0;
}
6.编译试运行,如果此时报错,应该是OpenCV的配置问题,如图点击tools,点击“选项”,然后点击目录,查看是否配置好OpenCV,如果没有参考其他配置教程,后面几步主要也是在配置OpenCV!!!
同时还要查看Library files中有没有导入相应的库文件
7.然后确认,关闭选项窗口,回到main.cpp文件中,需要在源代码中引入这些OpenCV库文件,添加代码如下所示:
#include "cv.h"
#include "highgui.h"
#include "stdio.h"
8.编译,如果还出错,可能是OpenCV的静态库没有连接,如下图所示进行检查,在对象/库模板中加上 cxcore.lib cv.lib ml.lib cvaux.lib highgui.lib cvcam.lib
也可以不使用这种与编译器耦合性较强的配置方式,直接在main.cpp中通过代码方式连接静态库,直接添加如下头文件代码
#pragma comment(lib,"cv.lib")
#pragma comment(lib,"cxcore.lib")
#pragma comment(lib,"highgui.lib")
#pragma comment(lib,"cvaux.lib")
#pragma comment(lib,"cvcam.lib")
9.继续编译,如果还出错,别慌,是因为配置时还需要连接OpenCV的动态库,操作如下:找到所要连接的OpenCV下的bin目录,复制所有的 .dll 文件 到你当前项目的debug文件夹下,如图框出来的部分就是复制过来的
10.到此,本项目的opencv配置与连接工作就完成了!!!编译运行(记住修改代码中源图片以及模板图片的路径)
----------------------------------------这是一条分割线-----------------------------------------------
以防万一,还是记录一下其他细节的具体操作!!!
1.代码中模板图片路径替换为自己的模板图片,如何创建模板图片???
可以利用画图工具打开将要被匹配的原图片,然后点击选择,框选嘴巴部分(任意部分都可以),然后按住 ctrl+x ,裁剪出所选区域,如下图所示
然后将原图缩小到最小,再将刚才裁剪的图像粘贴出来,另存为jpg图片,即为模板文件,如下图所示
2.再次强调以上所有工作完成后,记得检查图像的路径名称是否已修改为你自己的!!!
3.这时就可以直接编译运行,会得到如图所示三个结果,其中绿色框出来的就是对原图像进行模板匹配的结果(即匹配到的位置,模板图像在原图像中的位置)