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

Posted

技术标签:

【中文标题】获取 cv::Mat 的黑色像素列表【英文标题】:Get List of Black Pixel of a cv::Mat 【发布时间】:2013-06-26 12:10:14 【问题描述】:

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

有人知道怎么做吗?

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

某种:

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

感谢您的帮助。

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

【问题讨论】:

【参考方案1】:

你可以遍历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));
  

【讨论】:

我想过,但我正在寻找你知道的最好的工具。更符合 Opencv 的东西。 我首先想到的是 cv::compare 函数,但它返回另一个 cv::Mat,所以问题仍然存在。【参考方案2】:

这个来自 OpenCV 的例子展示了如何做你想做的事:Creating Bounding boxes and circles for contours。基本上,它是这样的:

  // ... 
  /// 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] );
  

【讨论】:

以上是关于获取 cv::Mat 的黑色像素列表的主要内容,如果未能解决你的问题,请参考以下文章

如何将像素数据的所有权传递给 cv::Mat

opencv::Mat,从原始数据中获取像素值?

【OPENCV】cv::Mat像素遍历方法比较

根据另一个 Mat 的非零像素选择 cv::Mat 的一部分?

如何在openCV中修改cv::Mat的像素数据?

处理 cv::MAT 的像素不起作用