#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. Newtonsoft.Json[C#]

    C# Newtonsoft.Json JsonSerializerSettings配置序列化操作 https://blog.csdn.net/u011127019/article/details/72 ...

  2. Android屏幕适配方案——基于最小宽度(Smallest-width)限定符

    转自:https://www.cnblogs.com/error404/p/3815739.html 一.关于布局适配建议 1.不要使用绝对布局 2.尽量使用match_parent 而不是fill_ ...

  3. centos7.3安装python3.6.5

    最近在玩django,想部署个网站试试,结果发现线上默认的centos用得居然是python2.7.5,那么先升级下吧,到python3.6.5 yum安装时python2.7.5 那么编译安装吧 那 ...

  4. 实现ls -l

    就是遍历一个目录下面的所有文件,显示信息 Linux下面有点绕 要通过 opendir打开目录,返回一个DIR结构 用readdir来读DIR结构,返回目录下面的第一项,是个dirent结构体,再次调 ...

  5. Netty面试题

    1.BIO.NIO和AIO的区别? BIO:一个连接一个线程,客户端有连接请求时服务器端就需要启动一个线程进行处理.线程开销大. 伪异步IO:将请求连接放入线程池,一对多,但线程还是很宝贵的资源. N ...

  6. Oracle11gr2_ADG管理之在备库上模拟failover的过程实战

    技术建议和方案. 要求failover后不重建备库,并能够把failover的数据库重新切换回备库 主库为newtest,备库为snewtest 备库上已经开启了闪回 得到一个参考的SCN SQL&g ...

  7. rails 网站跨域

    7down voteaccepted gem install rack-cors Or in your Gemfile: gem 'rack-cors', :require => 'rack/c ...

  8. Redis AOF 全持久化

    简介: Redis AOF 持久化,将每次接收到更改 redis 数据的操作都记录到一个 aof 文件,当服务器意外宕机或 redis 服务器非法关闭时,不会丢失数据. 可以做到数据安全化,但是性能会 ...

  9. Java设计模式学习01——单例模式(转)

    原地址:http://blog.csdn.net/xu__cg/article/details/70182988 Java单例模式是一种常见且较为简单的设计模式.单例模式,顾名思义一个类仅能有一个实例 ...

  10. SUSE Linux 多路径软件+LVM+裸设备的配置

    1.先要查出光纤卡的WWN号,SUSE 10下光纤卡的WWD在/sys/class/fc_host/host5/port_name文件中,有两块卡就会有两个host*的目录 接好光纤后可以在dev下可 ...