c++ - 如何在黑色区域opencv(C++)中找到矩形

标签 c++ opencv

我是 OpenCV 新手。我正在使用 opencv 查找位置并在图像中附加图章。图章不能与图像中的其他对象重叠。

示例二值图像,白色区域是图像上的对象,黑色区域不是对象 Example image

结果:在黑色区域(白色圆圈)中找到矩形可以附加邮票 Result imagge

请帮我在黑色区域找到相同蓝色矩形的矩形。 谢谢!

最佳答案

如果您知道矩形计数,那么它可以使用 kmeans 作为聚类点。 首先只得到蓝点和二值化它们:

cv::Mat img = cv::imread("NQdmi.png", cv::IMREAD_COLOR);

std::vector<cv::Mat> chans;
cv::split(img, chans);

cv::Mat diff;
cv::absdiff(chans[2], chans[1], diff);

cv::threshold(diff, diff, 1, 255, cv::THRESH_BINARY);

cv::imshow("diff", diff);

只有蓝点:

Binarization result

聚类点和找到旋转的矩形:

std::vector<cv::Point2f> points;
for (int y = 0; y < diff.rows; ++y)
{
    for (int x = 0; x < diff.cols; ++x)
    {
        if (diff.at<uchar>(y, x))
        {
            points.emplace_back(x, y);
        }
    }
}

cv::Mat pointsKmeans(points.size(), 1, CV_32FC2, &points[0]);
cv::Mat labels;
int clusterCount = 2;
cv::Mat centers;

cv::kmeans(pointsKmeans, clusterCount, labels,
    cv::TermCriteria(cv::TermCriteria::EPS+cv::TermCriteria::COUNT, 100, 1.0),
       3, cv::KMEANS_PP_CENTERS, centers);

std::vector<cv::Point2f> points1;
std::vector<cv::Point2f> points2;

cv::Mat draw = img.clone();
for (size_t i = 0; i < points.size(); ++i)
{
    int clusterIdx = labels.at<int>(i);
    if (clusterIdx > 0)
    {
        cv::circle(draw, points[i], 2, cv::Scalar(255, 0, 0), cv::FILLED, cv::LINE_AA);
        points1.push_back(points[i]);
    }
    else
    {
        cv::circle(draw, points[i], 2, cv::Scalar(0, 0, 255), cv::FILLED, cv::LINE_AA);
        points2.push_back(points[i]);
    }
}

auto DrawRRect = [draw](const std::vector<cv::Point2f>& pp)
{
    cv::RotatedRect rr = cv::minAreaRect(pp);
    cv::Point2f corners[4];
    rr.points(corners);
    cv::line(draw, corners[0], corners[1], cv::Scalar(0, 255, 0), 2);
    cv::line(draw, corners[1], corners[2], cv::Scalar(0, 255, 0), 2);
    cv::line(draw, corners[2], corners[3], cv::Scalar(0, 255, 0), 2);
    cv::line(draw, corners[3], corners[0], cv::Scalar(0, 255, 0), 2);
};
DrawRRect(points1);
DrawRRect(points2);

cv::imshow("draw", draw);

结果:

Result

关于c++ - 如何在黑色区域opencv(C++)中找到矩形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54907636/

相关文章:

c++ - 正确处理 Persistent<ArrayBuffer>

c++ - C++ 中的转换运算符

python - 如何在没有数据或彩色图像的情况下获得清晰的图像。 opencv python

python - Python numpy数组索引可以为-1吗?

c++ - 使用 HSV 范围逐像素过滤红色轮廓

android - 构建 google breakpad android 示例错误

c++ - 将空的初始值设定项列表分配给现有 vector 或映射的效果?

c++ - 将 dnorm 和 pnorm 函数从 R 导入到 Rcpp

python - 如何使用 Opencv 模糊/羽化图像中对象的边缘?

opencv - 从源代码将库安装到 MSYS2