首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >opencv用面罩检测斑点

opencv用面罩检测斑点
EN

Stack Overflow用户
提问于 2018-03-02 15:50:26
回答 1查看 1.7K关注 0票数 1

我想在这个类中使用opencv SimpleBlobDetector检测气泡。

代码语言:javascript
复制
cv::Ptr<cv::SimpleBlobDetector> detector = cv::SimpleBlobDetector::create(parameters);   
detector->detect( inputImage, keypoints);

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

代码语言:javascript
复制
detector->detect( inputImage, keypoints, zmat );

在文档中,链接说:

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

我的理解是,检测算法只会搜索掩码矩阵中的非零元素。因此,我创建了一个掩码并以如下方式填充:

代码语言:javascript
复制
 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,但是检测器仍然在到处检测:

代码语言:javascript
复制
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);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-05 17:35:01

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

代码语言:javascript
复制
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确实指定了一些不是完整的框架--显然,我在自己的值中代替了它来进行测试。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49072636

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档