#include "stdafx.h"
#include <cv.h>
#include <highgui.h>
#include <cxcore.h>
#include <iostream> using namespace cv;
using namespace std;
#define DEBUG
double matchShapes(IplImage* src, IplImage* tmplt);
CvPoint matchTemplate(IplImage* src, IplImage* tmplt);
void L_TemplateMatch(IplImage* src,IplImage* tmp);
int _tmain(int argc, _TCHAR* argv[])
{
cvNamedWindow("tmplt", );
cvNamedWindow("src", ); IplImage* pcbmark = cvLoadImage("5_000004.bmp", );
IplImage* tmplt = cvLoadImage("model.bmp", );
// IplImage* Rg=cvCreateImage(cvGetSize(pcbmark),8,3);
//cvCvtColor(pcbmark,Rg,CV_GRAY2BGR); double t=(double)getTickCount();
// cvWaitKey(1000); #ifdef DEBUG
//cvShowImage("BGR", Rg);
cvShowImage("src", pcbmark);
cvShowImage("tmplt", tmplt);
cvWaitKey();
#endif CvPoint center = matchTemplate(pcbmark, tmplt); t=((double)getTickCount()-t)/getTickFrequency();
cout<<t<<endl;
cvDestroyWindow("tmplt");
cvDestroyWindow("src");
return ;
}

CvPoint matchTemplate(IplImage* src, IplImage* tmplt)
{
CvPoint center;
CvSize sizeSrc = cvGetSize(src);
CvSize sizeTemp = cvGetSize(tmplt);
CvSize sizeResult = cvSize(sizeSrc.width-sizeTemp.width+1,sizeSrc.height-sizeTemp.height+1);
IplImage* imgResult = cvCreateImage(sizeResult,IPL_DEPTH_32F,1);
cvMatchTemplate(src,tmplt,imgResult,CV_TM_CCORR_NORMED);
// a=cvMatchShapes(src,tmplt,CV_CONTOURS_MATCH_I3);
float dMax = 0.;
CvPoint point = cvPoint(0,0);


//for (int cx=0 ; cx<sizeResult.width; cx++)
//{
// for (int cy=0 ; cy<sizeResult.height; cy++)
// {
// float fTemp = CV_IMAGE_ELEM(imgResult,float,cy,cx);
// if (dMax < fTemp) //找到最接近的位置
// {
// dMax = fTemp;
// point = cvPoint(cx,cy); //记录位置
// }
// }
//}
//CvPoint point2 = cvPoint(point.x+sizeTemp.width,point.y+sizeTemp.height); //对角位置
//cvRectangle(src,point,point2,cvScalar(255));
//center.x = fabs((double)(point.x + point2.x)/2);
//center.y = fabs((double)(point.y + point2.y)/2);
double min_val;
double max_val;
CvPoint pt1;
CvPoint pt2;
CvPoint min_loc;
CvPoint max_loc;
cvMinMaxLoc(imgResult,&min_val,&max_val,&min_loc,&max_loc,NULL);
CvRect rect=cvRect(max_loc.x,max_loc.y,tmplt->width,tmplt->height);
pt1=cvPoint(rect.x,rect.y);
pt2=cvPoint(rect.x+rect.width,rect.y+rect.height);
cvRectangle(src,pt1,pt2,cvScalar(255));


center.x = fabs((double)(pt1.x + pt2.x)/2);
center.y = fabs((double)(pt1.y + pt2.y)/2);
cvNamedWindow( "Test", CV_WINDOW_AUTOSIZE );
cvShowImage("Test",src);
cvWaitKey();
cvDestroyWindow("Test");
return center;
}

 

opencv——pcb上找圆mark点(模板匹配)的更多相关文章

  1. opencv 在工业中的应用:模板匹配

    模板匹配在工业中经常有两个用途,一模板匹配进行产品定位,二根据匹配度来判断是OK的产品还是NG的产品.我用OPENCV做了个模板匹配定位的DEMO. (1)点击打开图像按钮打开一幅图像 (2)点击定义 ...

  2. opencv——pcb上寻找mark点(拟合椭圆的方法)

    #include "stdafx.h" // FitCircle.cpp : 定义控制台应用程序的入口 #include "cv.h" #include &qu ...

  3. 使用Opencv中matchTemplate模板匹配方法跟踪移动目标

    模板匹配是一种在图像中定位目标的方法,通过把输入图像在实际图像上逐像素点滑动,计算特征相似性,以此来判断当前滑块图像所在位置是目标图像的概率. 在Opencv中,模板匹配定义了6种相似性对比方式: C ...

  4. Halcon 模板匹配实战代码(一)

    模板图片:目标是获取图像左上角位置的数字 直接想法,直接用一个框将数字框出来,然后对图片进行模板匹配(不可行,因为图像中的数字不是固定的) 所以需要选择图像中的固定不变的区域来作为模板,然后根据模板区 ...

  5. OpenCV图像处理中“找圆技术”的使用

    一.为什么"找圆"     圆是基本图形的一种,更为重要的是,自然情况下采集的图像,很少大量存在"圆":但凡存在的,大都是人工的,那么就必然代表特定的意义,从而 ...

  6. 机器学习进阶-图像金字塔与轮廓检测-模板匹配(单目标匹配和多目标匹配)1.cv2.matchTemplate(进行模板匹配) 2.cv2.minMaxLoc(找出矩阵最大值和最小值的位置(x,y)) 3.cv2.rectangle(在图像上画矩形)

    1. cv2.matchTemplate(src, template, method)  # 用于进行模板匹配 参数说明: src目标图像, template模板,method使用什么指标做模板的匹配 ...

  7. opencv 模板匹配与滑动窗口(单匹配) (多匹配)

    1单匹配: 测试图片:   code: #include <opencv\cv.h> #include <opencv\highgui.h> #include <open ...

  8. OpenCV探索之路(九):模板匹配

    模板匹配的作用在图像识别领域作用可大了.那什么是模板匹配? 模板匹配,就是在一幅图像中寻找另一幅模板图像最匹配(也就是最相似)的部分的技术. 说的有点抽象,下面给个例子说明就很明白了. 在上面这幅全明 ...

  9. Atitit opencv模板匹配attilax总结

    Atitit opencv模板匹配attilax总结 找一幅图像的匹配的模板,可以在一段视频里寻找出我们感兴趣的东西,比如条形码的识别就可能需要这样类似的一个工作提取出条形码区域(当然这样的方法并不鲁 ...

随机推荐

  1. 走了很多弯路的CCScrollView

    最近在学习Cocos2d-x,学习CCScrollView的时候走了很多弯路,决定记录下来. 学习cocos2d-x的最大的困惑就是资料不是很齐全,网上有很多资料,但是版本差异大,其次深度低,讲解不够 ...

  2. 二、jenkins配置email(以腾讯企业qq为例)

    废话不多说,直接上干货: 主要针对两个部分进行介绍: 1.jenkins内置的邮件功能: 2.Editable Email Notification插件的邮件功能: 低版本的jenkins有很多插件都 ...

  3. preprocess

    1,宏定义,有参宏,无参宏,宏定义实现的是定义一个符号常量; 条件编译3种方式,文件包含含义; 不带参数的宏定义;既用一个指定的的标识符来代替一个字符串; #define RUIY 10000000 ...

  4. C#中的四舍五入有多坑

    原文:C#中Math.Round()实现中国式四舍五入 C#中的Math.Round()并不是使用的"四舍五入"法.其实在VB.VBScript.C#.J#.T-SQL中Round ...

  5. mongodb主从复制 副本集(六)

    主从复制副本集 8888.conf dbpath = D:\software\MongoDBDATA\07\8888 #主数据库地址port = 8888 #主数据库端口号bind_ip = 127. ...

  6. Spring+Log4j的集成总结

    导入依赖的jar包 <log4j.version>1.2.16</log4j.version> <!-- 自动引入slf4j-api.jar,log4j.jar,以及sl ...

  7. GitHub从注册到使用

    GitHub是最流行的代码库,里面存储着丰富的优秀的开源代码,不仅如此,作为一款免费的代码存储利器也是很牛逼,支持各种编程语言,代码显示效果堪称完美,可以随时随地查看自己记录的笔记 GitHub的好处 ...

  8. input子系统分析之三:驱动模块

    内核版本:3.9.5 本节将以even handler来分析设备的注册和打开的过程,分析之前不妨回顾一下上节介绍的数据结构. 结合前两节分析可知,input子系统分为3层,最上一层是event han ...

  9. 【LA3211 训练指南】飞机调度 【2-sat】

    题意 有n嫁飞机需要着陆.每架飞机都可以选择“早着陆”和“晚着陆”两种方式之一,且必须选择一种.第i架飞机的早着陆时间为Ei,晚着陆时间为Li,不得在其他时间着陆.你的任务是为这些飞机安排着陆方式,使 ...

  10. Linux显示文件前几行、拷贝文件前几行、删除文件前几列

    [一]显示文件前几行 ll -lrth:按照更改时间倒序排列,最新文件在下边 ll -lrSh:按照文件大小倒序排列,最大文件在下边 grep --color :高亮查询关键字 grep -A 10 ...