图像查找

简介: 图像查找
import cv2
import numpy as np

# 打开图片
img1 = cv2.imread('./image/min_cat.png')
img2 = cv2.imread('./image/cat.png')

# 灰度化
gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)

# 创建特征检测器
sift = cv2.xfeatures2d.SIFT_create()

# 把关键点(特征点)和描述子一起检测出来.
kp1, des1 = sift.detectAndCompute(gray1,None)
kp2, des2 = sift.detectAndCompute(gray2,None)

# 创建特征匹配器
index_params = dict(algorithm = 1, trees = 5)
search_params = dict(checks = 50)
flann = cv2.FlannBasedMatcher(index_params,search_params)

# 对描述子进行特征匹配
matches = flann.knnMatch(des1,des2,k=2)
# print(matches)

goods = []
for (m,n) in matches:
    # 阈值一般设0.7-0.8之间
    if m.distance < 0.75*n.distance:
        goods.append(m)

# print(goods)
# 通过goods把特征点找到
# 因为计算单应性矩阵要求最少4个点
if len(goods) >=4:
    src_points = np.float32([kp1[m.queryIdx].pt for m in goods]).reshape(-1,1,2)
    dst_points = np.float32([kp2[m.trainIdx].pt for m in goods]).reshape(-1,1,2)

    # 根据匹配上的关键点去计算单应性矩阵
    H , _ = cv2.findHomography(src_points,dst_points,cv2.RANSAC,5)
    # 通过单应性矩阵,计算小图在大图中的对应位置
    h,w = img1.shape[:2]
    pts = np.float32([[0,0],[0,h-1],[w-1,h-1],[w-1,0]]).reshape(-1,1,2)
    # warpPerspective 是对图片进行透视变换的
    # cv2.warpPerspective()
    dst = cv2.perspectiveTransform(pts,H)
    # 在大图中,把dst画出来
    cv2.polylines(img2,[np.int32(dst)],True,(0,0,255),2)

else:
    print('not enough point number to compute homography matrix')
    exit()

# 画出匹配的特征点
ret = cv2.drawMatchesKnn(img1,kp1,img2,kp2,[goods],None)

cv2.imshow('ret',ret)
cv2.imshow('img2',img2)

cv2.waitKey(0)
cv2.destroyAllWindows()
目录
相关文章
|
算法 搜索推荐 图计算
图计算中的社区发现算法是什么?请解释其作用和常用算法。
图计算中的社区发现算法是什么?请解释其作用和常用算法。
682 0
|
开发工具 Python
Python列表和字典前面为什么要加星号( )?_python一个 代表列表
Python列表和字典前面为什么要加星号( )?_python一个 代表列表
Go使用命令行输出二维码
Go使用命令行输出二维码
|
存储 SQL 数据库
深入理解数据库索引:提升查询性能的关键
数据库索引是优化查询性能的重要工具。本文将带你深入探索索引的内部结构和工作原理,揭示如何通过合理使用索引来加速数据库查询,同时避免常见的索引陷阱。
|
数据中心 网络架构
网络中不同类型网线的特点与应用
【8月更文挑战第24天】
1928 0
|
Windows
如何合并电脑中不同盘的分区?
【2月更文挑战第4天】本文介绍在Windows操作系统的电脑中,将磁盘上的不同分区(例如E盘与F盘)加以合并的方法~
1566 2
如何合并电脑中不同盘的分区?
|
数据采集 存储 NoSQL
爬虫在金融领域的应用:股票数据收集
本文探讨了网络爬虫在金融领域的应用,特别是在收集股票价格数据方面的实践。文章介绍了使用Scrapy框架和代理IP技术来构建爬虫,以应对反爬策略和提高数据采集效率。通过安装Scrapy和PyMongo,创建Scrapy项目,配置代理中间件,以及编写爬虫代码,实现了从Yahoo Finance抓取股票信息并存储至MongoDB。这种方法能有效助力市场分析和投资决策,提升数据采集的效率与质量。
1203 0
爬虫在金融领域的应用:股票数据收集
|
存储 人工智能 机器人
生成式 AI 与 LangCHain(一)(4)
生成式 AI 与 LangCHain(一)
1194 1
|
前端开发 Java 数据库
Layui之动态树 左侧树形菜单栏 详细全面
Layui之动态树 左侧树形菜单栏 详细全面
1167 0