Search code examples
pythonopencvdrawingshapes

How can I draw half circle in OpenCV?


How can I draw half circle in OpenCV like below?

draw half circle like this in OpenCV

If not, how can I do this especially in Python?


Solution

  • Here's two ways how to do a half circle with cv2 using Python. Both examples are complete and runnable example scripts

    First easier example: Creating half circle like you mentioned but with rounded corners

    import cv2
    import numpy as np
    
    # Colors (B, G, R)
    WHITE = (255, 255, 255)
    BLACK = (0, 0, 0)
    
    
    def create_blank(width, height, color=(0, 0, 0)):
        """Create new image(numpy array) filled with certain color in BGR"""
        image = np.zeros((height, width, 3), np.uint8)
        # Fill image with color
        image[:] = color
    
        return image
    
    
    def draw_half_circle_rounded(image):
        height, width = image.shape[0:2]
        # Ellipse parameters
        radius = 100
        center = (width / 2, height - 25)
        axes = (radius, radius)
        angle = 0
        startAngle = 180
        endAngle = 360
        thickness = 10
    
        # http://docs.opencv.org/modules/core/doc/drawing_functions.html#ellipse
        cv2.ellipse(image, center, axes, angle, startAngle, endAngle, BLACK, thickness)
    
    
    # Create new blank 300x150 white image
    width, height = 300, 150
    image = create_blank(width, height, color=WHITE)
    draw_half_circle_rounded(image)
    cv2.imwrite('half_circle_rounded.jpg', image)
    

    Result:

    Half circle with rounded line

    Second example: Creating half circle without rounded corners

    import cv2
    import numpy as np
    
    # Colors (B, G, R)
    WHITE = (255, 255, 255)
    BLACK = (0, 0, 0)
    
    
    def create_blank(width, height, color=(0, 0, 0)):
        """Create new image(numpy array) filled with certain color in BGR"""
        image = np.zeros((height, width, 3), np.uint8)
        # Fill image with color
        image[:] = color
    
        return image
    
    
    def draw_half_circle_no_round(image):
        height, width = image.shape[0:2]
        # Ellipse parameters
        radius = 100
        center = (width / 2, height - 25)
        axes = (radius, radius)
        angle = 0
        startAngle = 180
        endAngle = 360
        # When thickness == -1 -> Fill shape
        thickness = -1
    
        # Draw black half circle
        cv2.ellipse(image, center, axes, angle, startAngle, endAngle, BLACK, thickness)
    
        axes = (radius - 10, radius - 10)
        # Draw a bit smaller white half circle
        cv2.ellipse(image, center, axes, angle, startAngle, endAngle, WHITE, thickness)
    
    
    # Create new blank 300x150 white image
    width, height = 300, 150
    
    image = create_blank(width, height, color=WHITE)
    draw_half_circle_no_round(image)
    cv2.imwrite('half_circle_no_round.jpg', image)
    

    Result:

    Half circle without rounded line