How to check if four points form a rectangle

后端 未结 4 1817
隐瞒了意图╮
隐瞒了意图╮ 2021-02-14 15:52

I am working on a shape recognition app. At this moment a set of points (x,y) is determined by corner detector (red points, img. 2.). Four of these points (in red frames, img. 2

4条回答
  •  眼角桃花
    2021-02-14 16:28

    This is not an answer to your question - it's just suggestion.

    In my opinion corner detector is a bad way to detect rectangles - it will take much time to calculate all point distances as mathematician1975 suggested. You have to use another technique in this situation:

    1. That stamp is violet color, so first thing you should do is color segmentation.
    2. After you've done with step 1 you can use Houhg transform to detect lines on binary image. Or find all contours in image.
    3. And the final step is to detect rectangle.

    Update:

    Here's another solution that should also work in gray images.

    1. Do a threshold to convert image to 1bit (I used 200 from 255 as threshold).
    2. Find all contours in new image which have area bigger than some constant (I took 1000).
    3. Find bounding rectangle for each contour and do a check:

    ContourArea / BoundingReactangleArea > constant

    I take this constant as 0.9.

    And this algorithm gave me next result: enter image description here

    Here's OpenCV code:

    Mat src = imread("input.jpg"), gray, result;
    vector > contours;
    vector hierarchy;
    
    result = Mat(src.size(), CV_8UC1);
    
    cvtColor(src, src, CV_BGR2GRAY);
    threshold(src, gray, 200, 255, THRESH_BINARY_INV);
    findContours(gray, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));
    
    result = Scalar::all(0);
    for (size_t i=0; i 1000)
        {
            double area = contourArea(contours[i]);
            if (area/rect.area() > 0.9)
            {
                drawContours(result, contours, i, Scalar(255), -1);
            }
        }
    }
    

提交回复
热议问题