当前位置:   article > 正文

python+opencv实现NCC模板旋转匹配(图像处理)_opencv ncc

opencv ncc

NCC匹配原理公式:

1.旋转的情况使用圆投影的旋转不变性原理匹配

2.通过对图像进行降采样,从降采样的高层开始匹配筛选匹配点极大地减少了运算量

3.差分简化运算数据量(但是目前实现的差分貌似没有起到加速的效果,主要是计算src的累积和会消耗太多的时间)

4.gitee代码持续改进中gitee代码地址https://gitee.com/lzj12321/ncc_match.git,欢迎交流,最后希望可以实现一个可工业化应用的NCC匹配(1.带旋转,2.不规则模板匹配,3.实时性高)

5.微信同号,支持帮忙做付费项目(哈哈)

注意:

不支持缩放匹配,圆投影匹配目前不输出匹配角度,只是NCC匹配的初步实现,还需很多优化,目前的实现对规则矩形不旋转的匹配还是挺友好的

  1. import math
  2. import numpy as np
  3. import cv2
  4. from PyQt5.QtCore import QTime
  5. '''
  6. 1.二维数组降维
  7. 2.圆投影匹配算法
  8. '''
  9. def calculate_unrotate_temp_data(temp):
  10. ####使用圆投影匹配算法####
  11. temp_mean = np.mean(temp)
  12. temp_sub_avg = temp - temp_mean
  13. temp_deviation = np.vdot(temp_sub_avg, temp_sub_avg)
  14. return temp_deviation, temp_sub_avg
  15. def calculate_rotate_temp_data(temp):
  16. temp_column = temp.shape[1]
  17. temp_row = temp.shape[0]
  18. if temp_column < temp_row:
  19. diameter = temp_row
  20. else:
  21. diameter = temp_column
  22. max_radius = math.floor(diameter / 2)
  23. circle_center = (temp_row / 2, temp_column / 2)
  24. circle_ring_point = {}
  25. ###统计每个点到中心的半径,并分类###
  26. for i in range(temp_column):
  27. for j in range(temp_row):
  28. radius = round(np.sqrt((i - circle_center[0]) ** 2 + (j - circle_center[1]) ** 2))
  29. if radius > max_radius:
  30. continue
  31. if radius in circle_ring_point.keys():
  32. circle_ring_point[radius].append(j * temp_column + i)
  33. else:
  34. circle_ring_point[radius] = [j * temp_column + i]
  35. ###排序获取每个环上的点###
  36. circle_ring_point = sorted(circle_ring_point.items(), key=lambda item: item[0])
  37. circular_projection_data = []
  38. for item in circ
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/923666
推荐阅读
相关标签
  

闽ICP备14008679号