繁体   English   中英

opencv戴着面具检测blob

[英]opencv detecting blob with a mask

我想在该类中使用opencv SimpleBlobDetector检测斑点

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

效果很好,直到我要引入一个遮罩,以便检测器仅在遮罩内查找斑点。

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

抱歉,这不是更好的消息。 使用我的已安装版本的opencv(2016年9月构建的3.1.0开发版本-我真的不想重新安装该东西!),我也遇到了这个问题。 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中使用了输入图像,但“无趣”区域却被涂黑(归零)。 从技术上讲,它所使用的内存不会比声明您的掩码多(多),并且也不会干扰您的输入图像。

唯一值得检查的另一件事是您的矩形rect确实指定了不是完整帧的内容-我显然用自己的值替换了该值以进行测试。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM