我正在用 Python 从头开始编写一个计算机视觉库rpi
来使用相机。目前,我已经实现了转换为greyscale
和其他一些基本img
操作,它们在我的model B
rpi3
.
sobel
但是,我使用运算符(维基百科描述)的边缘检测功能比其他功能慢得多,尽管它确实有效。这里是:
def sobel(img):
xKernel = np.array([[-1,0,1],[-2,0,2],[-1,0,1]])
yKernel = np.array([[-1,-2,-1],[0,0,0],[1,2,1]])
sobelled = np.zeros((img.shape[0]-2, img.shape[1]-2, 3), dtype="uint8")
for y in range(1, img.shape[0]-1):
for x in range(1, img.shape[1]-1):
gx = np.sum(np.multiply(img[y-1:y+2, x-1:x+2], xKernel))
gy = np.sum(np.multiply(img[y-1:y+2, x-1:x+2], yKernel))
g = abs(gx) + abs(gy) #math.sqrt(gx ** 2 + gy ** 2) (Slower)
g = g if g > 0 and g < 255 else (0 if g < 0 else 255)
sobelled[y-1][x-2] = g
return sobelled
greyscale
并用这张猫的图像运行它:
我得到了这个回复,这似乎是正确的:
该库的应用,特别是这个功能,是在一个下棋机器人上,边缘检测将有助于识别棋子的位置。问题是运行需要>15
几秒钟,这是一个严重的问题,因为它会大大增加机器人移动所需的时间。
我的问题是:我怎样才能加快速度?
到目前为止,我已经尝试了几件事:
而不是
squaring
thenadding
,然后square rooting
是gx
和gy
值来获得总梯度,我只是sum
值absolute
。这大大提高了速度。使用
resolution
来自rpi
相机的较低图像。这显然是一种使这些操作运行得更快的简单方法,但它并不是真正可行的,因为它在最小可用分辨率下仍然非常慢,480x360
从相机的最大值大幅降低3280x2464
。编写嵌套的 for 循环来
matrix convolutions
代替np.sum(np.multiply(...))
. 这最终稍微慢了一点,这让我感到惊讶,因为np.multiply
返回了一个新数组,我认为使用loops
. 我认为虽然这可能是由于numpy
大部分是写入的,C
或者新数组实际上没有存储,所以不需要很长时间,但我不太确定。
任何帮助将不胜感激 - 我认为改进的主要内容是 point 3
,即matrix
乘法和求和。