首页 > 其他分享 >利用MKL实现OpenCV的模板匹配(matchTemplate)

利用MKL实现OpenCV的模板匹配(matchTemplate)

时间:2024-05-19 17:08:04浏览次数:19  
标签:matchTemplate plt max MKL fft OpenCV shape time np

基于FFT实现OpenCV的模板匹配(matchTemplate)

以 TM_CCORR_NORMED 为例,因为这个实现简单,并且效率高。

先看公式

\[R(x,y)= \frac{\sum_{x',y'} (T(x',y') \cdot I(x+x',y+y'))}{\sqrt{ \sum_{x',y'}T(x',y')^2 \cdot \sum_{x',y'} I(x+x',y+y')^2}} \]

显然,分子是I图和T图的卷积。

分母是T图平方的求和乘以I图平方和T图大小的全为1的矩阵,开方的结果。

根据卷积定理,实现方法就很显然了。

import numpy as np
from scipy import signal
from matplotlib import pyplot as plt

import cv2

I = cv2.imread('3.png', cv2.IMREAD_GRAYSCALE)
T = cv2.imread('4.png', cv2.IMREAD_GRAYSCALE)

I = I.astype(np.float32) / 255
T = T.astype(np.float32) / 255

import mkl_fft

def mkl_fft_conv2d(A,K):
    tmp_cols = A.shape[0] + K.shape[0] - 1
    tmp_rows = A.shape[1] + K.shape[1] - 1

    input = np.zeros((tmp_cols, tmp_rows)).astype(np.float32)
    input[:A.shape[0], :A.shape[1]] = A
    kernel = np.zeros((tmp_cols, tmp_rows)).astype(np.float32)
    kernel[:K.shape[0], :K.shape[1]] = K

    fi = mkl_fft.fft2(input)
    fk = mkl_fft.fft2(kernel)

    # output as valid
    output = mkl_fft.ifft2(fi * fk)
    output = np.real(output)
    output = output[K.shape[0]-1:-K.shape[0]+1, K.shape[1]-1:-K.shape[1]+1]
    return output

import time

t0 = time.time()
r0 = mkl_fft_conv2d(I, np.flip(T,axis=(0,1)))
ST = np.sum(T ** 2)
S = mkl_fft_conv2d(I ** 2, np.ones_like(T))
r0 = r0 / np.sqrt(ST * S)


t1 = time.time()
print('fftconvolve:', t1-t0)
t0 = time.time()
r1 = cv2.matchTemplate(I, T, cv2.TM_CCORR_NORMED)
t1 = time.time()
print('matchTemplate:', t1-t0)

plt.figure()
plt.imshow(r0)
plt.colorbar()
plt.title('fftconvolve')

plt.figure()
plt.imshow(r1)
plt.colorbar()
plt.title('matchTemplate')

plt.show()

max_x0, max_y0 = np.unravel_index(np.argmax(r0), r0.shape)
max_x1, max_y1 = np.unravel_index(np.argmax(r1), r1.shape)

print(max_x0, max_y0)
print(max_x1, max_y1)

print(r0[max_x1, max_y1])

和OpenCV效果对比

image
image

可以看出结果是一样的

标签:matchTemplate,plt,max,MKL,fft,OpenCV,shape,time,np
From: https://www.cnblogs.com/Icys/p/18200493

相关文章

  • opencv imshow 函数显示 float64 格式错误_cv2_imshow float
    CSDN搬家失败,手动导出markdown后再导入博客园在模拟高斯光斑的过程中,手动生成了下图所示的图像,使用cv2.imwrite()函数保存正常。![[output/attachments/fa4dbbeff2a5a1f2f99acd241f220fc7_MD5.png]]然而在使用cv2.imshow()函数显示时却出现错误![[output/attachments/e80ba8......
  • Python opencv 将一张图片任意 N 等分并保存_opencv 等分图像
    CSDN搬家失败,手动导出markdown后再导入博客园importcv2src=cv2.imread('100_0124_0013_pre_disaster.JPG',-1)cnt=1num=1sub_images=[]sub_image_num=4src_height,src_width=src.shape[0],src.shape[1]sub_height=src_height//sub_image_numsub_wi......
  • 【rust】《Rust整合OpenCV ( Ubuntu.22.04系统 ) 》
    前言Ubuntu22.04的环境搭建、rust安装配置、VSCode安装等参照另一篇博文:https://www.cnblogs.com/-CO-/p/18197715环境搭建对应项##虚拟机版本VMware17##系统版本Ubuntu22.04.4##Rust版本Rust1.78.0##Rust依赖Opencv版本Opencv-rust0.7......
  • Qt+OpenCV实现图片压缩(JPEG、PNG)
    一、概述需求:1.编写一个小工具实现图片压缩2.图片仅支持JPEG和PNG格式3.目的是压缩图片在磁盘中所占用的大小4.使用的开发语言是Qt、C++、OpenCV5.压缩的质量可以动态调节如下图所示: ps:1.如果图片是j......
  • linux openCV编译
    1、修改平台文件opencv/platforms/linux/arm-gnueabihf.toolchain.cmakeset(GCC_COMPILER_VERSION""CACHESTRING"GCCCompilerversion")set(GNU_MACHINE"arm-linux-gnueabihf"CACHESTRING"GNUcompilertriple")set(CMAKE_C_COMP......
  • python+opencv读取/保存图片
    读取图片导入opencv的包通过imread函数读取图片namedWindow创建一个窗口用于显示imshow将图片显示出来importcv2ascvsrc=cv.imread("D:\\myCode\\picture\\003.jpg")#参数为图片的路径#第一个参数会设置为窗口的标题同时他也会作为和下面imshow进行匹配,以确定将显......
  • 基于Luckfox Pico的opencv使用UDP协议与ubuntu传输摄像头数据-小白进阶
    使用UDP传输opencv的mat数据并显示本教程适用于进阶的小白尝试先说一下背景吧,正在工作的我,突然间看到淘宝上有个很漂亮的价格还不错的linux小板子,遂买下。没错,工作太无聊以至于开始摸鱼学习~但奈何每天工作完回家就像躺着,所以板子到手都快半年了才开始研究实现了简陋的摄像头......
  • 在下载opencv等类似的包时,需要注意到的一个大问题!
    问题描述我尝试好多次去下载opencv-python的依赖包,发现一直说找不到这个东西问题解决查阅了好多资料,尝试了各种方法,发现还是同样的错误,然后突然看到一位博主说“是开了代理的缘故”;碰巧我也一直开着代理,关闭之后,再次使用清华源尝试下载opencv-python,发现没有再出现那个错误,并......
  • opencv中自定义的双线性二次插值的图像旋转及缩放
    #include<iostream>#include<opencv2/opencv.hpp>usingnamespacecv;usingnamespacestd;voidcoordinateTransform(Point2d*p4Corner,Point2d*np4Corner,doublerotAngle,doublegamma,Point2dcenter){doublecx=center.x,cy=center.y;doubl......
  • macOS OpenCV报错:Undefined symbols for architecture x86_64
    这个错误可能是链接的OpenCV库不对,我这里的情况是我代码使用的GCC编译器,但是通过brewinstallopencv安装的OpenCV是使用clang编译的,代码也使用clang编译器可以解决这个问题。要查看opencv的编译信息,可以使用这个命令opencv_version-v我这边输出Generalconfigurationfo......