cv2.findNonZero和Numpy.NonZero之间的区别

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)(列,行)格式提供坐标.

我的问题是:

  1. numpy返回(row,col)/(x,y)和OpenCV (y,x),其中row = x,col = y?虽然恕我直言,它应该是row = y,col = x?

  2. 哪一个更有计算效率?在时间和资源方面.

也许我不是因为不是非英语母语人士而得到这么简单的事情.

Mik*_*iki 7

文档中有错误:

Numpy以(行,列)格式给出坐标,而OpenCV给出(x,y)格式的坐标.所以答案基本上是互换的.请注意,row = x和column = y. 请注意,row = y和column = x.

所以,关于你的问题:

  1. numpy返回(row,col) = (y,x),OpenCV返回(x,y) = (col,row)
  2. 您需要扫描整个矩阵并检索一些点.我不认为性能会有任何显着差异(应该进行测试!).

    由于您使用的是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对应的加速.