Image processing 如何使用OpenCV检测纸张上的注册标记?

Image processing 如何使用OpenCV检测纸张上的注册标记?,image-processing,opencv,computer-vision,Image Processing,Opencv,Computer Vision,我一直在试图找到最好的方法来检测纸张上的4个黑色方块,并使用它们将纸张隔离在自己的图像中 您的图像上似乎只有4个黑色方块,因此您需要做的是: 将图像转换为灰色 Do阈值 查找黑色轮廓(在OpenCV中执行此操作之前,必须反转图像,因为默认情况下OpenCV查找白色轮廓) 在这些轮廓中循环并找到边界矩形 进行检查: A) 矩形的面积大于某个常数(在我的解决方案中,它是100) B) 矩形的宽度/高度接近1.0(在我的分析中,它是[0.9,1.1]范围) 守则: Mat img = imread("

我一直在试图找到最好的方法来检测纸张上的4个黑色方块,并使用它们将纸张隔离在自己的图像中


您的图像上似乎只有4个黑色方块,因此您需要做的是:

  • 将图像转换为灰色
  • Do阈值
  • 查找黑色轮廓(在OpenCV中执行此操作之前,必须反转图像,因为默认情况下OpenCV查找白色轮廓)
  • 在这些轮廓中循环并找到边界矩形
  • 进行检查:

    A) 矩形的面积大于某个常数(在我的解决方案中,它是100

    B) 矩形的宽度/高度接近1.0(在我的分析中,它是[0.9,1.1]范围)

  • 守则:

    Mat img = imread("test.jpg"), gray;
    vector<Vec4i> hierarchy;
    vector<vector<Point2i> > contours;
    cvtColor(img, gray, CV_BGR2GRAY);
    threshold(gray, gray, 100, 255, THRESH_BINARY);
    bitwise_not(gray, gray);
    
    findContours(gray, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);
    
    for(size_t i=0; i<contours.size(); i++)
    {
        Rect rect = boundingRect(contours[i]);
        double k = (rect.height+0.0)/rect.width;
        if (0.9<k && k<1.1 && rect.area()>100)
        {
            drawContours(img, contours, i, Scalar(0,0,255));
        }
    }
    
    imshow("result", img);
    waitKey();
    
    Mat img=imread(“test.jpg”),灰色;
    向量层次;
    矢量等值线;
    CVT颜色(img、灰色、CV_bgr2灰色);
    阈值(灰度、灰度、100255、阈值二元);
    按位_not(灰色、灰色);
    findContours(灰色、轮廓、层次、CV_RETR_外部、CV_CHAIN_近似_SIMPLE);
    
    对于(size_t i=0;我将来到StackOverflow。到目前为止,您尝试了哪些对您不起作用的方法?您是否查看了这些方法是否有帮助?请您自己尝试解决这些问题(而不是发布图像),这里的人可能会提供帮助。