图像中缺少关键点

问题描述 投票:0回答:1

我想在图像上手动设置22个关键点,以便提取它们的特征。为了完成这个任务,我用我手动选择的坐标创建了一个关键点数组,并在orb.compute中传递向量作为参数,然后他们分别绘制关键点。

我的问题是,我在图像的不同部分设置了22个点,但图像中不会显示超过14个关键点。

下面是一个例子,我希望在哪些位置绘制22个关键点。

enter image description here

实际情况是:

enter image description here

点被改变了一点从一个图像到另一个, 但它的坐标在代码中是什么事项,图像是说明性的例子 什么IM尝试做和什么IM得到。

这里是我的代码的可复制版本。

import pandas as pd
import skimage
import cv2
                imageList = skimage.io.imread("./a.png")  
                orb = cv2.ORB_create()
                key_points = [cv2.KeyPoint(65, 9, 10), <---- missing
                              cv2.KeyPoint(66, 12, 10), 
                              cv2.KeyPoint(62, 21, 10),
                              cv2.KeyPoint(60, 13, 10),
                              cv2.KeyPoint(67, 12, 10),
                              cv2.KeyPoint(107, 6, 10), <---- missing
                              cv2.KeyPoint(170, 10, 10),<---- missing 
                              cv2.KeyPoint(25, 60, 10), 
                              cv2.KeyPoint(60, 40, 10), 
                              cv2.KeyPoint(110, 35, 10), 
                              cv2.KeyPoint(170, 35, 10), 
                              cv2.KeyPoint(190, 60, 1), 
                              cv2.KeyPoint(30, 95, 10), <---- missing
                              cv2.KeyPoint(60, 80, 10), 
                              cv2.KeyPoint(100, 105, 10), 
                              cv2.KeyPoint(120, 105, 10),
                              cv2.KeyPoint(160, 180, 10), 
                              cv2.KeyPoint(185, 95, 10), 
                              cv2.KeyPoint(25, 160, 10), <---- missing
                              cv2.KeyPoint(55, 160, 10), 
                              cv2.KeyPoint(155, 160, 10), 
                              cv2.KeyPoint(185, 160, 10), <---- missing
                              cv2.KeyPoint(65, 200, 10), <----- missing
                              cv2.KeyPoint(83, 186, 10), 
                              cv2.KeyPoint(128, 186, 10), 
                              cv2.KeyPoint(157, 197, 10) <---- missing]
                kp, des = orb.compute(imageList, key_points)
                kparray = cv2.drawKeypoints(imageList, kp, None, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS); 
                cv2.imshow("Image", kparray)
                cv2.waitKey(0)

出于某种原因,我设置了22个点,可以看到上面,但当我运行代码时,它只显示了14个点,有些点不见了,我甚至试图打印cv2.drawKeyPoints中的kp参数来确定,即使如此,我试图手动设置22个点。

[<KeyPoint 000002DF9DE83B40>, 
<KeyPoint 000002DF9DE83F90>, 
<KeyPoint 000002DF9DE83FC0>, 
<KeyPoint 000002DF9DE83F30>, 
<KeyPoint 000002DF9DE83DB0>, 
<KeyPoint 000002DFAB657030>, 
<KeyPoint 000002DFAB657B40>, 
<KeyPoint 000002DFAC1FED20>, 
<KeyPoint 000002DFAC1FE480>, 
<KeyPoint 000002DFAC1FEC90>, 
<KeyPoint 000002DFAC1FEDE0>, 
<KeyPoint 000002DFAC20D030>, 
<KeyPoint 000002DFAC20D060>, 
<KeyPoint 000002DFAC20D0C0>]
python opencv feature-extraction cv2 orb
1个回答
2
投票

首先,为了理解这个问题,我不得不大幅减少提供的代码。这可能会阻碍人们的帮助。

此外,你还写了:

当我运行我的代码时,它只显示了14个,有些是缺失的,我甚至尝试打印cv2.drawKeyPoints中的kp参数以确保,即使如此。

所以,据我所知,这不是OpenCV显示什么的问题,而是ORB能够计算出的关键点的问题。

所以,让我重新表述一下你的问题。

在OpenCV中,为什么ORB的计算会删除一些关键点? 下面是重现的最小代码。

import skimage
import cv2

imageList = skimage.io.imread("./a.png")
orb = cv2.ORB_create()
key_points = [cv2.KeyPoint(65, 9, 10), cv2.KeyPoint(66, 40, 10)]
kp, des = orb.compute(imageList, key_points)
print(len(kp))

打印 "1"

因此,答案可以是 在其他一些StackOverflow问题中

例如,改变阈值,对我来说,改变了结果。

...
orb = cv2.ORB_create(edgeThreshold=1)
...
print(len(kp))

返回 "2"

不幸的是,我不是ORB专家,所以如果你重新表述你的问题,以吸引ORB专家的注意,而不是我的注意,可能会有更好的效果。

祝您好运。

© www.soinside.com 2019 - 2024. All rights reserved.