opencv学习笔记(三十三)多匹配——查找多个对象
来源:互联网 发布:js邮政编码正则表达式 编辑:程序博客网 时间:2024/06/05 18:18
参考这个:
http://www.lxway.com/4464155816.htm
程序实例:
#include <opencv2/opencv.hpp>CvPoint getNextMinLoc(IplImage* result , int templatWidth,int templatHeight,double maxValIn , CvPoint lastLoc){ int y,x; int startY,startX,endY,endX; //计算大矩形的坐标 startY = lastLoc.y - templatHeight; startX = lastLoc.x - templatWidth; //计算大矩形的的坐标 endY = lastLoc.y + templatHeight; endX = lastLoc.x + templatWidth; //不允许矩形越界 startY = startY < 0 ? 0 : startY; startX = startX < 0 ? 0 : startX; endY = endY > result->height-1 ? result->height-1 : endY; endX = endX > result->width - 1 ? result->width - 1 : endX; //将大矩形内部 赋值为最大值 使得 以后找的最小值 不会位于该区域 避免找到重叠的目标 for(y=startY;y<endY;y++){ for(x=startX;x<endX;x++){ cvSetReal2D(result,y,x,maxValIn); } } double minVal,maxVal; CvPoint minLoc,maxLoc; //查找result中的最小值 及其所在坐标 cvMinMaxLoc(result,&minVal,&maxVal,&minLoc,&maxLoc,NULL); return minLoc;}int main(int argc, char* argv[]){ IplImage*src,*templat,*result,*show; int srcW,templatW,srcH,templatH,resultW,resultH; //加载源图像 src = cvLoadImage("n2.jpg" , CV_LOAD_IMAGE_GRAYSCALE); //加载用于显示结果的图像 show = cvLoadImage("n2.jpg");//就是源图像 //加载模板图像 templat = cvLoadImage("n1.jpg" , 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); //绘制第一个查找结果到图像上 cvRectangle(show,minLoc,cvPoint(minLoc.x+templat->width,minLoc.y+templat->height),CV_RGB(0,255,0),1); //查找第二个结果 minLoc = getNextMinLoc( result , templat->width,templat->height, maxVal , minLoc); //绘制第二个结果 cvRectangle(show,minLoc,cvPoint(minLoc.x+templat->width,minLoc.y+templat->height),CV_RGB(0,255,0),1); //显示结果 cvNamedWindow("show"); cvShowImage("show",show); cvWaitKey(0); return 0;}
用到的图片:
n1
n2
0 0
- opencv学习笔记(三十三)多匹配——查找多个对象
- OpenCV学习笔记(三十三)——用haar特征训练自己的分类器(再做手势检测)
- OpenCV学习笔记(三十三)——用haar特征训练自己的分类器(再做手势检测)
- OpenCV学习笔记(三十三)——用haar特征训练自己的分类器(再做手势检测)
- opencv学习——特征匹配和单应性查找图片
- OpenCV学习笔记(十三)——模板匹配
- OpenCV学习笔记(十三)——模板匹配
- OpenCV学习笔记(5)——模板匹配
- java学习笔记(三十三)
- OpenCV学习笔记(8)—轮廓的匹配
- OpenCV 学习笔记(模板匹配)
- OpenCV学习笔记(十七)模板匹配
- opencv学习笔记(三十二)模板匹配
- opencv学习笔记(三十五)查找轮廓
- 【OpenCV学习笔记】三十三、GrabCut & FloodFill图像分割
- Opencv学习笔记(三)———特征点匹配
- OpenCV学习笔记(6)基于 VC+OpenCV+DirectShow 的多个摄像头同步工作
- OpenCV学习笔记(6)基于 VC+OpenCV+DirectShow 的多个摄像头同步工作
- Android 中的代码混淆
- Tails OS 让你实现隐形上网!
- 【OI练习】硬币翻转
- no debuggable processes
- zabbix客户端 zabbix-agent 2.4版本安装
- opencv学习笔记(三十三)多匹配——查找多个对象
- js中call和apply的异同
- 坚持
- 数据库连接和相关操作
- js中call和apply(函数的上下文调用模式)详解
- 停用 updatedb.mlocate
- GPU渲染管线概述
- 阿里获四席:2016年度最受欢迎中国开源软件TOP 20
- 集群安装pacemaker