Python使用opencv实现图片定位第三种方式

# -*- encoding=utf-8 -*-
__author__ = 'Jeff.xie'

#这个方法识别度更高,比cv2.matchTemplate更好,
#cv2.matchTemplate无定位的图片,这个方法可以
import cv2
# bgPath='D:\\Reg_Card_007_IOS_02.png'
# desPath='D:\\ReportLostCard.png'
bgPath='D:\\Setting.png'
desPath='D:\\Connect.png'
img1=cv2.imread(bgPath)  #大图
img2=cv2.imread(desPath)
#使用SIFT算法获取图像特征的关键点和描述符
sift=cv2.xfeatures2d.SIFT_create()
kp1,des1=sift.detectAndCompute(img1,None)
kp2,des2=sift.detectAndCompute(img2,None)

#定义FLANN匹配器
indexParams=dict(algorithm=0,trees=10)
searchParams=dict(checks=50)
flann=cv2.FlannBasedMatcher(indexParams,searchParams)
#使用KNN算法实现图像匹配,并对匹配结果排序
matches=flann.knnMatch(des1,des2,k=2)
matches=sorted(matches,key=lambda x:x[0].distance)

#去除错误匹配,0.5是系数,系数大小不同,匹配的结果页不同
goodMatches=[]
for m,n in matches:
    if m.distance<0.5*n.distance:
        goodMatches.append(m)
print(len(matches))
print(len(goodMatches))
#获取某个点的坐标位置
#index是获取匹配结果的中位数
index=int(len(goodMatches)/2)
#queryIdx是目标图像的描述符索引
x,y=kp1[goodMatches[0].queryIdx].pt  #获取小图片中心点
#将坐标位置勾画在2.png图片上,并显示
src_img = cv2.imread(bgPath,cv2.IMREAD_GRAYSCALE)
height,width = src_img.shape
print("width:",width)
print("height:",height)
des_img = cv2.imread(desPath,cv2.IMREAD_GRAYSCALE)
des_height,des_width = des_img.shape
print("des_width:",des_width)
print("des_height:",des_height)
print(x)
print(y)
xper = int(x/width*100)
yper = int(y/height*100)
print("xper",xper)
print("yper",yper)
x1 = int(x-des_width/2)
y1 = int(y-des_height/2)
x2 = int(x+des_width/2)
y2 = int(y+des_height/2)
# cv2.rectangle(img1,(int(x),int(y)),(int(x)+50,int(y)+50),(0,255,0),2)
cv2.rectangle(img1,(x1,y1),(x2,y2),(0,255,0),2)
cv2.imshow('baofeng',img1)
cv2.waitKey()

import cv2
#读取图片,以D:\\Battery.png为例
img=cv2.imread('D:\\Battery.png')
#检测关键点并计算描述
sift=cv2.xfeatures2d.SIFT_create()
#描述符是对关键点的描述,可用于图片匹配
keypoints,descriptor=sift.detectAndCompute(img,None)
#将关键点勾画到图片上
flags=cv2.DRAW_MATCHES_FLAGS_DEFAULT
color=(0,255,0)

#参数image代表原始图片
#参数outImage是指输出在哪张图片上
#参数keypoints代表图片的关键点
#参数flags代表关键点的勾画方式
#参数color代表勾画的色彩模式
img=cv2.drawKeypoints(image=img,outImage=img,keypoints=keypoints,flags=flags,color=color)

#显示图片
cv2.imshow('sift_keypoints',img)
cv2.waitKey(0)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值