im working with opencv and when showing the image it has a black background even its already transparent, (sometimes white) but that depends on the image, in this case the eye image when showing it appears with black background, dont know how can i show it complety transparent:
while True: recording, frame = video.read(); rgba = cv2.cvtColor(frame, cv2.COLOR_BGR2BGRA); eye.drawEyes(rgba, frame_width, frame_height); cv2.imshow("Mediapipe", rgba); if cv2.waitKey(1) & 0xFF == ord('q'): breakvideo.release();cv2.destroyAllWindows();
and here the class Eye where i call the method to draw the eyes:
class Eye: MP_FACE = mp.solutions.face_mesh; FACE = MP_FACE.FaceMesh(); LEFT_EYE = [226, 173]; #468 CENTER LANDMARK RIGHT_EYE = [398, 446]; EYE_IMAGE = cv2.imread("./assets/eye.png", cv2.IMREAD_UNCHANGED); RESIZE_EYE = cv2.resize(EYE_IMAGE, (80, 80), interpolation = cv2.INTER_AREA) # `int(height)` for 2nd value of size def __init__(self): self: self self.eye_left_x = 0; self.eye_left_y = 0; self.eye_left_x2 = 0; self.eye_left_y2 = 0; self.eye_right_x = 0; self.eye_right_y = 0 self.eye_right_x2 = 0; self.eye_right_y2 = 0; self.centerX = 0; self.centerY = 0; self.image = ""; def drawEyes(self, frame, frame_width, frame_height): face_points = self.FACE.process(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)); rectangle_height = 30; if (face_points): for landmark in face_points.multi_face_landmarks: for index, points in enumerate(landmark.landmark): if (index == self.LEFT_EYE[0]): x, y = int(points.x * frame_width), int(points.y * frame_height); self.eye_left_x = x; self.eye_left_y = y; if (index == self.LEFT_EYE[1]): x, y = int(points.x * frame_width), int(points.y * frame_height); self.eye_left_x2 = x; self.eye_left_y2 = y; if (index == self.RIGHT_EYE[0]): x, y = int(points.x * frame_width), int(points.y * frame_height); self.eye_right_x = x; self.eye_right_y = y; if (index == self.RIGHT_EYE[1]): x, y = int(points.x * frame_width), int(points.y * frame_height); self.eye_right_x2 = x; self.eye_right_y2 = y; cv2.rectangle( frame, (self.eye_left_x, self.eye_left_y - rectangle_height), (self.eye_left_x2, self.eye_left_y2 + rectangle_height), (0,255,255), 1 ); cv2.rectangle( frame, (self.eye_right_x, self.eye_right_y - rectangle_height), (self.eye_right_x2, self.eye_right_y2 + rectangle_height), (0,255,255), 1 ); rectangle_width_left = self.eye_left_x2 - self.eye_left_x; rectangle_width_right = self.eye_right_x2 - self.eye_right_x; eye_width = hypot(self.eye_left_x - self.eye_left_x2, self.eye_left_y - self.eye_left_y2); eye_height = eye_width * 1; #1 = aspect ratio, height image / width image image = cv2.resize(self.EYE_IMAGE, (int(eye_width), int(eye_height)), interpolation = cv2.INTER_AREA); h, w = image.shape[:2]; # left eye x, y = self.eye_left_x, self.eye_left_y; centerX = (rectangle_width_left - int(w)) // 2; frame[y-rectangle_height : y + int(w) - rectangle_height, x+centerX : x + centerX+int(w), :] = image # right eye x2, y2 = self.eye_right_x, self.eye_right_y; centerX = (rectangle_width_right - int(w)) // 2; frame[y2-rectangle_height : y2 + int(w) - rectangle_height, x2+centerX : x2 + centerX+int(w)] = image
this is my code now, i print the frame and it has 4 channel, same with the image, but still dont know how to show it complety transparent, dont understand and dont know how to work with the mask that looks is the case to use here.
some help will be appreciate