IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> opencv特征匹配中match与KnnMatch返回数据类型 -> 正文阅读

[人工智能]opencv特征匹配中match与KnnMatch返回数据类型

1、match

    # 初始化 BFMatcher
    bf = cv.BFMatcher()
    # 对描述子进行匹配
    # des1/des2分别是两幅图片特征点的特征向量
    matches = bf.match(des1, des2)
    # 打印match返回数据的类型
    print(type(matches[0]))

match匹配的返回结果是DMatch类型。

DMatch数据结构包含三个非常重要的数据分别是queryIdx,trainIdx,distance;
queryIdx:某一特征点在本帧图像的索引;
trainIdx:trainIdx是该特征点在另一张图像中相匹配的特征点的索引;

distance:代表这一对匹配的特征点描述符的欧式距离,数值越小也就说明俩个特征点越相近。

    print("queryIdx=%d"%matches[0].queryIdx)
    print("trainIdx=%d"%matches[0].trainIdx)
    print("distance=%d"%matches[0].distance)

    输出:
    queryIdx=0
    trainIdx=105
    distance=68

?2、Knnmatch

bf = cv2.BFMatcher()
matches1 = bf.knnMatch(des1, des2, k=2)
# 打印match返回数据的类型
print(type(matches1[0]))
<class 'tuple'>

knnMatch匹配的返回结果是一个元组:说明结果不能改变;

对元组内元素进行类型查询:?所以Knnmatch与match的返回值类型一样,只不过一组返回的2个DMatch类型。

bf = cv2.BFMatcher()
matches1 = bf.knnMatch(des1, des2, k=2)

for x in matches1[0]:
    print(type(x))

3、总结?

综上所知:

(1)match匹配的返回结果是DMatch类型。distance:代表这一对匹配的特征点描述符的欧式距离,数值越小也就说明俩个特征点越相近。

(2)Knnmatch与match的返回值类型一样,只不过一组返回的2个DMatch类型。这2个DMatch数据类型是2个与原图像特征点最接近的2个特征点(match返回的是最匹配的),只有这2个特征点的欧式距离小于一定值的时候才会认为匹配成功。(可以理解为:2个与原图像特征点最接近和次接近的特征点,一般第一个是最接近匹配点,第二个是次接近匹配点)

4、匹配优化?

(1)对于match类型(注意显示匹配结果:cv.drawMatches

 # 初始化 BFMatcher
    bf = cv.BFMatcher()
    # 对描述子进行匹配
    # des1/des2分别是两幅图片特征点的特征向量
    matches = bf.match(des1, des2)

    # 计算最大距离和最小距离
    min_distance = matches[0].distance
    max_distance = matches[0].distance
    for x in matches:
        if x.distance < min_distance:
            min_distance = x.distance
        if x.distance > max_distance:
            max_distance = x.distance

    # 筛选匹配点
    '''
        当描述子之间的距离大于两倍的最小距离时,认为匹配有误。
        但有时候最小距离会非常小,所以设置一个经验值30作为下限。
    '''
    good_match = []
    for x in matches:
        if x.distance <= max(2 * min_distance, 30):
            good_match.append(x)

    # 绘制匹配结果
    outimage = cv.drawMatches(img1, kp1, img2, kp2, match, outImg=None)

(2)对于Knnmatch类型(注意显示匹配结果:cv.drawMatchesKnn

# 调整ratio
# ratio=0.4:对于准确度要求高的匹配;
# ratio=0.6:对于匹配点数目要求比较多的匹配;
# ratio=0.5:一般情况下。
ratio1 = 0.3
good1 = []

for m1, n1 in matches1:
# 如果最接近和次接近的比值小于一个既定的值,那么我们保留这个最接近的值,认为它和其匹配的点为good_match
    if m1.distance < ratio1 * n1.distance:
        good1.append([m1])
match_result1 = cv2.drawMatchesKnn(img1, kp1, img2, kp2, good1, None, flags=2)

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-04-22 18:36:57  更:2022-04-22 18:38:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 10:26:03-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码