zoukankan      html  css  js  c++  java
  • opencv 模板匹配与滑动窗口(单匹配) (多匹配)

    1单匹配:

    测试图片:

     

    code:

    #include <opencvcv.h>
    #include <opencvhighgui.h>
    #include <opencvcxcore.h>
    #include <stdlib.h>
    #include <stdio.h>
    
    /*
    模板匹配法 --图片查找
    滑动窗口的原理 
    用等大小的模板窗口在范围中进行滑动 然后查找匹配
    */
    
    
    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
     ",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;
     
    }
     


     

    2多匹配:

    code:

    #include <opencvcv.h>
    #include <opencvhighgui.h>
    #include <opencvcxcore.h>
    #include <stdlib.h>
    #include <stdio.h>
    
    /*
    模板匹配法 --图片查找
    滑动窗口的原理 
    用等大小的模板窗口在范围中进行滑动 然后查找匹配
    */
    
     
    
    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("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);
            //绘制第一个查找结果到图像上
            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;
    }
     
     
  • 相关阅读:
    盒子垂直水平居中
    Sahi (2) —— https/SSL配置(102 Tutorial)
    Sahi (1) —— 快速入门(101 Tutorial)
    组织分析(1)——介绍
    Java Servlet (1) —— Filter过滤请求与响应
    CAS (8) —— Mac下配置CAS到JBoss EAP 6.4(6.x)的Standalone模式(服务端)
    JBoss Wildfly (1) —— 7.2.0.Final编译
    CAS (7) —— Mac下配置CAS 4.x的JPATicketRegistry(服务端)
    CAS (6) —— Nginx代理模式下浏览器访问CAS服务器网络顺序图详解
    CAS (5) —— Nginx代理模式下浏览器访问CAS服务器配置详解
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3265193.html
Copyright © 2011-2022 走看看