3v324v23's picture
Add apple
edc8afb
raw
history blame
3.68 kB
import cv2
import numpy as np
# storing settings for semicircle
class SemiCircle:
def __init__(
self, thickness=10, color=(255, 0, 0), radius=100,
center=(250, 250), angle=0, start_angle=180, end_angle=360
):
self.thickness = thickness
self.color = color
self.radius = (radius, radius)
self.center = center
self.angle = angle
self.start_angle = start_angle
self.end_angle = end_angle
class Line:
def __init__(self, thickness=2, color=(0, 0, 0)):
self.thickness = thickness
self.color = color
def generate_points(radius, length, center, num_points):
# center points
cx, cy = center
# generating points on circle
outer_circle_points = [(radius * np.cos(i), radius * np.sin(i)) for i in np.linspace(np.pi, 2*np.pi, num_points)]
inner_radius = radius - length
inner_circle_points = [(inner_radius * np.cos(i), inner_radius * np.sin(i)) for i in np.linspace(np.pi, 2*np.pi, num_points)]
# genrating point for drawing line using cv2, start_points and end_points
start_points = [(int(cx + i), int(cy + j)) for i, j in outer_circle_points]
end_points = [(int(cx + i), int(cy + j)) for i, j in inner_circle_points]
return zip(start_points, end_points)
class Meter:
def __init__(self, center, radius, circle_color):
self.center = center
self.radius = radius
self.circle_color = circle_color
def draw_meter(self, image, idx):
# drawing semicircle
circle = SemiCircle(center=self.center, radius=self.radius, color=self.circle_color)
cv2.ellipse(
image, circle.center, circle.radius,
circle.angle, circle.start_angle, circle.end_angle,
circle.color, circle.thickness
)
# drawing smaller fine lines
line = Line(thickness=circle.thickness//3)
for start, end in generate_points(self.radius - 10, self.radius * 0.05, self.center, 50):
cv2.line(image, start, end, line.color, line.thickness)
# drawing bigger lines
line2 = Line(thickness=circle.thickness//2, color=(238, 222, 23))
for start, end in generate_points(self.radius - 10, self.radius * 0.15, self.center, 10):
cv2.line(image, start, end, line2.color, line2.thickness)
# drawing needle anchor point
cv2.circle(image, circle.center, 15, (0, 0, 0), -1)
# emotion classes
emotions = ['neutral', 'happy', 'surprise', 'sad', 'angry',
"disgust", 'fear', 'contempt', 'unknown', 'NotFace']
# points where text will be written
pts = generate_points(self.radius*1.55, self.radius * 0.15, self.center, 10)
pts = list(pts)
for i, emot in enumerate(emotions):
x, y = pts[i][0]
x -= 20
color = (98, 65, 255) if (i == idx) else (144,238,144)
cv2.putText(
image, emot, (x, y),
cv2.FONT_HERSHEY_SIMPLEX, 1, color, 2,
cv2.LINE_AA
)
# needle 12, 178, 33
line3 = Line(thickness=circle.thickness//2, color=(0, 0, 255))
pts2 = generate_points(self.radius*0.7, self.radius*0.7, self.center, 10)
pts2 = list(pts2)
start, end = pts2[idx]
cv2.line(image, start, end, line3.color, line3.thickness)
if __name__ == '__main__':
image = np.ones((500, 500, 3))
meter = Meter((250, 250), 150, (80, 127, 255))
meter.draw_meter(image, 4)
cv2.imshow('image', image)
if cv2.waitKey(0) & 0xFF == 27:
pass
cv2.destroyAllWindows()