GOOGLE ADS

martes, 19 de abril de 2022

Mejora del enmascaramiento de OpenCV

Hice un programa que aplica una máscara sobre un objeto como se describe en esta pregunta de StackOverflow. Lo hice utilizando la umbralización de color y haciendo que la máscara seleccionara solo la gama de colores de la piel humana (no sé si funciona para las personas blancas, ya que no soy blanco y funciona bien para mí). el problema es que cuando lo ejecuto, también se recogen algunos grises (área gris en la pared o una sombra) en la máscara y se aplica allí. programa cuando se ejecuta
Quería saber si había una forma de eliminar los bits innecesarios en segundo plano y/o si había una forma de resolver esto usando la detección de objetos. PD Intenté usar createBackgroundSubtractorGMG/MOG/etc pero salió muy extraño y mucho peor. Aquí está mi código:

import cv2
from cv2 import bitwise_and
from cv2 import COLOR_HSV2BGR
import numpy as np
from matplotlib import pyplot as plt
cap = cv2.VideoCapture(0)
image = cv2.imread('yesh1.jpg')
bg = cv2.imread('kruger.jpg')
bg = cv2.cvtColor(bg, cv2.COLOR_BGR2RGB)
kernel1 = np.ones((1,1),np.uint8)
kernel2 = np.ones((10,10),np.uint8)
while (1):
ret, frame = cap.read()
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
lowerBound = np.array([1, 1, 1])
upperBound = np.array([140, 255,140])
mask = cv2.inRange(hsv, lowerBound, upperBound)
blur = cv2.GaussianBlur(mask,(5,5),0)
ret1,mask = cv2.threshold(blur,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel1)
contourthickness = cv2.cvtColor(mask, cv2.IMREAD_COLOR)
res = bitwise_and(frame, frame, mask = mask)
crop_bg = bg[0:480, 0:640]
final = frame + res
final = np.where(contourthickness!= 0, crop_bg, final)
cv2.imshow('frame', frame)
cv2.imshow('Final', final) # TIS WORKED BBYY
key = cv2.waitKey(1) & 0xFF
if key == 27:
break
cv2.destroyAllWindows()

EDITAR: siguiendo el comentario de @ fmw42, estoy agregando la imagen original, así como una captura de pantalla de cómo se ven los diferentes marcos. La imagen enmascarada también cambia de color. Algo para arreglar que también será útil.
imagen de fondo
ingrese la descripción de la imagen aquí


Solución del problema

@Jeremi. Tu código funcionando al 100%. Usando la pared blanca para el fondo. Evite la puerta (no es blanca, es crema), sombra alrededor del borde, para evitar ruidos. Si tienes sábanas blancas o paredes blancas. Estoy usando Raspberry pi 4b/8gb, monitor 4k. No puedo obtener el tamaño real de la ventana.

Aquí está la salida:
ingrese la descripción de la imagen aquí

Lo que ves en mi salida. Coloqué mi mano detrás de una sábana blanca más cerca de la cámara. No tengo pared blanca en mi habitación. Mi habitación es más verde. Por eso ves el logo en el fondo. Por cierto, puedo mover mi mano sin problema.

No hay comentarios.:

Publicar un comentario

Flutter: error de rango al acceder a la respuesta JSON

Estoy accediendo a una respuesta JSON con la siguiente estructura. { "fullName": "FirstName LastName", "listings...