我实际上正在使用带有黑白像素的 cv::Mat。我正在寻找一种方法来获取此 Mat 中的黑点列表。
有人知道该怎么做吗?
我想这样做是因为我想检测这些点的边界矩形。(最好的办法是让它们回到向量中)
一些 :
cv::Mat blackAndWhite;
std::vector<cv::Point> blackPixels = MAGIC_FUNCTION(blackAndWhite);
谢谢你的帮助。
编辑:我想准确地说我想要最佳实践,尽可能地兼容 Opencv。
我实际上正在使用带有黑白像素的 cv::Mat。我正在寻找一种方法来获取此 Mat 中的黑点列表。
有人知道该怎么做吗?
我想这样做是因为我想检测这些点的边界矩形。(最好的办法是让它们回到向量中)
一些 :
cv::Mat blackAndWhite;
std::vector<cv::Point> blackPixels = MAGIC_FUNCTION(blackAndWhite);
谢谢你的帮助。
编辑:我想准确地说我想要最佳实践,尽可能地兼容 Opencv。
这个来自 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] );
}
您可以遍历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));
}
}