Rox*_*nne 4 python opencv numpy
傻问题在这里.
我想从一些黑白图像中找到像素的位置,并从Numpy库和OpenCV中找到这两个函数.
我在互联网上找到的例子(http://docs.opencv.org/trunk/d1/d32/tutorial_py_contour_properties.html):
mask = np.zeros(imgray.shape,np.uint8)
cv2.drawContours(mask,[cnt],0,255,-1)
pixelpoints = np.transpose(np.nonzero(mask))
pixelpointsCV2 = cv2.findNonZero(mask)
Run Code Online (Sandbox Code Playgroud)
哪个州
Numpy以(行,列)格式给出坐标,而OpenCV给出(x,y)格式的坐标.所以答案基本上是互换的.请注意,row = x和column = y.
根据我对英语的理解,是不是他们的解释错了?不应该是:
Numpy以(行,列)格式提供坐标,而OpenCV以(y,x)或(列,行)格式提供坐标.
我的问题是:
numpy返回(row,col)/(x,y)和OpenCV (y,x),其中row = x,col = y?虽然恕我直言,它应该是row = y,col = x?
哪一个更有计算效率?在时间和资源方面.
也许我不是因为不是非英语母语人士而得到这么简单的事情.
文档中有错误:
Numpy以(行,列)格式给出坐标,而OpenCV给出(x,y)格式的坐标.所以答案基本上是互换的.
请注意,row = x和column = y.请注意,row = y和column = x.
所以,关于你的问题:
(row,col) = (y,x),OpenCV返回(x,y) = (col,row)您需要扫描整个矩阵并检索一些点.我不认为性能会有任何显着差异(应该进行测试!).
由于您使用的是Python,因此最好使用Python工具,例如numpy.
比较这两个版本的运行时测试 -
In [86]: mask = (np.random.rand(128,128)>0.5).astype(np.uint8)
In [87]: %timeit cv2.findNonZero(mask)
10000 loops, best of 3: 97.4 µs per loop
In [88]: %timeit np.nonzero(mask)
1000 loops, best of 3: 297 µs per loop
In [89]: mask = (np.random.rand(512,512)>0.5).astype(np.uint8)
In [90]: %timeit cv2.findNonZero(mask)
1000 loops, best of 3: 1.65 ms per loop
In [91]: %timeit np.nonzero(mask)
100 loops, best of 3: 4.8 ms per loop
In [92]: mask = (np.random.rand(1024,1024)>0.5).astype(np.uint8)
In [93]: %timeit cv2.findNonZero(mask)
100 loops, best of 3: 6.75 ms per loop
In [94]: %timeit np.nonzero(mask)
100 loops, best of 3: 19.4 ms per loop
Run Code Online (Sandbox Code Playgroud)
因此,似乎使用OpenCV可以在3x不同的数据量上实现NumPy对应的加速.