OpenCV отражение зрачка / удаление бликов

#opencv

#opencv

Вопрос:

введите описание изображения здесь

Я пытаюсь отследить зрачок, используя OpenCV, предполагая, что зрачок всегда черный, однако самая большая проблема, с которой я сталкиваюсь, — это отражение на зрачке, есть ли способ изменить цвет бликов на цвет зрачка, который виден вокруг него?

Пожалуйста, найдите кодовый блок ниже

 from imutils import face_utils
import numpy as np
import argparse
import imutils
import dlib
import cv2
from matplotlib import pyplot as plt
import sys
import os
import time
import math

ap = argparse.ArgumentParser()
ap.add_argument("-p", "--shape-predictor", required=True,
    help="path to facial landmark predictor")
ap.add_argument("-i", "--image", required=True,
    help="path to input image")
args = vars(ap.parse_args())

detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor(args["shape_predictor"])

image = cv2.imread(args["image"])
image = imutils.resize(image, width=1080)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

rects = detector(gray, 1)

for (i, rect) in enumerate(rects):
    shape = predictor(gray, rect)
    shape = face_utils.shape_to_np(shape)
    for (name, (i, j)) in face_utils.FACIAL_LANDMARKS_IDXS.items():
        if(name == "left_eye"):
            listval = shape[i:j].tolist()
            del listval[3]
            del listval[0]
            (x, y, w, h) = cv2.boundingRect(np.array([listval]))
            roi = image[y:y   h, x:x   w]
            roi = imutils.resize(roi, width=250, inter=cv2.INTER_CUBIC)
            grey = cv2.cvtColor(roi, cv2.COLOR_BGR2GRAY)
            imgHSV = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)
            _, img1 = cv2.threshold(grey, 26 , 255, cv2.THRESH_BINARY)
            cv2.imshow("ROI_1", roi)
            img1 = cv2.erode(img1, None, iterations=2) #1
            img1 = cv2.dilate(img1, None, iterations=4) #2
            img1 = cv2.medianBlur(img1, 5) #3
            contours, hierarchy = cv2.findContours(img1, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
            drawing = np.copy(roi)
            cv2.drawContours(drawing, contours, -1, (255, 0, 0), 2)
            for contour in contours:
                contour = cv2.convexHull(contour)
                area = cv2.contourArea(contour)
                circumference = cv2.arcLength(contour,True)
                circularity = circumference ** 2 / (4*math.pi*area)
                print(circularity)
                print(area)
                if area > 200 or circularity > 1.5:
                    continue
                
                bounding_box = cv2.boundingRect(contour)

                extend = area / (bounding_box[2] * bounding_box[3])

                if extend > 0.8:
                    continue

                m = cv2.moments(contour)
                if m['m00'] != 0:
                    center = (int(m['m10'] / m['m00']), int(m['m01'] / m['m00']))
                    cv2.circle(drawing, center, 3, (0, 255, 0), -1)

                try:
                    ellipse = cv2.fitEllipse(contour)
                    cv2.ellipse(drawing, box=ellipse, color=(0, 255, 0))
                except:
                    pass

            cv2.putText(drawing, str(area),(10,20), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (155,255,0))
            cv2.imshow("Drawing", drawing)
            cv2.waitKey(0)

  

Ответ №1:

Блики обычно имеют значения пикселей около 180. Вы можете проверить значения пикселей с помощью 180, там будет скопление пикселей со значениями в диапазоне от 180 до 185 или 190. Измените значение пикселя кластера на значение пикселя рядом с кластерами.