这里有愚蠢的问题。
我想从一些黑白图像中找到像素的位置,并从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)
哪个州
Numpy以(行,列)格式提供坐标,而OpenCV以(x,y)格式提供坐标。所以答案基本上是互换的。请注意,row = x和column = y。
根据我对英语的理解,他们的解释是不是错了?不应该是:
Numpy以(行,列)格式提供坐标,而OpenCV以(y,x)或(列,行)格式提供坐标。
我的问题是:
numpy是否返回(row,col) / (x,y)和OpenCV (y,x)所在的行= x,col = y?虽然恕我直言,它应该是row = y,col = x?
哪一项计算效率更高?在时间和方面资源。
由于不是非母语的英语人士,也许我没有把这件事变得简单。
答案 0 :(得分:6)
文档中有错误:
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
因此,似乎使用OpenCV会导致3x
在不同的数据量上超过NumPy对应的速度。