opencv for python 之 模板匹配

import cv2.cv as cv

#load image
filename = "../Video/cat.jpg"
image = cv.LoadImage(filename)


#create one window
win_name = "test"
cv.NamedWindow(win_name)
win2_name = "test2"
cv.NamedWindow(win2_name)


#take off one template
rect = (170,80,50,50)
cv.SetImageROI(image, rect)
template = cv.CloneImage(image)
cv.ShowImage(win_name, template)

 

cv.ResetImageROI(image)
W,H=cv.GetSize(image)
w,h=cv.GetSize(template)
width=W-w+1
height=H-h+1
result=cv.CreateImage((width,height),32,1)

result 是一个矩阵,存储了模板与源图像每一帧相比较后的相似值,
cv.MatchTemplate(image,template, result,cv.CV_TM_SQDIFF)

下面的操作将从矩阵中找到相似值最小的点,从而定位出模板位置
(min_x,max_y,minloc,maxloc)=cv.MinMaxLoc(result)
(x,y)=minloc
cv.Rectangle(image,(int(x),int(y)),(int(x)+w,int(y)+h),(255,255,255),1,0)
cv.ShowImage(win2_name, image)

cv.WaitKey()

模板匹配结果


### 使用 Python OpenCV 实现 LineMOD 二维模板匹配 LineMOD 是一种基于局部特征描述子的物体识别算法,特别适用于具有挑战性的场景下的快速和鲁棒检测。为了在 Python 中使用 OpenCV 进行 LineMOD 模板匹配,通常需要依赖于一些额外库的支持,比如 `opencv-contrib-python` 提供的一些高级功能。 #### 安装必要的包 要运行下面的例子,确保安装了所需的 Python 库: ```bash pip install numpy opencv-python-headless opencv-contrib-python ``` #### 加载图像并初始化模型 加载待处理图片作为目标对象,并创建一个 ORB 描述符提取器实例来获取关键点和描述向量[^1]。 ```python import cv2 import numpy as np # 初始化ORB检测器 orb = cv2.ORB_create() # 读取训练样本(即模板) 和 测试图像 (即场景图) template_image = cv2.imread('path_to_template.png', 0) scene_image = cv2.imread('path_to_scene.png', 0) kp_train, des_train = orb.detectAndCompute(template_image, None) kp_test, des_test = orb.detectAndCompute(scene_image, None) ``` #### 创建 FLANN 基于 KDTree 的索引参数配置 FLANN(Fast Library for Approximate Nearest Neighbors)是一种近似最近邻搜索库,在这里用来加速特征点之间的匹配过程。 ```python index_params= dict(algorithm = 6, table_number = 6, # 12 key_size = 12, # 20 multi_probe_level = 1)#2 search_params = dict(checks=50) # or pass empty dictionary flann = cv2.FlannBasedMatcher(index_params, search_params) matches = flann.knnMatch(des_train,des_test,k=2) ``` #### 筛选良好匹配项 通过设定阈值筛选出高质量的关键点配对关系,这一步骤对于提高最终定位精度非常重要。 ```python good_matches = [] for m,n in matches: if m.distance < 0.7*n.distance: good_matches.append(m) if len(good_matches)>MIN_MATCH_COUNT: src_pts = np.float32([ kp_train[m.queryIdx].pt for m in good_matches ]).reshape(-1,2) dst_pts = np.float32([ kp_test[m.trainIdx].pt for m in good_matches ]).reshape(-1,2) M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC,5.0) h,w = template_image.shape[:2] pts = np.float32([[0,0],[0,h-1],[w-1,h-1],[w-1,0]]).reshape(-1,1,2) dst = cv2.perspectiveTransform(pts,M) scene_image = cv2.polylines(scene_image,[np.int32(dst)],True,(0,255,0),3, cv2.LINE_AA) else: print("Not enough matches are found - %d/%d" %(len(good_matches), MIN_MATCH_COUNT)) ``` 此段代码展示了如何利用 ORB 特征描述子与 FLANN 匹配机制完成基本的对象识别任务;然而请注意,真正的 LineMOD 方法涉及更多复杂的预处理步骤和技术细节,上述只是简化版实现方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值