Construindo um sistema de reconhecimento facial baseado em Golang e OpenCV

Construindo um sistema de reconhecimento facial baseado em Golang e OpenCV
OpenCV é uma biblioteca projetada para projetos de visão computacional. Ela já tem cerca de 20 anos. Usei-o na faculdade e ainda o uso em meus projetos C++ e Python porque tem um bom suporte para essas linguagens.

Mas quando comecei a aprender e usar Go, fiquei interessado em saber se o OpenCV poderia ser usado para trabalhar com essa linguagem. Naquela época já existiam exemplos e tutoriais de integração, mas me pareceu que eram muito complicados. Um pouco mais tarde, me deparei com um wrapper criado pela equipe do The Hybrid Group. Neste artigo, mostrarei como começar a usar GoCV desenvolvendo um sistema simples de reconhecimento facial com Haar Cascades.

A Skillbox recomenda: curso prático "Desenvolvedor Python do zero".

Lembramos: para todos os leitores de "Habr" - um desconto de 10 rublos ao se inscrever em qualquer curso Skillbox usando o código promocional "Habr".

O que será necessário:

  • Vá;
  • OpenCV (links do instalador abaixo);
  • web ou câmera de vídeo normal.

Instalação

Exemplo 1

No primeiro exemplo, tentaremos criar um aplicativo que abra uma janela mostrando o stream de vídeo da câmera.

Primeiro você precisa importar as bibliotecas necessárias para o trabalho.

importar (
"registro"
“gocv.io/x/gocv”
)

Depois disso, você precisa criar um objeto VideoCapture usando a função VideoCaptureDevice. Este último permite capturar um stream de vídeo por meio de uma câmera. A função usa um número inteiro como parâmetro (representa o ID do dispositivo).

webcam, err := gocv.VideoCaptureDevice(0)
if err != nil {    log.Fatalf(“error opening web cam: %v”, err)
}
defer webcam.Close()

Agora precisamos criar uma matriz n-dimensional. Ele armazenará imagens lidas da câmera.

img := gocv.NewMat()
defer img.Close()

Para exibir um fluxo de vídeo, você precisa criar uma janela - isso pode ser feito usando a função NewWindow.

window := gocv.NewWindow(“webcamwindow”)
defer window.Close()

Agora vamos para a parte mais interessante.

Como o vídeo é um fluxo contínuo de quadros de imagem, precisaremos criar um loop infinito para ler infinitamente o fluxo de vídeo da câmera. Para fazer isso, você precisa do método Read do tipo VideoCapture. Ele esperará um tipo Mat (a matriz que criamos acima), retornando um valor booleano indicando se o quadro do VideoCapture foi lido com sucesso ou não.

for {     
        if ok := webcam.Read(&img); !ok || img.Empty( {
        log.Println(“Unable to read from the webcam”)    continue
     }
.
.
.
}

Agora você precisa exibir o quadro na janela criada. A pausa para passar para o próximo quadro é de 50 ms.

janela.IMShow(img)
janela.WaitKey(50)

Após iniciar o aplicativo, uma janela será aberta com um stream de vídeo da câmera.

Construindo um sistema de reconhecimento facial baseado em Golang e OpenCV

package main
 
import (
"log"
 
"gocv.io/x/gocv"
)
 
func main() {
webcam, err := gocv.VideoCaptureDevice(0)
if err != nil {
    log.Fatalf("error opening device: %v", err)
}
defer webcam.Close()
 
img := gocv.NewMat()
defer img.Close()
 
window := gocv.NewWindow("webcamwindow")
defer window.Close()
 
for {
if ok := webcam.Read(&img); !ok || img.Empty() {
log.Println("Unable to read from the webcam")
continue
}
 
window.IMShow(img)
window.WaitKey(50)
}
}

Exemplo 2

Neste exemplo, vamos usar o exemplo anterior e construir um sistema de reconhecimento facial baseado em Haar Cascades.

Cascatas de Haar são classificadores em cascata treinados usando a técnica wavelet de Haar. Eles analisam os pixels de uma imagem para detectar certos recursos. Para saber mais sobre Haar Cascades, siga os links abaixo.

Estrutura de detecção de objetos Viola-Jones
Classificadores em cascata
recurso semelhante a Haar

Baixe cascatas já treinadas pode estar aqui. No exemplo atual, cascatas serão usadas para identificar o rosto de uma pessoa de frente.

Para fazer isso, você precisa criar um classificador e alimentá-lo com um arquivo já treinado (o link é fornecido acima). Já carreguei o arquivo pencv_haarcascade_frontalface_default.xml no diretório onde nosso programa está localizado.

harrcascade := “opencv_haarcascade_frontalface_default.xml”classifier := gocv.NewCascadeClassifier()classifier.Load(harrcascade)
defer classifier.Close()

Para detectar rostos em uma imagem, você precisa usar o método Detectar MultiScale. Esta função pega um quadro (tipo Mat) que acabou de ser lido do stream de vídeo da câmera e retorna um array do tipo Rectangle. O tamanho da matriz representa o número de faces que o classificador foi capaz de detectar no quadro. Então, para ter certeza de que veremos o que foi encontrado, vamos percorrer a lista de retângulos e imprimir o objeto Rectangle no console, criando uma borda ao redor do retângulo detectado. Isso pode ser feito usando a função Retângulo. Aceitará o Mat lido pela câmera, o objeto Rectangle que foi retornado pelo método DetectMultiScale, a cor e a espessura da borda.

for _, r := range rects {
fmt.Println(“detected”, r)
gocv.Rectangle(&img, r, color, 2)
}

Construindo um sistema de reconhecimento facial baseado em Golang e OpenCV

Construindo um sistema de reconhecimento facial baseado em Golang e OpenCV

package main
 
import (
"fmt"
"image/color"
"log"
 
"gocv.io/x/gocv"
)
 
func main() {
webcam, err := gocv.VideoCaptureDevice(0)
if err != nil {
log.Fatalf("error opening web cam: %v", err)
}
defer webcam.Close()
 
img := gocv.NewMat()
defer img.Close()
 
window := gocv.NewWindow("webcamwindow")
defer window.Close()
 
harrcascade := "opencv_haarcascade_frontalface_default.xml"
classifier := gocv.NewCascadeClassifier()
classifier.Load(harrcascade)
defer classifier.Close()
 
color := color.RGBA{0, 255, 0, 0}
for {
if ok := webcam.Read(&img); !ok || img.Empty() {
log.Println("Unable to read from the device")
continue
}
 
rects := classifier.DetectMultiScale(img)
for _, r := range rects {
fmt.Println("detected", r)
gocv.Rectangle(&img, r, color, 3)
}
 
window.IMShow(img)
window.WaitKey(50)
}
}

E... sim, deu tudo certo! Agora temos um sistema simples de reconhecimento facial escrito em Go. Em breve pretendo continuar esses experimentos e criar novas coisas interessantes combinando Go e OpenCV.

Se você estiver interessado, avalie servidor web gRPC, que escrevi em Python e OpenCV. Ele transmite dados no momento em que um rosto é detectado. Esta é a base para criar diferentes clientes em diferentes linguagens de programação. Eles poderão se conectar ao servidor e ler dados dele.

Obrigado por ler o artigo!

A Skillbox recomenda:

Fonte: habr.com

Adicionar um comentário