如何合并blob /轮廓

rou*_*uge 5 c++ opencv image-processing

findContours用于斑点检测.现在我将密切和类似的blob合并在一起.

以下是一些示例图片:

在此输入图像描述 在此输入图像描述 在此输入图像描述

普通的Opencv有可能吗?

kar*_*lip 3

您提供给我们的输入图像非常容易使用:

在此输入图像描述 在此输入图像描述 在此输入图像描述

第一步是将黄色斑点与其他物体分离,简单的颜色分割技术可以完成此任务。您可以查看OpenCV 中的按颜色分割和对象检测或跟踪彩色对象,以了解如何操作。

在此输入图像描述 在此输入图像描述 在此输入图像描述

然后,是时候合并 blob 了。一种特别有用的技术是边界框,将所有斑点放在一个矩形内。请注意,在下图中,斑点周围有一个绿色矩形:

在此输入图像描述 在此输入图像描述 在此输入图像描述

之后,您所需要做的就是用您选择的颜色填充矩形,从而连接所有斑点。我把这最后一个作为作业留给你。

这是我能想到的最快、最简单的方法。以下代码演示了如何实现我刚才描述的内容:

#include <cv.h>
#include <highgui.h>

#include <iostream>
#include <vector>

int main(int argc, char* argv[])
{
    cv::Mat img = cv::imread(argv[1]);
    if (!img.data)
    {
        std::cout "!!! Failed to open file: " << argv[1] << std::endl;
        return 0;
    }

    // Convert RGB Mat into HSV color space
    cv::Mat hsv;
    cv::cvtColor(img, hsv, CV_BGR2HSV);

    // Split HSV Mat into HSV components
    std::vector<cv::Mat> v;
    cv::split(hsv,v);

    // Erase pixels with low saturation
    int min_sat = 70;
    cv::threshold(v[1], v[1], min_sat, 255, cv::THRESH_BINARY);

    /* Work with the saturated image from now on */

// Erode could provide some enhancement, but I'm not sure.
//  cv::Mat element = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(3, 3));
//  cv::erode(v[1], v[1], element);

    // Store the set of points in the image before assembling the bounding box
    std::vector<cv::Point> points;
    cv::Mat_<uchar>::iterator it = v[1].begin<uchar>();
    cv::Mat_<uchar>::iterator end = v[1].end<uchar>();
    for (; it != end; ++it)
    {
        if (*it) points.push_back(it.pos());
    }

    // Compute minimal bounding box
    cv::RotatedRect box = cv::minAreaRect(cv::Mat(points));

    // Display bounding box on the original image
    cv::Point2f vertices[4];
    box.points(vertices);
    for (int i = 0; i < 4; ++i)
    {
            cv::line(img, vertices[i], vertices[(i + 1) % 4], cv::Scalar(0, 255, 0), 1, CV_AA);
    }

    cv::imshow("box", img);
    //cv::imwrite(argv[2], img);

    cvWaitKey(0);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)