opencv用掩码检测blob

时间:2018-03-02 15:50:27

标签: c++ opencv object-detection feature-detection

我想在该类

中使用opencv SimpleBlobDetector检测blob
cv::Ptr<cv::SimpleBlobDetector> detector = cv::SimpleBlobDetector::create(parameters);   
detector->detect( inputImage, keypoints);

这很好用,直到我想引入一个掩码,以便探测器只在掩码中查找blob。

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

来自文档link,它说:

  

指定查找关键点的位置的掩码(可选)。它必须是一个   8位整数矩阵,在感兴趣的区域内具有非零值。

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

 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);

1 个答案:

答案 0 :(得分:2)

对不起,这不是更好的消息。 使用我安装的opencv版本(一个3.1.0 dev版本,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中输入你的输入图像,但是&#34;不感兴趣&#34;区域变黑(归零)。从技术上讲,它不会使用任何(多)内存,而不是声明你的面具,它也不会干扰你的输入图像。

另一件值得检查的事情是,你的矩形rect确实指明了不是完整框架的东西 - 我显然用我自己的值代替了测试。