Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在黑色区域opencv(C+;+;)中查找矩形_C++_Opencv - Fatal编程技术网

C++ 如何在黑色区域opencv(C+;+;)中查找矩形

C++ 如何在黑色区域opencv(C+;+;)中查找矩形,c++,opencv,C++,Opencv,我是OpenCV的新手。我正在使用opencv查找位置,并在图像中附加戳记。戳记不能与图像中的其他对象重叠 示例:带白色区域的二值图像是图像上的对象,黑色区域是无对象 结果:在黑色区域(在白色圆圈中)中查找rect可以附加戳记 请帮我找到黑色区域的矩形和蓝色矩形一样。 谢谢大家! 如果您知道矩形计数,那么它可以使用kmeans作为聚类点。 首先,仅获取蓝点并进行二值化,它们: cv::Mat img = cv::imread("NQdmi.png", cv::IMREAD_COLOR);

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

示例:带白色区域的二值图像是图像上的对象,黑色区域是无对象

结果:在黑色区域(在白色圆圈中)中查找rect可以附加戳记

请帮我找到黑色区域的矩形和蓝色矩形一样。
谢谢大家!

如果您知道矩形计数,那么它可以使用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);
cv::Mat img=cv::imread(“NQdmi.png”,cv::imread\u COLOR);
性病:媒介通道;
cv::拆分(img、chans);
cv::Mat diff;
cv::absdiff(chans[2],chans[1],diff);
cv::threshold(diff,diff,1255,cv::THRESH_二进制);
cv::imshow(“diff”,diff);
只有蓝点:

聚集点并查找旋转的矩形:

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);
std::向量点;
对于(int y=0;y0)
{
圆(画图,点[i],2,cv::标量(255,0,0),cv::填充,cv::直线_AA);
点1.向后推(点[i]);
}
其他的
{
圆(画图,点[i],2,cv::标量(0,0,255),cv::填充,cv::直线_AA);
点2.向后推(点[i]);
}
}
自动绘图更正=[draw](常量标准::向量和pp)
{
cv::RotatedRect rr=cv::MinareRect(pp);
cv::Point2f角点[4];
rr.点(角);
cv::line(绘制,角点[0],角点[1],cv::Scalar(0,255,0),2);
cv::line(绘制,角点[1],角点[2],cv::Scalar(0,255,0),2);
cv::line(绘制,角点[2],角点[3],cv::Scalar(0,255,0),2);
cv::line(绘制,角点[3],角点[0],cv::Scalar(0,255,0),2);
};
绘图更正(点1);
图纸更正(点2);
cv::imshow(“绘制”,绘制);
结果:


你好,努兹尼!谢谢你的回答。但我的意思是,二值图像只有黑色区域和白色区域(不是蓝色矩形)。我们必须找到黑色区域上的最大矩形。图像有蓝色矩形是在黑色区域中找到矩形后的一个示例。