создать маску и удалить внутренний контур в opencv python - PullRequest
0 голосов
/ 27 августа 2018

это результат, который я получил из своего кода: введите описание изображения здесь

Я сделал эту маску на лице, используя контур, как показано ниже в коде.
Окончательный результат проекта - удалить лицо и показать фон , что я еще не определил его .
мой вопрос: есть ли способ сделать маску с этим счетчиком, чтобы я мог использовать что-то вроде cv2.imshow('My Image',cmb(foreground,background,mask)), чтобы просто показать передний план под маской на заднем плане? ( проблема здесь в том, что у меня должна быть маска в виде видео в этой форме, но я хочу, чтобы она была в реальном времени )
или, возможно, другим способом , могу ли я каким-то образом удалить пиксели кадра в (или под) моем счетчике?
это мой код:

from imutils.video import VideoStream
from imutils import face_utils
import datetime
import argparse
import imutils
import time
import dlib
import cv2
import numpy as np

# path to facial landmark predictor
ap = argparse.ArgumentParser()
ap.add_argument("-p", "--shape-predictor", required=True)

print("[INFO] loading facial landmark predictor...")
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor(args["shape_predictor"])

# grab the indexes of the facial landmarks
(lebStart, lebEnd) = face_utils.FACIAL_LANDMARKS_IDXS["left_eyebrow"]
(rebStart, rebEnd) = face_utils.FACIAL_LANDMARKS_IDXS["right_eyebrow"]
(jawStart, jawEnd) = face_utils.FACIAL_LANDMARKS_IDXS["jaw"]

# initialize the video stream and allow the cammera sensor to warmup
print("[INFO] camera sensor warming up...")
vs = VideoStream(usePiCamera=args["picamera"] > 0).start()
time.sleep(2.0)

# loop over the frames from the video stream
while True:
    # grab the frame from the threaded video stream, resize it to
    # have a maximum width of 400 pixels, and convert it to
    # grayscale
    frame = vs.read()
    frame = imutils.resize(frame, width=400)
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # detect faces in the grayscale frame
    rects = detector(gray, 0)

    # loop over the face detections
    for rect in rects:
        shape = predictor(gray, rect)
        shape = face_utils.shape_to_np(shape)

        # extract the face coordinates, then use the
        faceline = shape[jawStart:lebEnd]

        # compute the convex hull for face, then
        # visualize each of the face
        facelineHull = cv2.convexHull(faceline)

        mask = np.zeros(frame.shape,dtype='uint8')
        cv2.drawContours(frame, [facelineHull], -1, (0, 0, 0),thickness=cv2.FILLED)
        cv2.drawContours(frame, [facelineHull], -1, (0, 255, 0))

    # show the frame
    cv2.imshow("Frame", frame)
    # cv2.imshow("Frame", mask)
    key = cv2.waitKey(1) & 0xFF

    # if the `q` key was pressed, break from the loop
    if key == ord("q"):
        break


# do a bit of cleanup
cv2.destroyAllWindows()
vs.stop()

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

вот мое решение для удаления лица из кадра (это быстрее, но снова благодаря @meetaig за помощь)

mask = np.zeros(frame.shape,dtype='uint8')
mask = cv2.drawContours(mask, [facelineHull], -1, (255 , 255 , 255),thickness=cv2.FILLED)
mask = cv2.bitwise_not(mask)
img2gray = cv2.cvtColor(mask,cv2.COLOR_BGR2GRAY)
ret, mask = cv2.threshold(img2gray, 10, 255, cv2.THRESH_BINARY)
result= cv2.bitwise_and(frame,frame,mask=mask)

и если я покажу результат, он будет работать.

cv2.imshow("Frame", result)
0 голосов
/ 28 августа 2018

Предполагая, что ваша маска является двоичной маской, вы можете сделать следующее:

def cmb(foreground,background,mask):
    result = background.copy()
    result[mask] = foreground[mask]
    return result

Я не тестировал этот код, но я надеюсь, что идея приходит в голову. Вы инвертируете маску для фона и оставляете маску одну на переднем плане. Вы применяете это к каждому кадру и вуаля, у вас есть ваши маскированные изображения.

редактировать: скорректированный код в соответствии с комментарием. Конечно, это решение намного яснее, чем то, что я изначально написал. Однако функциональность остается прежней.

...