zoukankan      html  css  js  c++  java
  • OpenCV之模板匹配

    原理和c++实现:https://docs.opencv.org/2.4/doc/tutorials/imgproc/histograms/template_matching/template_matching.html

    目的是检测、定位一个物体在一副图像中的位置,主要是通过计算两幅图(待检测图像和图像)的相关性来定位的

     

     用于计算相关性的公式如下:

    算法:

    • 在原始图像上移动模板图像
    • 计算每个位置的NCC
    • 当NCC最大时:最佳!

    python实现:

    import numpy as np
    import cv2
    
    def TemplateMatching(src, temp, stepsize): # src: source image, temp: template image, stepsize: the step size for sliding the template
        mean_t = 0;
        var_t = 0;
        location = [0, 0];
        # Calculate the mean and variance of template pixel values
        # ------------------ Put your code below ------------------ 
        mean_t,var_t=cv2.meanStdDev(temp)
    
        max_corr = 0;
        # Slide window in source image and find the maximum correlation
        for i in np.arange(0, src.shape[0] - temp.shape[0], stepsize):
            for j in np.arange(0, src.shape[1] - temp.shape[1], stepsize):
                mean_s = 0;
                var_s = 0;
                corr = 0;
                # Calculate the mean and variance of source image pixel values inside window
                # ------------------ Put your code below ------------------ 
                mean_window=np.mean(src[i:i+temp.shape[0],j:j+temp.shape[1]])
                var_window=np.var(src[i:i+temp.shape[0],j:j+temp.shape[1]])
                
                # Calculate normalized correlation coefficient (NCC) between source and template
                # ------------------ Put your code below ------------------ 
                mul=(src[i:i+temp.shape[0],j:j+temp.shape[1]]-mean_t)*(temp-mean_t)
                sum_val=sum(sum(mul[i])for i in range(len(mul)))
                corr=(1/float((temp.shape[0])*(temp.shape[1])))*sum_val/((var_t)*(var_window))
                if corr > max_corr:
                    max_corr = corr;
                location = [i, j];
        return location
    
    
    # load source and template images
    source_img = cv2.imread('/Users/wangmengxi/Documents/mercy/ec601/openCV/source.jpg',0) # read image in grayscale
    temp = cv2.imread('/Users/wangmengxi/Documents/mercy/ec601/openCV/template.jpg',0) # read image in grayscale
    location = TemplateMatching(source_img, temp, 20);
    print(location)
    match_img = cv2.cvtColor(source_img, cv2.COLOR_GRAY2RGB)
    # Draw a red rectangle on match_img to show the template matching result
    # ------------------ Put your code below ------------------ 
    cv2.rectangle(match_img,(location[1]-temp.shape[1]/2,location[0]-temp.shape[0]/2),(location[1]+temp.shape[1]/2,location[0]+temp.shape[0]/2),(0,0,255),3)
    
    # Save the template matching result image (match_img)
    # ------------------ Put your code below ------------------ 
    cv2.imwrite("/Users/wangmengxi/Documents/mercy/ec601/openCV/match_img.jpg",match_img)
    
    # Display the template image and the matching result
    #cv2.namedWindow('TemplateImage', cv2.WINDOW_NORMAL)
    #cv2.namedWindow('MyTemplateMatching', cv2.WINDOW_NORMAL)
    #cv2.imshow('TemplateImage', temp)
    #cv2.imshow('MyTemplateMatching', match_img)
    #cv2.waitKey(0)
    #cv2.destroyAllWindows()

    结果:

    source img:

    template:

    match:

  • 相关阅读:
    利用DTrace实时检测MySQl
    改进MySQL Order By Rand()的低效率
    RDS for MySQL查询缓存 (Query Cache) 的设置和使用
    RDS For MySQL 字符集相关说明
    RDS for MySQL 通过 mysqlbinlog 查看 binlog 乱码
    RDS for MySQL Mysqldump 常见问题和处理
    RDS for MySQL Online DDL 使用
    RDS MySQL 表上 Metadata lock 的产生和处理
    RDS for MySQL 如何使用 Percona Toolkit
    北京已成为投融资诈骗重灾区:存好骗子公司黑名单,谨防上当!
  • 原文地址:https://www.cnblogs.com/x1mercy/p/7865336.html
Copyright © 2011-2022 走看看