Python中opencv2 ORB数据结构的深拷贝

4 投票
1 回答
1321 浏览
提问于 2025-04-18 05:57

我想用之前在一张图片中找到的ORB特征位置,去提取另一张图片中的ORB描述符。也就是说,我想直接用之前找到的位置,而不再使用检测器。

但是我就是无法得到检测到的特征的深拷贝,以便处理后再传回去生成新的描述符。

  1. 用原始的、未修改的f1关键点来为im_y图片生成描述符是可行的。
  2. 两次运行检测器来确认重复的特征当然可以,但这有点像变通的方法,我想对原始特征点做一些处理。
  3. 我在使用Python 2.7.6和通过macports安装的Opencv 2.4.8,操作系统是OS X 10.8.5。

代码:

from matplotlib import pyplot as plt
import copy as cp
import cv2

im_x = cv2.imread('stinkbug1.png', 0)
im_y = cv2.imread('stinkbug2.png', 0)

orb = cv2.ORB()

# Keypoint detection in first image
f1 = orb.detect(im_x, None)
f1, d1 = orb.compute(im_x, f1)

# Make a copy of the orginal key points
f2 = cp.deepcopy(f1)

# Magic processing here

# Get descriptors from second y image using the detected points from the x image
f2, d2 = orb.compute(im_y, f2)

# f2 and d2 are now an empty list and a <NoneType>

1 个回答

5

看起来,deepcopy在KeyPoint上不太管用。因为特征f1只是一个KeyPoint的列表,你可以手动复制这个关键点的列表:

def features_deepcopy (f):
    return [cv2.KeyPoint(x = k.pt[0], y = k.pt[1], 
            _size = k.size, _angle = k.angle, 
            _response = k.response, _octave = k.octave, 
            _class_id = k.class_id) for k in f]

f2 = features_deepcopy(f1)

希望这能帮到你 ;-)

Christophe

撰写回答