Python 检测图像上附着在其他物体上的小正方形

Python 检测图像上附着在其他物体上的小正方形,python,opencv,image-processing,opencv-contour,opencv-python,Python,Opencv,Image Processing,Opencv Contour,Opencv Python,我想检测图像上红色圆圈的小正方形。但问题是他们在另一条白线上。我想知道如何将这些方块与白线分开并检测它们 我已经使用OpenCV Python编写了代码。到目前为止,我所做的是裁剪图像,以便只能访问图像的圆形部分。然后我裁剪了图像以获得所需的部分,即白线。然后,我使用了腐蚀,这样白线将消失,正方形保留在图像中。然后使用Hough圆检测正方形。这对某些图像确实有效,但无法推广。请帮我找到一个通用的代码。让我知道逻辑和python代码。 还有谁能帮我检测一下图像上的阿鲁科标记。它被拒绝了。

我想检测图像上红色圆圈的小正方形。但问题是他们在另一条白线上。我想知道如何将这些方块与白线分开并检测它们

我已经使用OpenCV Python编写了代码。到目前为止,我所做的是裁剪图像,以便只能访问图像的圆形部分。然后我裁剪了图像以获得所需的部分,即白线。然后,我使用了腐蚀,这样白线将消失,正方形保留在图像中。然后使用Hough圆检测正方形。这对某些图像确实有效,但无法推广。请帮我找到一个通用的代码。让我知道逻辑和python代码。

还有谁能帮我检测一下图像上的阿鲁科标记。它被拒绝了。我不知道为什么。
图片在这个链接中 我手动删除了图像顶部的白色条纹,希望这不是问题

int main()
{
    cv::Mat input =  cv::imread("C:/StackOverflow/Input/SQUARES.png", cv::IMREAD_GRAYSCALE);
    cv::Mat thres = input > 0; // make binary mas
    cv::Mat dst;
    cv::distanceTransform(thres, dst, CV_DIST_L2, 3);

    double min, max;
    cv::Point minPt, maxPt;
    cv::minMaxLoc(dst, &min, &max, 0, 0);

    double distThres = max*0.65; // a real clustering would be better. This assumes that the white circle thickness is a bout 50% of the square size, so 65% should be ok...

    cv::Mat squaresMask = dst >= distThres;

    cv::imwrite("C:/StackOverflow/Input/SQUARES_mask.png", squaresMask);

    std::vector<std::vector<cv::Point> > contours;
    cv::findContours(squaresMask, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE);


    cv::Mat output;
    cv::cvtColor(input, output, cv::COLOR_GRAY2BGR);
    for (int i = 0; i < contours.size(); ++i)
    {
        cv::Point2f center;
        float radius;
        cv::minEnclosingCircle(contours[i], center, radius);

        cv::circle(output, center, 5, cv::Scalar(255, 0, 255), -1);
        //cv::circle(output, center, radius, cv::Scalar(255, 0, 255), 1);
    }

    cv::imwrite("C:/StackOverflow/Input/SQUARES_output.png", output);

    cv::imshow("output", output);
    cv::waitKey(0);
}
intmain()
{
cv::Mat input=cv::imread(“C:/StackOverflow/input/SQUARES.png”,cv::imread\u灰度);
cv::Mat thres=input>0;//生成二进制mas
cv::Mat dst;
距离变换(thres,dst,cv_DIST_L2,3);
双最小值,最大值;
cv::最小点,最大点;
cv::minMaxLoc(dst、min和max、0、0);
double distThres=max*0.65;//一个真正的聚类会更好。这假设白圈的厚度大约是正方形大小的50%,所以65%应该是可以的。。。
cv::Mat squaresMask=dst>=distThres;
cv::imwrite(“C:/StackOverflow/Input/SQUARES_mask.png”,squaresMask);
矢量轮廓;
cv::findContours(正方形、等高线、cv::RETR_外部、cv::CHAIN_近似无);
cv::Mat输出;
cv::cvtColor(输入、输出,cv::COLOR_GRAY2BGR);
对于(int i=0;i
这是输入:

这是距离变换后的平方掩码

这就是结果


您可以尝试在黑白图像上进行距离变换,并在那里找到局部最大值。我是OpenCV新手。你能告诉我一点距离变换吗?就像它实际做的一样。对于所有非黑色像素:计算到最近黑色像素的距离。为什么是Hough?侵蚀之后,您已经检测到了方形。为什么检测不够好?这不是一个可行的解决方案,因为将有一个机器人放置在白线上,这将使检测白圈更加困难。有没有办法把方块和白线分开?谢谢你的解决方案。有没有其他方法可以通过将正方形与白线分开来解决这个问题?因为我知道会有一个机器人放在白色的圆圈上!!对不起,我不明白。你能用这样的机器人展示一个图像吗?你可能只是检测到白圈被打断的地方。参考本网站上的问题。我在那里提供了一个图像。也许你可以尝试用一种不同的方法来检测机器人,而不去寻找方块。这对检测方块有帮助吗?