基于金字塔的模板匹配算法(python)

今天完成了机器视觉的课程作业-基于金字塔的模板匹配算法,就顺便记录一下。本次作业我是通过python+opencv来完成的。这个作业就是一个模板匹配算法的基础上加一个金字塔的模型来减少计算量,所谓金字塔就是对图片进行向下采样,每向下采样一次,图像就缩小一半,由此减少了计算的量。
原图和模板图:
基于金字塔的模板匹配算法(python)_第1张图片

模板图片
运行代码:

import cv2
import numpy as np

def get_img():
    source_img = cv2.imread("source_img.jpg")
    template_img = cv2.imread("template_img.jpg")
    #转化为灰度图
    source_img = cv2.cvtColor(source_img, code=cv2.COLOR_RGB2GRAY)#(576, 704)
    template_img = cv2.cvtColor(template_img, code=cv2.COLOR_RGB2GRAY)#(59, 205)
    """
    cv2.namedWindow("source_img")
    cv2.namedWindow("template_img")
    cv2.imshow("source_img", source_img)
    cv2.imshow("template_img", template_img)
    cv2.waitKey(0)
    cv2.destroyWindow("source_img")
    cv2.destroyWindow("template_img")
    """
    return source_img, template_img


def pyramid_down(source_img, template_img, n):
    #金字塔进行向下采样
    for i in range(n):
        source_img = cv2.pyrDown(source_img)
        template_img = cv2.pyrDown(template_img)
    """
    cv2.namedWindow("source_img")
    cv2.namedWindow("template_img")
    cv2.imshow("source_img", source_img)
    cv2.imshow("template_img", template_img)
    cv2.waitKey(0)
    cv2.destroyWindow("source_img")
    cv2.destroyWindow("template_img")
    """
    return source_img, template_img


if __name__ == '__main__':
    source_img, template_img = get_img()
    n = int(input("请输入金字塔层数:"))
    source_img1, template_img1 = pyramid_down(source_img, template_img, n)

    h, w = template_img1.shape[:2]
    """
    methods = ['cv2.TM_CCOEFF', 'cv2.TM_CCOEFF_NORMED', 'cv2.TM_CCORR',
           'cv2.TM_CCORR_NORMED', 'cv2.TM_SQDIFF', 'cv2.TM_SQDIFF_NORMED']
    """
    res = cv2.matchTemplate(source_img1, template_img1, 1)
    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
    #min_loc 目标位置的像素位置
    #print(min_loc)
    #min_loc1 = (list(min_loc)[0] * 2 ^ n, list(min_loc)[1] * 2 ^ n)
    #print(min_loc1)
    bottom_right = (list(min_loc)[0] + w, list(min_loc)[0] + h)
    cv2.rectangle(source_img1, min_loc, bottom_right, 255, 2)
    cv2.namedWindow("source_img1")
    cv2.imshow("source_img1", source_img1)
    cv2.waitKey(0)
    cv2.destroyWindow("source_img")

运行结果:
基于金字塔的模板匹配算法(python)_第2张图片

你可能感兴趣的:(机器视觉,计算机视觉,opencv,python)