【问题标题】:How to manually set keypoints and extract features如何手动设置关键点并提取特征
【发布时间】:2020-09-08 18:33:58
【问题描述】:

我正在使用 ORB 来检测一组图像上的关键点,如下例所示:

我想要做的是:我想在图像的特定坐标处手动设置 22 个点,并将从这些点中提取的特征存储到特征向量中。例如:

之后,将这些特征分别存储到第 22 维向量中。

我目前用来加载我的图像并设置关键点的代码是这样的:

import matplotlib.pyplot as plt
import numpy as np
import os
import pandas as pd
from sklearn.utils import Bunch
from skimage.io import imread
import skimage
import cv2

DATADIR = "C:/Dataset"
CATEGORIES = ["class 1", "class 2", "class 3", "class 4", "class 5"]


def load_image_files(fullpath):
    descr = "A image classification dataset"
    for category in CATEGORIES:
        path = os.path.join(DATADIR, category)
        for person in os.listdir(path):
            personfolder = os.path.join(path, person)
            for imgname in os.listdir(personfolder):
                class_num = CATEGORIES.index(category)
                fullpath = os.path.join(personfolder, imgname)
                imageList = skimage.io.imread(fullpath)
                orb = cv2.ORB_create(22)
                kp, des = orb.detectAndCompute(imageList, None)'''
                orb = cv2.ORB_create()
                key_points = [cv2.KeyPoint(64, 9, 1), cv2.KeyPoint(107, 6, 10), cv2.KeyPoint(171, 10, 10)]
                kp, des = orb.compute(imageList, key_points)
                drawnImages = cv2.drawKeypoints(imageList, kp, None, flags= cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
                cv2.imshow("Image", drawnImages)
                cv2.waitKey(0)

    return Bunch(target_names=CATEGORIES,
                     images=images,
                     DESCR=descr)

这些是我希望从中提取特征的坐标

p1 = 60, 10
p2 = 110, 10
p3 = 170, 10
p4 = 25, 60
p5 = 60, 40
p6 = 110, 35
p7 = 170, 35
p8 = 190, 60
p9 = 30, 95
p10 = 60, 80
p11 = 100, 105
p12 = 120, 105
p13 = 160, 180
p14 = 185, 95
p15 = 25, 160
p16 = 55, 160
p17 = 155, 160
p18 = 185, 160
p19 = 65, 200
p20 = 83, 186
p21 = 128, 186
p22 = 157, 197

【问题讨论】:

标签: python opencv computer-vision feature-extraction


【解决方案1】:

使用 orb API 中的计算方法。一些标准将是

kp = orb.detect(img,None)
kp, des = orb.compute(img, kp)

但对于您的情况,关键点来自用户输入,因此请使用类似

input_kp = # comes from user
kp, des = orb.compute(img, input_kp)

确保输入关键点与计算方法所期望的格式相匹配。您可以像这样从 x、y 值创建关键点。

key_points = [cv2.KeyPoint(x1, y1, 1), cv2.KeyPoint(x2, y2, 1) ...]

【讨论】:

  • 好吧,我尝试使用 orb.compute 对 1 个关键点进行测试,它给了我这个错误 SystemError: returned NULL without setting an error For when我尝试以下方法:orb.compute(imageList, [64, 9])
  • 对不起,我以前从未使用过 orb 或 compute 方法,你能给我举个例子,例如我如何传递 1 或 2 个关键点作为参数吗?我用 KP 编辑了主帖跨度>
  • 对不起。我应该更清楚。关键点应该是 KeyPoint 对象。所以尝试类似 [cv2.KeyPoint(64, 9, 1)]
  • 现在需要在图像中显示关键点,我之前所做的是 cv2.drawKeypoints(imageList, kp, None, flags= cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)。如何将关键点数组传递给 cv2.drawKeypoints?我已经编辑了主要帖子,以便更清楚地了解我如何尝试您的建议
  • 我已经尝试过类似的方法及其工作 kps = [cv2.KeyPoint(600,500,1), cv2.KeyPoint(500,600,1)]; kp, des = orb.compute(img, kp);复制 = cv2.drawKeypoints(img, kp, outImage = None);你遇到什么错误了吗?
猜你喜欢
  • 2017-10-08
  • 2018-07-08
  • 1970-01-01
  • 2016-04-25
  • 1970-01-01
  • 1970-01-01
  • 2015-08-23
  • 1970-01-01
  • 2014-02-27
相关资源
最近更新 更多