How can I draw half circle in OpenCV?
11,219
Solution 1
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:
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:
Solution 2
here is a C++ sample implementation for you:
int main()
{
cv::Mat outImage = cv::Mat(256,256,CV_8UC3, cv::Scalar(255,255,255));
cv::Point center(128,128);
int radius = 100;
//draw upright black halfcircle
cv::Scalar colorBlack = cv::Scalar(0,0,0);
double startAngleUpright = 180;
cv::ellipse(outImage,center,cv::Size(radius,radius),0,startAngleUpright,startAngleUpright+180,colorBlack,8,0);
//draw downright red halfcircle
cv::Scalar colorRed = cv::Scalar(0,0,255);
double startAngleDownright = 0;
cv::ellipse(outImage,center,cv::Size(radius,radius),0,startAngleDownright,startAngleDownright+180,colorRed,8,0);
cv::imshow("outImage", outImage);
cv::imwrite("DrawHalfCircle.png", outImage);
cv::waitKey(-1);
}
with this result:
Solution 3
There is an ellipse
function (link) where you can specify a start angle and an end angle.
Related videos on Youtube
Author by
Yuda Prawira
Just an ordinary man, doing an extraordinary things contact me for some fun, deal, and some serious :) My website : Yuda Prawira
Updated on June 04, 2022Comments
-
Yuda Prawira about 2 years
How can I draw half circle in OpenCV like below?
If not, how can I do this especially in Python?
-
sshashank124 about 10 yearsPlease elaborate on your question so that the community can diagnose it better. Thank you.
-
-
Yuda Prawira about 10 yearsI think i just could create ellipse shape with it. not circle shape. True?
-
BConic about 10 yearsWell, a circle is an ellipse, so you just have to give the right parameters to obtain a circle (i.e. axes of same length).
-
Yuda Prawira about 10 yearsCould you give an example parameters?
-
BConic about 10 yearsI'm not familiar with Python, but if you want a circle of radius R, the
axes
parameter should be something like(R, R)
i.e. twice the radius value. -
Yuda Prawira about 10 yearsCan you implement it example in others? I could try to understand it.
-
Bort over 7 yearsThis "answer" does nothing more than link to documentation.