我在线搜索了一下并在stackoverflow上使用搜索,但是在这个问题上找不到我想要的东西。所以基本上我使用简单的blob检测,从opencv,到我的图像中的白色区域(已经是二进制)和非常相似的图像我得到非常不同的结果,在哪些斑点被检测到,哪些不是,这里是一个例子,在定义simpleblobdetector时是我的参数。
正如您所看到的,某些斑点未被检测到,这是我的探测器配置:
void blobDetect(cv::Mat img) {
cv::SimpleBlobDetector::Params params;
if (Daytime) {
params.minThreshold = 23;
params.maxThreshold = 25;
}
else {
params.minThreshold = 3;
params.maxThreshold = 5;
}
params.thresholdStep = 1;
params.filterByColor = true;
params.blobColor = 255;
params.filterByArea = true;
params.minArea = 300;
params.maxArea = 400000;
params.filterByCircularity = false;
//params.minCircularity = "";
params.filterByConvexity = false;
//params.minConvexity = "";
params.filterByInertia = false;
//params.minInertiaRatio = "";
cv::Ptr<cv::SimpleBlobDetector> detector = cv::SimpleBlobDetector::create(params);
std::vector<cv::KeyPoint> keypoints;
detector->detect(img, keypoints);
cv::Mat im_with_keypoints;
std::cout << keypoints.size() << std::endl;
drawKeypoints(img, keypoints, im_with_keypoints, cv::Scalar(0, 0, 255), cv::DrawMatchesFlags::DRAW_RICH_KEYPOINTS);
imshow("display4", im_with_keypoints);
}
所以我问,是不是因为斑点的形状和大小?(我怀疑这个选项,因为在某些情况下它可以找到大范围的奇怪形状)我认为简单的斑点检测可以找到任何像素组,是它更适合圆形斑点或类似的东西?我应该考虑使用其他算法还是构建自己的算法?还是有办法解决这个问题并提高简单blob检测的准确性?
我知道这些问题很多,但请提前感谢您提供任何帮助!
答案 0 :(得分:1)
就像Alexander Reynolds sugested“Blob探测器是相当古老的OpenCV,为什么不找到轮廓并按区域排序?”
我用this link来获得一个起点。
在获得图像的轮廓后,我使用此: “if(cv :: contourArea(contours [i])&gt; 500)”对小区域进行阈值处理并且工作正常,加上它比blobdetection快得多。
再一次,亚历山大,非常感谢你指出我正确的方向:)
ps:作为sugested,这是完整的解决方案。
void findContours(cv::Mat img) {
// find contours:
std::vector<std::vector<cv::Point> > contours;
std::vector<cv::Vec4i> hierarchy;
findContours(img, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE);
// draw contours:
cv::Mat imgWithContours = cv::Mat::zeros(img.rows, img.cols, CV_8UC3);
cv::RNG rng(12345);
for (int i = 0; i < contours.size(); i++)
{
if (cv::contourArea(contours[i]) > 500) {
cv::Scalar color = cv::Scalar(rng.uniform(50, 255), rng.uniform(50, 255), rng.uniform(50, 255));
drawContours(imgWithContours, contours, i, color, 1, 8, hierarchy, 0);
}
}
imshow("display4", imgWithContours);
}