Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

opencv crop a portion of image within contour

Tags:

c++

opencv

enter image description here

I've just started learning OpenCv. i wanted to crop a portion of an image which is a text surrounded by the red circle. can you guys help me to find the solution like what are all the methods i should follow to crop it. I've tried few things and got the red circle cropped and stored it in a mat.

while(1)
    {
        capture>>img0;
        imshow("original", img0);
        imwrite("original.jpg", img0);
        cv::inRange(img0,cv::Scalar(0,0,100),cv::Scalar(76,85,255),img1);
        imshow("threshold.jpg", img1);
        imwrite("threshold.jpg", img1);
        // find the contours
        vector< vector<Point> > contours;
        findContours(img1, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);

        Mat mask = Mat::zeros(img1.rows, img1.cols, CV_8UC1);

        drawContours(mask, contours, -1, Scalar(255), CV_FILLED);

        Mat crop(img0.rows, img0.cols, CV_8UC3);

        crop.setTo(Scalar(255,255,255));

        img0.copyTo(crop, mask);

        normalize(mask.clone(), mask, 0.0, 255.0, CV_MINMAX, CV_8UC3);

        imshow("mask", mask);
        imshow("cropped", crop);

        imwrite("mask.jpg", mask);
        imwrite("cropped.jpg", crop);

        if(waitKey(30)=='27')
        {
            break;
        }
    }
    return 0;`[original image[cropped image][1]`

From this image i wanted to crop a text alone. do help me to find the solution by sharing me the methods or steps to follow.

Thanks in advance

like image 836
paul ruben Avatar asked Apr 01 '16 14:04

paul ruben


1 Answers

If you wish to extract the text alone, you can try this:-

drawContours(mask, contours, -1, Scalar(255), CV_FILLED);
vector<Rect> boundRect( contours.size() );
for(int i=0;i<contours.size();i++)
    {
        boundRect[i] = boundingRect(contours[i]);//enclose in Rect
        Mat ROI,ROI_txt;
        if(boundRect[i].width>30 && boundRect[i].height>30)//ignore noise rects
        {
            ROI=img0(boundRect[i]);//extract Red circle on ROI
            inRange(ROI,Scalar(0,0,0),cv::Scalar(50,50,50),ROI_txt);
            //black colour threshold to extract black text
        }
    }
like image 138
Saransh Kejriwal Avatar answered Nov 15 '22 07:11

Saransh Kejriwal