Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
570 views
in Technique[技术] by (71.8m points)

opencv - Extract the green boxes from the picture and store into the folder

the code to extract the green boxes from the picture "Python-Interview.jpg" and copy them to a folder. I have tried not working please provide some solution with this code

            # Import relevant libraries
   ''' image = cv.imread(fpath, -1)
    # convert to gray and binarize
    gray_img = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    binary_img = cv.adaptiveThreshold(gray_img, 255, cv.ADAPTIVE_THRESH_MEAN_C, cv.THRESH_BINARY, 9, 9)
     # note: erosion and dilation works on white forground
    binary_img = cv.bitwise_not(binary_img)
     # dilate the image
    kernel = cv.getStructuringElement(cv.MORPH_RECT, (1,1))
    dilated_img = cv.morphologyEx(binary_img, cv.MORPH_DILATE, kernel,iterations=1)

    # find contours, discard contours which do not belong to a rectangle
    (cnts, _) = cv.findContours(dilated_img.copy(), cv.RETR_LIST, cv.CHAIN_APPROX_SIMPLE)
    sq_cnts = []  # contours of interest to us
    for cnt in cnts:
        approx = cv.approxPolyDP(cnt,0.01*cv.arcLength(cnt,True),True)
        if len(approx) == 4:
            (x, y, w, h) = cv.boundingRect(cnt)
    #///////// fill remaining code here

    for i in range(len(sq_cnts)):
        # find squares
        (x, y, w, h) = cv.boundingRect(sq_cnts[i])
        newimg = image[y:y+h,x:x+w] # crop the image   
        # Write the image  
    '''     

The image is

enter image description here

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

You can achieve it simply by using minAreaRect. Which I also used the same method in this answer of me. I coded in C++ because my environment based on C++. Converting to Python is not a big issue. Here is my code and results:

#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string>

using namespace cv;
using namespace std;

int main()
{

    Mat src; Mat src_gray;
    RNG rng(12345);
    int counter = 0;
    /// Load source image and convert it to gray
    src = imread( "/ur/image/directory/Python-Interview.jpg", 1 );
    Mat original = src.clone();
    /// Convert image to gray and blur it
    cvtColor( src, src_gray, CV_BGR2GRAY );

    imshow("dd",src_gray);

    Mat threshold_output;
    vector<vector<Point> > contours;
    vector<Vec4i> hierarchy;

    /// Detect edges using Threshold
    threshold( src_gray, threshold_output, 138, 100, THRESH_BINARY );
    /// Find contours
    findContours( threshold_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0) );

    /// Find the rotated rectangles for each contour
    vector<RotatedRect> minRect( contours.size() );

    for( int i = 0; i < contours.size(); i++ )
        minRect[i] = minAreaRect( Mat(contours[i]) );

    /// Draw contours + rotated rects
    Mat drawing = Mat::zeros( threshold_output.size(), CV_8UC3 );
    Mat result_zero = Mat::zeros( threshold_output.size(), CV_8UC3 );

    for( int i = 0; i< contours.size(); i++ )
    {
        Scalar color = Scalar( rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255) );
        // detect contours
        drawContours( drawing, contours, i, color, 1, 8, vector<Vec4i>(), 0, Point() );
        // detect rectangle for each contour
        Point2f rect_points[4]; minRect[i].points( rect_points );

        double length_1 = cv::norm(cv::Mat(rect_points[0]),cv::Mat(rect_points[1]));
        double length_2 = cv::norm(cv::Mat(rect_points[1]),cv::Mat(rect_points[2]));

        int temp1 = (int)length_1;
        int temp2 = (int)length_2;

        //25 and 35 are the pixel lengths of those small rectangles. By using this if scope I am filtering them
        if(temp1>25 && temp1<35 && temp2>25 && temp2<35 )
        {

            int min_x = rect_points[0].x;
            int min_y = rect_points[0].y;
            for( int j = 0; j < 4; j++ )
            {

                if(rect_points[j].x<min_x)
                    min_x = rect_points[j].x;

                if(rect_points[j].y<min_y)
                    min_y = rect_points[j].y;

                line( result_zero, rect_points[j], rect_points[(j+1)%4], color, 1, 8 );

            }

            Rect my_roi(min_x,min_y,temp1,temp2);
            Mat copy = original(my_roi);
            imwrite("/ur/target/copy/image/directory/image" + to_string(counter) + ".jpg",copy);
            counter++;
        }
    }

    imshow( "Result", result_zero );

    waitKey(0);
    return(0);
}

Result:

enter image description here

At the end, your directory will seem like this:

enter image description here


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...