我正在用python编写一个方法,该方法通过OpenCV的手段,它处理来自相机的一些图像,并将该图像与一些参数逐像素进行比较,并根据这些参数,将该像素归零。这段代码是这样做的:
while True:
ret, frame = cap.read() # retrieve image from the camera
for row in range(rows):
for col in range(cols):
b1 = (frame[row][col][:] < Nsigma2[row][col][:]).all();
b2 = (frame[row][col][:] > Psigma2[row][col][:]).all();
if not b1 and not b2:
frame[row][col][:] = [0,0,0];
cv.imshow('frame',frame) #show the processed image
if cv.waitKey(15) & 0xFF == ord('q'):
break
除了算法本身的正确性之外,这是遍历和访问numpy
矩阵的正确方法吗?但这是非常缓慢的。我认为最慢的方向是矩阵的第三个分量,我在内环中访问它,但我找不到更好的方法。我不是很习惯Python,所以,这是正常的和预期的缓慢性能?
让你慢下来的很可能是循环,这不是Python的优势之一。除此之外,我怀疑记忆访问是否相关。您可以对处理进行矢量化,并一次完成所有操作,让numpy在内部循环遍历这些值。这三行:
b1 = np.all(frame < NSigma2, axis=-1)
b2 = np.all(frame > PSigma2, axis=-1)
frame[~(b1 | b2)] = 0
可以取代你的两个嵌套循环。您将无法看到图像逐像素处理,尽管您现在似乎正在这样做。