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

时间:2016-10-12 09:13:39

标签: 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)

哪个州

  

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

根据我对英语的理解,他们的解释是不是错了?不应该是:

  

Numpy以(行,列)格式提供坐标,而OpenCV以(y,x)(列,行)格式提供坐标。

我的问题是:

  1. numpy是否返回(row,col) / (x,y)和OpenCV (y,x)所在的行= x,col = y?虽然恕我直言,它应该是row = y,col = x?

  2. 哪一项计算效率更高?在时间和方面资源。

  3. 由于不是非母语的英语人士,也许我没有把这件事变得简单。

1 个答案:

答案 0 :(得分:6)

文档中有错误:

  

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。

  3. 比较这两个版本的运行时测试 -

    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对应的速度。