OpenCV é uma biblioteca projetada para projetos de visão computacional. Ela já tem cerca de 20 anos. Usei-o na faculdade e ainda o utilizo para meus projetos em C ++ e Python, porque possui um bom suporte para essas linguagens.
Mas quando comecei a aprender e usar o Go, fiquei pensando se o OpenCV poderia ser usado para trabalhar com esse idioma. Naquela época, já havia exemplos e tutoriais sobre integração, mas me pareceu que eles eram muito complicados. Um pouco mais tarde me deparei com um invólucro criado pela equipe do The Hybrid Group. Neste artigo, mostrarei como começar o GoCV, desenvolvendo um sistema simples de reconhecimento de rosto com o Haar Cascades.
A Skillbox recomenda: O desenvolvedor Python desde o início do curso prático .
Lembramos que: para todos os leitores de "Habr" - um desconto de 10.000 rublos ao se inscrever em qualquer curso Skillbox usando o código promocional "Habr".
O que é necessário:- Vá;
- OpenCV (links do instalador abaixo);
- Web ou câmera de vídeo convencional.
InstalaçãoExemplo 1
No primeiro exemplo, tentaremos criar um aplicativo que abra uma janela com uma demonstração do fluxo de vídeo da câmera.
Primeiro, você precisa importar as bibliotecas que precisa trabalhar.
importação (
"Log"
"Gocv.io/x/gocv"
)Depois disso, você precisa criar um objeto VideoCapture usando a função VideoCaptureDevice. Este último permite capturar o fluxo de vídeo usando a 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 você precisa criar uma matriz n-dimensional. Ele armazenará imagens lidas da câmera.
img := gocv.NewMat() defer img.Close()
Para exibir o 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 sem fim para ler o fluxo de vídeo da câmera sem parar. Para fazer isso, você precisa do método Read do tipo VideoCapture. Ele aguardará o tipo Mat (a matriz que criamos acima), retornando um valor booleano indicando se o quadro do VideoCapture foi lido com êxito 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. Faça uma pausa para ir para o próximo quadro - 50 ms.
window.IMShow (img)
window.WaitKey (50)Após iniciar o aplicativo, uma janela com um fluxo de vídeo da câmera será aberta.

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 tirar proveito do exemplo anterior e criar um sistema de reconhecimento de face baseado em Haar Cascades (Haar Cascades).
As cascatas Haar são classificadores em cascata que são treinados com base na técnica de wavelet Haar. Eles analisam os pixels da imagem para detectar certos sinais. Para saber mais sobre as Haar Cascades, siga os links abaixo.
Estrutura de detecção de objetos Viola-JonesClassificadores em cascataRecurso semelhante ao HaarVocê
pode baixar cascatas já treinadas
aqui . No exemplo atual, cascatas serão usadas para identificar o rosto de uma pessoa.
Para fazer isso, você precisa criar um classificador e alimentar um arquivo já treinado (o link acima é fornecido). Eu já carreguei o arquivo pencv_haarcascade_frontalface_default.xml no diretório em que nosso programa está localizado.
harrcascade := “opencv_haarcascade_frontalface_default.xml”classifier := gocv.NewCascadeClassifier()classifier.Load(harrcascade) defer classifier.Close()
Para detectar rostos na imagem, você precisa usar o método
DetectMultiScale . Essa função aceita um quadro (tipo Mat) que acabou de ser lido no fluxo de vídeo da câmera e retorna uma matriz do tipo Retângulo. O tamanho da matriz representa o número de faces que o classificador foi capaz de detectar no quadro. Então, para garantir que vejamos o que ele encontrou, vamos percorrer a lista de retângulos e exibir o objeto Rectangle no console, criando uma borda ao redor do retângulo detectado. Isso pode ser feito usando a função Retângulo. Será necessário o Mat lido pela câmera, o objeto Rectangle 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) }


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 certo! Agora, temos um sistema simples de reconhecimento de rosto escrito em Go. No futuro próximo, pretendo continuar esses experimentos e criar novos itens interessantes, combinando o Go e o OpenCV.
Se você estiver interessado,
verifique o servidor da web gRPC , que escrevi em Python e OpenCV. Ele transmite dados no momento da detecção de rosto. Essa é a base para a criação de 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: