OpenCV(图像处理)-图片搜索

本文涉及的产品
图像搜索,7款服务类型 1个月
简介: 1.知识介绍Opencv进行图片搜索需要的知识有:特征点匹配+单应性矩阵知识,特征点匹配作者前面文章有记录。单应性矩阵:两个不同视角上的点所对应的单应性矩阵可以用同一个射影变换来表述可以简单理解为变换矩阵H,x1 = h*x2

1.知识介绍

Opencv进行图片搜索需要的知识有:特征点匹配+单应性矩阵知识,特征点匹配作者前面文章有记录。

单应性矩阵两个不同视角上的点所对应的单应性矩阵可以用同一个射影变换来表述可以简单理解为变换矩阵H,x1 = h*x2

2.实现流程

2.1 计算特征点与描述子

分别计算查询图片和训练图片的特征点和特征点的描述子,为后面进行特征点的匹配作准备,使用ORB算法来实现。

# 读取两个图片
img1 = cv2.imread('./image/opencv_search.png')
img2 = cv2.imread('./image/opencv_orig.png')
# 转换为灰度图
g1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
g2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
# 创建ORB对象
orb = cv2.ORB_create()
# 对orb特征点检测与描述子计算 ,特征点为KeyPoint
kp1, dst1 = orb.detectAndCompute(g1, None)
kp2, dst2 = orb.detectAndCompute(g1, None)

2.2 描述子的匹配

创建FLANN的匹配器进行匹配,然后根据比例筛选所有符合条件的匹配项。

# 创建FLANN所需要的参数
FLANN_INDEX_LSH = 6
index_params = dict(algorithm=FLANN_INDEX_LSH,
                    table_number=6,
                    key_size=12,
                    multi_probe_level=1)
search_params = dict(checks=100)
# 创建FLANN匹配器
flann = cv2.FlannBasedMatcher(index_params, search_params)
# 进行匹配子计算, matches是一个元组
matches = flann.knnMatch(dst1, dst2, k=2)
# print(matches)
# 根据比率测试所有符合符合条件的匹配项
good = []
for m, n in matches:
    if m.distance < 0.7*n.distance:
        good.append(m)

2.3 求出单应性矩阵并画出轮廓

根据匹配的描述子来求单应性矩阵(3*3),然后根据透视变换来求出在训练集上的轮廓,并画出来

if len(good) > 10:
    # 寻找单应性矩阵
    src_pts = np.float32([ kp1[m.queryIdx].pt for m in good ]).reshape(-1, 1, 2)
    dst_pts = np.float32([ kp2[m.trainIdx].pt for m in good ]).reshape(-1, 1, 2)
    # M即为单应性矩阵(可以理解就是变换矩阵)  x1 = M*x2
    M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0)
    # 将mask拉成一维数组,并转换成列表的形式
    matchesMask = mask.ravel().tolist()
    h, w, d = img1.shape
    # 绘制矩形的四个坐标点
    pts = np.float32([ [0, 0], [0, h-1], [w-1, h-1], [w-1, 0] ]).reshape(-1, 1, 2)
     # 求透视变换的矩阵,求训练图中的部分,求出轮廓边缘
    dst = cv2.perspectiveTransform(pts, M)
    # 在图2上画矩形
    img2 = cv2.polylines(img2, [np.int32(dst)], True, 255, 3, cv2.LINE_AA)
else:
    print(f"Not enough matches are found - {len(good)} / {10}")
    matchesMask = None

2.4 将特征点标出

draw_params = dict(matchColor=(0, 255, 0),
                   singlePointColor=(255, 0, 0),
                   matchesMask=matchesMask,
                   flags=cv2.DrawMatchesFlags_DEFAULT)
img3 = cv2.drawMatches(img1, kp1, img2, kp2, good, None, **draw_params)
cv2.imshow('img3', img3)
cv2.waitKey(0)


f4da5b834dc542769d1cd24a25d32931.png

目录
相关文章
|
2月前
|
openCL 开发工具 C语言
OpenCV 图像处理学习手册:6~7
OpenCV 图像处理学习手册:6~7
94 0
|
2月前
|
存储 编解码 算法
OpenCV 图像处理学习手册:1~5
OpenCV 图像处理学习手册:1~5
47 0
|
2月前
|
人工智能 Linux API
OpenCV这么简单为啥不学——1.1、图像处理(灰度图、模糊图片、GaussianBlur函数、提取边缘、边缘膨胀、边缘细化)
OpenCV这么简单为啥不学——1.1、图像处理(灰度图、模糊图片、GaussianBlur函数、提取边缘、边缘膨胀、边缘细化)
61 0
|
2月前
|
算法 API 计算机视觉
OpenCV(图像处理)-基于Python-形态学处理-开运算、闭运算、顶帽、黑帽运算
1. 形态学 OpenCV形态学是一种基于OpenCV库的数字图像处理技术,主要用于处理图像的形状、结构和空间关系。它包括一系列图像处理工具和算法,包括膨胀、腐蚀、开运算、闭运算、形态学梯度、顶帽、黑帽等。
79 0
|
2月前
|
人工智能 计算机视觉 Python
【OpenCV】计算机视觉图像处理基础知识(上)
【OpenCV】计算机视觉图像处理基础知识(上)
|
2月前
|
算法 计算机视觉
【OpenCV】计算机视觉图像处理基础知识(下)
【OpenCV】计算机视觉图像处理基础知识(下)
|
2月前
|
机器学习/深度学习 算法 Linux
使用OpenCV在Python中进行图像处理
使用OpenCV在Python中进行图像处理
|
2月前
|
算法 安全 机器人
最新版opencv4.9安装介绍,基本图像处理详解
最新版opencv4.9安装介绍,基本图像处理详解
|
2月前
|
缓存 算法 计算机视觉
OpenCV图像处理-视频分割静态背景-MOG/MOG2/GMG
1.概念介绍 视频背景扣除原理:视频是一组连续的帧(一幅幅图组成),帧与帧之间关系密切(GOP/group of picture),在GOP中,背景几乎是不变的,变的永远是前景。
171 0
|
2月前
|
机器学习/深度学习 存储 算法
OpenCV与NumPy:图像处理中的黄金组合
【4月更文挑战第17天】OpenCV和NumPy是Python图像处理的两大利器,互补协作形成黄金组合。OpenCV专注计算机视觉,提供丰富算法,而NumPy擅长数值计算和数组操作。两者无缝对接,共同实现高效、灵活的图像处理任务。通过灰度化、二值化、边缘检测等案例,展示了它们的协同作用。未来,这一组合将在计算机视觉和机器学习领域发挥更大作用,解锁更多图像处理潜力。