对于我的一个图像处理项目,我需要使用关键点。为了计算它们,我发现OpenCV的使用非常快速和方便。但是,当使用快速算法计算图像的关键点时,我们会收到一个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]
我试着用np矢量化但我没有注意到任何改善。对于信息,按图像显示的关键点的数量通常在5000个左右。在
更新: 正如一些人指出的,从关键点到numpy数组的简单分配应该相当快。经过一些测试,它确实很快。例如,对于一个包含275个图像的数据集,使用1个线程,完整的执行时间为22.9秒,而关键点->数量的执行时间只有0.2秒,而cv2.imread()的执行时间大约为20秒。在
我的错误是在同一时间使用太多的线程,因为每个内核至少没有使用80%,我一直在增加它们的数量,直到这个任意的限制,这减慢了循环的执行。感谢大家让我睁开眼睛看到代码中其他地方的愚蠢错误!在
审判案件:
在timeit测试中,
keypoints
步骤的时间与cd
计算的时间一样长,1ms但是两个更简单的迭代
^{pr2}$花了一半的时间。我希望单次迭代可以节省时间。但是在这些简单的情况下,理解本身只需要一半的时间,其余的时间是创建数组。在
相关问题 更多 >
编程相关推荐