获取 cv::Mat 的黑色像素列表

问题描述 投票:0回答:3

我实际上正在使用带有黑白像素的 cv::Mat。 我正在寻找一种方法来获取此垫子中我的黑点列表。

有人知道怎么做这样的事情吗?

我想这样做是因为我想检测这些点的边界矩形。 (最好的方法是让它们回到向量中)

某种:

cv::Mat blackAndWhite;
std::vector<cv::Point> blackPixels = MAGIC_FUNCTION(blackAndWhite);

感谢您的帮助。

编辑:我想准确地说,我想要最佳实践,尽可能符合 Opencv 标准。

c++ opencv image-processing
3个回答
2
投票

可以遍历

cv::Mat
来检查为0的像素,如果矩阵在内存中是连续的,则可以从线性索引中获取x和y坐标:

// assuming your matrix is CV_8U, and black is 0
std::vector<cv::Point> blackPixels;
unsigned int const *p = blackAndWhite.ptr<unsigned char>();
for(int i = 0; i < blackAndWhite.rows * blackAndWhite.cols; ++i, ++p)
{
  if(*p == 0)
  {
    int x = i % blackAndWhite.cols;
    int y = i / blackAndWhite.cols;
    blackPixels.push_back(cv::Point(x, y));
  }
}

2
投票

来自 OpenCV 的这个示例展示了如何完全按照您的要求进行操作:创建轮廓的边界框和圆圈。基本上是这样的:

  // ... 
  /// Find contours
  findContours( threshold_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0) );

  /// Approximate contours to polygons + get bounding rects and circles
  vector<vector<Point> > contours_poly( contours.size() );
  vector<Rect> boundRect( contours.size() );
  vector<Point2f>center( contours.size() );
  vector<float>radius( contours.size() );

  for( int i = 0; i < contours.size(); i++ )
  {  
     approxPolyDP( Mat(contours[i]), contours_poly[i], 3, true );
     boundRect[i] = boundingRect( Mat(contours_poly[i]) );
     minEnclosingCircle( (Mat)contours_poly[i], center[i], radius[i] );
  }

0
投票

您可以尝试以下方法:

std::vector<cv::Point> blackPixels;
cv::findNonZero(~blackAndWhite, blackPixels);

findNonZero() 返回非零像素,这意味着任何非黑色或 0 的像素。由于

blackAndWhite
图像仅包含黑色和白色像素,因此它们要么是 0 要么是 255。如果我们对矩阵应用布尔非运算,图像将会反转。这会将黑色像素转换为白色像素,我们可以使用
findNonZero()
方法获取它们的列表。

© www.soinside.com 2019 - 2024. All rights reserved.