How to crop circles (found with Hough Transform) in OpenCV?

前端 未结 4 1678
轻奢々
轻奢々 2021-01-25 13:04

I\'m using the code from the page. It works very well and I get a circle that I am looking for. All my image have only 1 circle and I have modified parameters of HoughCirc

相关标签:
4条回答
  • 2021-01-25 13:36

    You should use copyTo with a mask to retrieve the part of image inside the circle, and then you can crop according to the bounding box of the circle.

    You save images with imwrite.

    This small example should get you started.

    #include "opencv2/opencv.hpp"
    using namespace cv;
    
    int main()
    {
        // Your initial image
        Mat3b img = imread("path_to_image");
    
        // Your Hough circle
        Vec3f circ(100,50,30); // Some dummy values for now
    
        // Draw the mask: white circle on black background
        Mat1b mask(img.size(), uchar(0));
        circle(mask, Point(circ[0], circ[1]), circ[2], Scalar(255), CV_FILLED);
    
        // Compute the bounding box
        Rect bbox(circ[0] - circ[2], circ[1] - circ[2], 2 * circ[2], 2 * circ[2]);
    
        // Create a black image
        Mat3b res(img.size(), Vec3b(0,0,0));
    
        // Copy only the image under the white circle to black image
        img.copyTo(res, mask);
    
        // Crop according to the roi
        res = res(bbox);
    
        // Save the image
        imwrite("filename.png", res);
    
        // Show your result
        imshow("Result", res);
        waitKey();
    
        return 0;
    }
    
    0 讨论(0)
  • 2021-01-25 13:37
    HoughCircles(src, circles, CV_HOUGH_GRADIENT, 1, parameter_1, parameter_2, parameter_3, parameter_4, parameter_5);
    
    for (size_t i = 0; i < circles.size(); i++)
    {
        Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));
        int radius = cvRound(circles[i][2]);
        circleroi = src(Rect(center.x - radius, coordinate
                        center.y - radius, 
                        radius *2,         
                        radius * 2));       
    }
    
    0 讨论(0)
  • 2021-01-25 13:41

    You can define a Region of Interest (ROI) on your image based on the coordinates of the circle, then imwrite will only save the cropped portion:

    cv::Rect roi(x, y, w, h); // I let you do the math ;)
    cv::Mat cropped = original(roi);
    cv::imwrite("cropped.png", cropped);
    
    0 讨论(0)
  • 2021-01-25 13:41

    To crop circle after circles=HoughCircles(...)

    if len(circles) == 1:
        x, y, r = circles[0][0]
        print x, y, r
        mask = np.zeros((w0,h0),dtype=np.uint8)
        cv2.circle(mask,(x,y),r,(255,255,255),-1,8,0)
        #cv2.imwrite(argv[2],mask)
        out = img*mask
        white = 255-mask
        cv2.imwrite(argv[2],out+white)
    
    0 讨论(0)
提交回复
热议问题