opencv 检测带掩码的 blob

opencv detecting blob with a mask

我想使用 opencv SimpleBlobDetector 检测 blob,因为 class

cv::Ptr<cv::SimpleBlobDetector> detector = cv::SimpleBlobDetector::create(parameters);   
detector->detect( inputImage, keypoints);

这很好用,直到我想引入一个掩码,以便检测器只查找掩码内的斑点。

detector->detect( inputImage, keypoints, zmat );

从文档中,link,它说:

Mask specifying where to look for keypoints (optional). It must be a 8-bit integer matrix with non-zero values in the region of interest.

我的理解是检测算法将只搜索掩码矩阵中的非零元素。所以,我创建了一个掩码并以这种方式填充::

 cv::Mat zmat = cv::Mat::zeros(inputImage.size(), CV_8UC1);
     cv::Scalar color(255,255,255);
     cv::Rect rect(x,y,w,h);
     cv::rectangle(zmat, rect, color, CV_FILLED);

但是,掩码似乎什么也没做,检测算法正在检测所有内容。我正在使用 OpenCV 3.2。 我也尝试了简单的 roi,但检测器仍然检测到所有东西:

cv::Mat roi(zmat, cv::Rect(10,10,600,600));
roi = cv::Scalar(255, 255, 255);
// match keypoints of connected components with blob detection
detector->detect( inputImage, keypoints, zmat);

抱歉,这不是个好消息。 使用我安装的 opencv 版本(3.1.0 开发版本,2016 年 9 月构建——我真的不想重新安装那个东西!),我也有这个问题。 SimpleBlobDetector 只是忽略掩码数据。使用带有 roi 的 Mat 副本有一个快速而肮脏的工作(主要是你的代码,但用 3 个通道声明 zmat):

cv::Mat zmat = cv::Mat::zeros(gImg.size(), CV_8UC3);
cv::Scalar color(255,255,255);
cv::Rect rect(x,y,w,h);
cv::rectangle(zmat, rect, color, CV_FILLED);
inputImage.copyTo(zmat, zmat);
detector->detect(zmat, keypoints);

所以你最终在 zmat 中得到你的输入图像,但 "uninteresting" 区域被涂黑(归零)。从技术上讲,它不会使用比声明掩码多(多)的内存,也不会干扰您的输入图像。

唯一值得检查的另一件事是您的矩形 rect 确实指定了一些不完整的框架 - 我显然用我自己的值代替了测试。