gpt4 book ai didi

c++ - opencv 简单的 Blob 检测,得到一些未检测到的 Blob

转载 作者:行者123 更新时间:2023-11-28 05:06:26 25 4
gpt4 key购买 nike

我在网上进行了一些搜索,并在 stackoverflow 上使用了这里的搜索功能,但在这个问题上还没有找到我想要的东西。所以基本上我使用来自 opencv 的简单 Blob 检测来获取我的图像中的白色区域(这已经是二进制的)并且在非常相似的图像中我在检测到哪些 Blob 和没有检测到 Blob 方面得到非常不同的结果,在这里是定义 simpleblobdetector 时我的参数后跟的示例。

image1 image2

如您所见,未检测到一些 Blob ,这是我的检测器配置:

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 的形状和大小?(我怀疑这个选项,因为在某些情况下它可以找到大面积的奇怪形状)我认为简单的 Blob 检测可以找到任何一组像素,是它更适合圆形 Blob 或类似的东西?我应该考虑使用其他算法还是构建自己的算法?还是有办法解决这个问题并提高简单 Blob 检测的准确性?

我知道有很多问题,但在此先感谢您提供的任何帮助!

最佳答案

就像Alexander Reynolds sugested “ Blob 检测器是相当古老的 OpenCV,为什么不找到轮廓并按区域排序?”

我用了this link获得起点。

在得到图像的轮廓后,我使用这个:“if (cv::contourArea(contours[i]) > 500)”对小区域进行阈值处理,效果很好,而且比 Blob 检测快得多。

再一次,Alexander,非常感谢你为我指明了正确的方向:)

ps: 如上所示,这里是完整的解决方案。

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

关于c++ - opencv 简单的 Blob 检测,得到一些未检测到的 Blob ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44633740/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com