【问题标题】:OpenCV - locations of all non-zero pixels in binary imageOpenCV - 二值图像中所有非零像素的位置
【发布时间】:2013-02-20 05:12:38
【问题描述】:

如何找到二值图像 (cv::Mat) 中所有非零像素的位置?我是否必须扫描图像中的每个像素,或者是否有可以使用的高级 OpenCV 函数?输出应该是一个点向量(像素位置)。

例如,这可以在 Matlab 中简单地完成:

imstats = regionprops(binary_image, 'PixelList');
locations = imstats.PixelList;

或者,甚至更简单

[x, y] = find(binary_image);
locations = [x, y];

编辑:也就是说,如何找到cv::Mat中所有非零元素的坐标?

【问题讨论】:

  • 你用的是哪个版本的opencv?在 2.4.4 python 版本中,我可以找到一个类似的函数“cv2.findNonzero”,这意味着它也应该存在于 C++ 中。但它不在文档中。所以安装 2.4.4 并检查该功能。
  • 谢谢,我的 OpenCV 版本 2.4.2 (C++) 中没有 cv::findNonzero。
  • 我认为它来自 2.4.4。我从 2.4.4 python 版本得到它。所以如果你想使用它,你可以更新到 2.4.4
  • 我可以试试,奇怪的是它没有记录在案
  • 已安装版本 2.4.4。确实有一个 C++ 函数 cv::findNonZero 可以完全满足要求。这个功能只有2.4.4版本才有,在opencv的早期版本中是没有的。 @AbidRahmanK 您可以将您的评论作为答案。谢谢!

标签: c++ opencv


【解决方案1】:

我将此作为编辑放在亚历克斯的回答中,但它没有得到审查,所以我会在这里发布,因为它是有用的信息恕我直言。

您还可以传递点向量,以便之后更轻松地使用它们:

std::vector<cv::Point2i> locations;   // output, locations of non-zero pixels 
cv::findNonZero(binaryImage, locations);

对于cv::findNonZero 函数的一般注意事项:如果binaryImage 包含零个非零元素,它会抛出,因为它试图分配'1 xn' 内存,其中n 是cv::countNonZero,而n 显然会则为 0。我通过事先手动调用cv::countNonZero 来规避这种情况,但我不太喜欢这种解决方案。

【讨论】:

    【解决方案2】:

    任何希望在 python 中执行此操作的人。也可以使用 numpy 数组执行此操作,因此您无需升级您的 opencv 版本(或使用未记录的函数)。

    mask = np.zeros(imgray.shape,np.uint8)
    cv2.drawContours(mask,[cnt],0,255,-1)
    pixelpoints = np.transpose(np.nonzero(mask))
    #pixelpoints = cv2.findNonZero(mask)
    

    注释掉的是使用 openCV 代替的相同功能。欲了解更多信息,请参阅:

    https://github.com/abidrahmank/OpenCV2-Python-Tutorials/blob/master/source/py_tutorials/py_imgproc/py_contours/py_contour_properties/py_contour_properties.rst

    【讨论】:

      【解决方案3】:

      正如@AbidRahmanK 所建议的,OpenCV 2.4.4 版中有一个函数cv::findNonZero。用法:

      cv::Mat binaryImage; // input, binary image
      cv::Mat locations;   // output, locations of non-zero pixels 
      cv::findNonZero(binaryImage, locations);
      

      它完成了这项工作。此功能在 OpenCV 2.4.4 版本中引入(例如,在 2.4.2 版本中不可用)。此外,截至目前,findNonZero 出于某种原因不在文档中。

      【讨论】:

        猜你喜欢
        • 2013-10-15
        • 2020-09-10
        • 1970-01-01
        • 2015-09-01
        • 1970-01-01
        • 2018-07-04
        • 1970-01-01
        • 2021-08-11
        • 1970-01-01
        相关资源
        最近更新 更多