gpt4 book ai didi

python - 对象列表到 numpy 数组

转载 作者:太空宇宙 更新时间:2023-11-03 21:53:27 25 4
gpt4 key购买 nike

对于我的一个图像处理项目,我需要使用关键点。为了计算它们,我发现 OpenCV 使用起来非常快速和方便。但是,当使用例如 FAST 算法计算图像的关键点时,我们会收到一个数组 KeyPoint objects .

当我得到那些关键点时,我只想获取它们的坐标,而不是附加信息(角度等)。这些坐标将用于使用 numpy 进行多次计算。问题是从 KeyPoint 数组到 numpy 数组的转换时间。它大约占总执行时间的 60%。有什么建议可以改进下面的循环吗?

import cv2
import numpy as np

image_cv2 = cv2.imread("sample.jpg")
fast = cv2.FastFeatureDetector(threshold=25)
keypoints = fast.detect(image_cv2)

n = len(keypoints)
cd_x = np.zeros(n, dtype=np.int)
cd_y = np.zeros(n, dtype=np.int)
for i in xrange(0, n):
cd_x[i] = keypoints[i].pt[0]
cd_y[i] = keypoints[i].pt[1]

PS:我尝试使用 np.vectorize,但没有发现任何改进。供引用,图像的关键点数量通常在 5 000 个左右。

更新:正如一些人指出的那样,从关键点到 numpy 数组的简单分配应该非常快。经过一些测试,确实很快。例如,对于一个包含 275 张图像的数据集,使用 1 个线程,完整的执行时间为 22.9 秒,执行 keypoints->numpy 仅需 0.2 秒,而 cv2.imread() 花费了大约 20 秒。

我的错误是同时使用了太多线程,因为每个核心都没有至少使用 80%,我不断增加它们的数量直到这个任意限制,这减慢了循环执行。谢谢大家让我睁开眼睛看到代码中其他地方的愚蠢错误!

最佳答案

一个试用案例:

In [765]: class Keypoints(object):
def __init__(self):
self.pt=[1.,2.]
.....:
In [766]: keypoints=[Keypoints() for i in xrange(1000)]
In [767]: cd=np.array([k.pt for k in keypoints])
In [768]: cd
Out[768]:
array([[ 1., 2.],
[ 1., 2.],
[ 1., 2.],
...,
[ 1., 2.],
[ 1., 2.],
[ 1., 2.]])
In [769]: cd_x=cd[:,0]

在 timeit 测试中,keypoints 步骤与 cd 计算一样长,1ms。

但是 2 个更简单的迭代

cd_x=np.array([k.pt[0] for k in keypoints])
cd_y=np.array([k.pt[1] for k in keypoints])

只需要一半的时间。我期待单次迭代可以节省时间。但在这些简单的情况下,理解本身只需要一半的时间,剩下的时间是创建数组。

In [789]: timeit [k.pt[0] for k in keypoints]
10000 loops, best of 3: 136 us per loop
In [790]: timeit np.array([k.pt[0] for k in keypoints])
1000 loops, best of 3: 282 us per loop

关于python - 对象列表到 numpy 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28862383/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com