Script de Detecção de Faces para Robô

Um projeto robótico precisa enxergar objetos, a fim de tomada de ações.

O Robotinics não pode fugir deste tópico.

A seguir, iremos iniciar a abordagem deste projeto.

O ROBOTINICS utiliza uma abordagem não linear, para processamento de imagens.

Inicialmente, utilizamos o motion, que cria um serviço de stream de video.

A partir deste stream de video, identificamos as imagens contendo movimentação, e a partir da movimentação, disparamos scripts que interpretam a imagem.

Existem um numero infinito de analises possíveis, porem abordaremos aqui apenas o básico.

O Processamento da imagem, dispara um script chamado:

analisa_img.sh

Este shell script pode ser visto, conforme exemplo abaixo:

#!/bin/bash


quebrar() {
local filepath="$1"
local filename=$(basename "$filepath")
local ext=$(echo "$filename"| awk -F '.' '{ if (NF==2) {print $NF} else if ( NF>2) {print $(NF-1)"."$NF} }')
local dir=$(echo "$filepath" | awk -F '/' '{ print substr($0, 0 , length($0)-length($NF)-1) }')
echo -e "$dir""\t""$filename""\t""$ext"
}

ret="$(quebrar "$1")"
echo "$diretorio: " "$(echo "$ret" | cut -f1)"
diretorio="$(echo "$ret"|cut -f1)"
filename="$(echo "$ret"| cut -f2)"
somentefilename="$(echo "$filename"| cut -d. -f1)"
extensao="$(echo "$filename"| cut -d. -f2)"
novoarquivo="$(echo "$1"| cut -d. -f1)"
novoarquivo="$(echo "$novoarquivo"".mp4")"

#echo "Desmembramento do arquivo"
#echo $diretorio
#echo $somentefilename
#echo $extensao
#echo $filename
echo $novoarquivo


#ffmpeg -i $1 -c:v libx264 -preset ultrafast $novoarquivo

python /projetos/python/cv/load.py $novoarquivo


#rm -f $1

O código em destaque,

python /projetos/python/cv/load.py $novoarquivo

chama o load.py, que inicia o processamento da imagem, identificando na imagem, onde se encontra a face.

Podemos chamar, assim como neste exemplo, chamadas, para outras detecções, como olhos, bocas, objetos diversos.

As informações processadas, são armazenadas em tabelas do banco de dados.

O Código escrito em python

load.py

import sys
import numpy as np
import cv2
import MySQLdb
import pickle
import numpy as np
#import face_recognition

def conexao():
Banco="banco"
User="usuario"
Passwrd="senha"
Host="local"
resultado = 0

try:
resultado = MySQLdb.connect(db=Banco,user=User, passwd=Passwrd, host=Host)
except:
print("Erro ao conectar no Banco de dados")
resultado = -1
return resultado

def imcrop(img, bbox):
x1,y1,x2,y2 = bbox
if x1 < 0 or y1 < 0 or x2 > img.shape[1] or y2 > img.shape[0]:
img, x1, x2, y1, y2 = pad_img_to_fit_bbox(img, x1, x2, y1, y2)
return img[y1:y2, x1:x2, :]

def pad_img_to_fit_bbox(img, x1, x2, y1, y2):
img = np.pad(img, ((np.abs(np.minimum(0, y1)), np.maximum(y2 - img.shape[0], 0)),
(np.abs(np.minimum(0, x1)), np.maximum(x2 - img.shape[1], 0)), (0,0)), mode="constant")
y1 += np.abs(np.minimum(0, y1))
y2 += np.abs(np.minimum(0, y1))
x1 += np.abs(np.minimum(0, x1))
x2 += np.abs(np.minimum(0, x1))
return img, x1, x2, y1, y2


def GravaReg(arquivo,x,y,a,h):
con = conexao()
cursor = con.cursor()
sql= "insert into eventoCam (arquivo,x,y,a,h) values ('%s',%d,%d,%d,%d)" %(arquivo,x,y,a,h)
print(sql)
try:
cursor.execute(sql)
con.commit()
print("Registro Gravado")
except MySQLdb as erro:
print("Erro ao Executar SQL", erro)

#Pega o nome do arquivo a ser analisado
Arquivo = sys.argv[1]

# load an color image in grayscale
img = cv2.imread(Arquivo)
print("Carregado:%s",Arquivo)

classificador = cv2.CascadeClassifier("/projetos/python/cv/face.xml")
#eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')


#imagemCinza = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
imagemCinza = cv2.cvtColor(img, cv2.COLOR_GRAY2RGB)

#facesDetectadas = classificador.detectMultiScale(imagemCinza, scaleFactor=1.5, minSize=(100,100))
facesDetectadas = classificador.detectMultiScale(imagemCinza, 1.3, 5)
for (x1,y1,x2, y2 ) in facesDetectadas:
print("Face:",x1,y1)
GravaReg(Arquivo,x1,y1,x2,y2)
imcrop(img,bbox)
bbox.imwrite('face.png',roi_color)

cv2.destroyAllWindows()
print("Finalizou")

Para realizar o processamento deste projeto, primeiro é necessário configurar  o banco de dados.

def conexao():
Banco="banco"
User="usuario"
Passwrd="senha"
Host="local"
resultado = 0

Escrevendo o banco de dados (robotinicsdb), usuario e senha do banco, não esquecendo também do local.

A tabela eventoCam, armazena o evento da imagem processado.

 

 

Leave a Reply

Your email address will not be published. Required fields are marked *