PC SOFT

PROFESSIONAL NEWSGROUPS
WINDEVWEBDEV and WINDEV Mobile

Home → WINDEV 25 → Reconhecimento Facial
Reconhecimento Facial
Started by Boller, Feb., 10 2025 12:42 PM - No answer
Registered member
3,774 messages
Posted on February, 10 2025 - 12:42 PM
Para criar um exemplo de reconhecimento facial usando Python e Windev, vamos dividir a solução em duas partes:
1. Python: Utilizar a biblioteca face_recognition para detectar e reconhecer rostos em imagens ou em tempo real com a webcam.
2. Windev: Criar um pequeno programa que interaja com o script Python, passando imagens e recebendo os resultados.

1️⃣ Código em Python (Reconhecimento Facial)

Este script Python usa face_recognition e cv2 para detectar rostos e comparar com imagens pré-carregadas.

import face_recognition
import cv2
import sys
import json

# Carregar a imagem conhecida (mude para sua imagem de referência)
known_image = face_recognition.load_image_file("pessoa_conhecida.jpg")
known_encoding = face_recognition.face_encodings(known_image)[0]

# Inicializar a webcam
video_capture = cv2.VideoCapture(0)

while True:
ret, frame = video_capture.read()
if not ret:
break

# Encontrar rostos na frame atual
face_locations = face_recognition.face_locations(frame)
face_encodings = face_recognition.face_encodings(frame, face_locations)

results = []

for face_encoding in face_encodings:
match = face_recognition.compare_faces([known_encoding], face_encoding, tolerance=0.5)
results.append("Match" if match[0] else "No Match")

# Retornar resultados como JSON (para Windev)
print(json.dumps(results))
sys.stdout.flush()

# Pressione "q" para sair
if cv2.waitKey(1) & 0xFF == ord('q'):
break

video_capture.release()
cv2.destroyAllWindows()

2️⃣ Código no Windev (Chamada ao Python)

Este código em WLanguage executa o script Python e recebe os resultados.

PROCEDURE ReconhecimentoFacial()

// Caminho do Python e do script
sPythonExe is string = "C:\Python39\python.exe"
sScriptPath is string = "C:\projetos\reconhecimento.py"

sResultado is string
sResultado = ExecuteShell(sPythonExe + " " + sScriptPath, exeReturn)

// Interpretar o resultado JSON do Python
arrResultado is array of string = JSONToVariant(sResultado)

// Exibir resultados no INFO
FOR EACH sFace IN arrResultado
IF sFace = "Match" THEN
Info("Rosto reconhecido!")
ELSE
Info("Nenhuma correspondência encontrada.")
END
END

📌 Explicação
1. O script Python:
• Carrega uma imagem conhecida (pessoa_conhecida.jpg).
• Ativa a webcam para capturar vídeo.
• Detecta rostos e compara com a imagem de referência.
• Retorna um JSON indicando se houve uma correspondência.
2. O Windev:
• Executa o script Python e recebe o JSON com os resultados.
• Converte o JSON para um array e exibe a resposta.

🔧 Requisitos
1. Instale as dependências do Python:

pip install face_recognition opencv-python json


2. Adicione o caminho do Python corretamente no Windev.
3. Substitua pessoa_conhecida.jpg por uma foto válida.

Agora o Windev pode interagir com o Python para reconhecimento facial! 🚀


Ou


Para integrar a DLL do VeriLook SDK da Neurotechnology em um projeto WINDEV para reconhecimento facial, siga os passos abaixo. Este exemplo demonstra como carregar a DLL, inicializar a biblioteca, capturar uma imagem da webcam e realizar o reconhecimento facial utilizando uma classe em WLanguage.

Pré-requisitos:
1. Instalação do VeriLook SDK:
• Certifique-se de que o VeriLook SDK está instalado em seu sistema.
• Localize a DLL principal do VeriLook, geralmente nomeada como VLook.dll.
2. Configuração do WINDEV:
• Inclua a VLook.dll no diretório do seu projeto WINDEV ou em um caminho acessível.
• Se necessário, registre a DLL no sistema.

Implementação:
1. Definição da Classe VeriLook:
Crie uma classe chamada VeriLook para encapsular as chamadas à DLL.

// Definição da classe VeriLook
Classe VeriLook
// Atributos
hInst is int
VLInitialize is int
VLFinalize is int
VLCreateContext is int
VLFreeContext is int
VLDetect is int
VLExtract is int
VLVerify is int
context is int

// Construtor
PROCEDURE Constructor()
// Carrega a DLL
hInst = LoadDLL("VLook.dll")
IF hInst = 0 THEN
Error("Falha ao carregar a DLL VLook.dll")
RETURN
END

// Obtém os endereços das funções necessárias
VLInitialize = GetProcAddress(hInst, "VLInitialize")
VLFinalize = GetProcAddress(hInst, "VLFinalize")
VLCreateContext = GetProcAddress(hInst, "VLCreateContext")
VLFreeContext = GetProcAddress(hInst, "VLFreeContext")
VLDetect = GetProcAddress(hInst, "VLDetect")
VLExtract = GetProcAddress(hInst, "VLExtract")
VLVerify = GetProcAddress(hInst, "VLVerify")

// Inicializa a biblioteca VeriLook
IF CallDLL32(VLInitialize) <> 0 THEN
Error("Falha na inicialização da biblioteca VeriLook")
RETURN
END

// Cria o contexto
context = CallDLL32(VLCreateContext)
IF context = 0 THEN
Error("Falha ao criar o contexto VeriLook")
RETURN
END
END

// Destrutor
PROCEDURE Destructor()
// Libera o contexto
IF context <> 0 THEN
CallDLL32(VLFreeContext, context)
END

// Finaliza a biblioteca VeriLook
CallDLL32(VLFinalize)

// Libera a DLL
IF hInst <> 0 THEN
FreeDLL(hInst)
END
END

// Método para detectar rostos em uma imagem
PROCEDURE DetectFaces(imagePath is string)
// Carrega a imagem
img is Image = dLoadImage(imagePath)
IF img = NULL THEN
Error("Falha ao carregar a imagem: " + imagePath)
RETURN
END

// Converte a imagem para o formato esperado pela DLL
// (Implementar a conversão conforme necessário)

// Chama a função de detecção de rostos
faceCount is int = CallDLL32(VLDetect, context, img)
RETURN faceCount
END

// Outros métodos para extração e verificação podem ser adicionados aqui
END


2. Uso da Classe VeriLook:
No código do seu aplicativo WINDEV, utilize a classe VeriLook para realizar o reconhecimento facial.

// Cria uma instância da classe VeriLook
vl is VeriLook

// Caminho da imagem a ser processada
imagePath is string = "C:\caminho\para\imagem.jpg"

// Detecta rostos na imagem
faceCount is int = vl.DetectFaces(imagePath)
Info("Número de rostos detectados: " + faceCount)



Observações Importantes:
• Conversão de Imagens: A função VLDetect espera que a imagem esteja em um formato específico. Certifique-se de converter a imagem carregada (img) para o formato esperado pela DLL. Consulte a documentação do VeriLook para detalhes sobre o formato de imagem necessário.
• Gerenciamento de Memória: Ao interagir com DLLs externas, é crucial gerenciar corretamente a alocação e liberação de memória para evitar vazamentos ou falhas.
• Tratamento de Erros: Implemente verificações de erro após cada chamada de função para garantir que o processo esteja ocorrendo conforme esperado.
• Documentação: Consulte a documentação oficial do VeriLook SDK para obter detalhes sobre as funções disponíveis, seus parâmetros e o fluxo de trabalho recomendado para reconhecimento facial.

Este exemplo fornece uma base para integrar o VeriLook SDK em um aplicativo WINDEV. Dependendo dos requisitos específicos do seu projeto, você pode precisar estender ou adaptar a classe VeriLook para incluir funcionalidades adicionais, como extração de características faciais, verificação de identidade e gerenciamento de múltiplas imagens ou câmeras.

Link

https://www.neurotechnology.com/verilook.html

O VeriLook SDK da Neurotechnology oferece uma variedade de funções para reconhecimento facial, disponíveis através de sua biblioteca dinâmica (DLL). Abaixo estão algumas das principais funções e seus parâmetros:
1. VLInitialize
• Descrição: Inicializa a biblioteca VeriLook. Deve ser chamada antes de qualquer outra função.
• Protótipo:
• C++: int VLOOK_API VLInitialize();
• Visual Basic: Public Declare Function VLInitialize Lib "VLook.dll" () As Long
• Retorno: Retorna VLE_OK em caso de sucesso ou um código de erro específico.
2. VLFinalize
• Descrição: Finaliza a biblioteca VeriLook, liberando recursos alocados. Deve ser chamada após o uso das funções da biblioteca.
• Protótipo:
• C++: int VLOOK_API VLFinalize();
• Visual Basic: Public Declare Function VLFinalize Lib "VLook.dll" () As Long
• Retorno: Retorna VLE_OK em caso de sucesso ou um código de erro específico.
3. VLCreateContext
• Descrição: Cria um contexto para operações de extração de características faciais.
• Protótipo:
• C++: void* VLOOK_API VLCreateContext();
• Visual Basic: Public Declare Function VLCreateContext Lib "VLook.dll" () As Long
• Retorno: Retorna um ponteiro para o contexto criado ou NULL em caso de falha.
4. VLFreeContext
• Descrição: Libera um contexto previamente criado.
• Protótipo:
• C++: int VLOOK_API VLFreeContext(void* context);
• Visual Basic: Public Declare Function VLFreeContext Lib "VLook.dll" (ByVal context As Long) As Long
• Parâmetros:
• context: Ponteiro para o contexto a ser liberado.
• Retorno: Retorna VLE_OK em caso de sucesso ou um código de erro específico.
5. VLDetectFaceOnce
• Descrição: Detecta um rosto em uma imagem estática.
• Protótipo:
• C++: int VLOOK_API VLDetectFaceOnce(ByteImage image, VL_FRAME_DETAILS* details, void* context);
• Visual Basic: Public Declare Function VLDetectFaceOnce Lib "VLook.dll" (ByRef image As ByteImage, ByRef details As Any, ByVal context As Long) As Long
• Parâmetros:
• image: Estrutura ByteImage contendo a imagem.
• details: Estrutura VL_FRAME_DETAILS para armazenar os detalhes da detecção.
• context: Contexto previamente criado.
• Retorno: Retorna VLE_OK em caso de sucesso ou um código de erro específico.
6. VLExtract
• Descrição: Extrai características faciais de uma imagem, utilizando as coordenadas dos olhos.
• Protótipo:
• C++: int VLOOK_API VLExtract(ByteImage image, Point leftEye, Point rightEye, Byte* features, void* context);
• Visual Basic: Public Declare Function VLExtract Lib "VLook.dll" (ByRef image As ByteImage, ByRef leftEye As Point, ByRef rightEye As Point, ByRef features As Variant, ByVal context As Long) As Long
• Parâmetros:
• image: Estrutura ByteImage contendo a imagem.
• leftEye: Estrutura Point com a coordenada do olho esquerdo.
• rightEye: Estrutura Point com a coordenada do olho direito.
• features: Ponteiro para o buffer onde as características serão armazenadas.
• context: Contexto previamente criado.
• Retorno: Retorna VLE_OK em caso de sucesso ou um código de erro específico.
7. VLVerify
• Descrição: Compara duas coleções de características faciais para verificar se pertencem à mesma pessoa.
• Protótipo:
• C++: int VLOOK_API VLVerify(Byte* features1, Byte* features2, Double* similarity, void* context);
• Visual Basic: Public Declare Function VLVerify Lib "VLook.dll" (features1 As Variant, features2 As Variant, ByRef similarity As Double, ByVal context As Long) As Long
• Parâmetros:
• features1: Ponteiro para a primeira coleção de características.
• features2: Ponteiro para a segunda coleção de características.
• similarity: Ponteiro para uma variável Double onde a similaridade será armazenada.
• context: Contexto previamente criado.
• Retorno: Retorna VLE_OK em caso de sucesso ou um código de erro específico.

Aqui está a implementação das procedures em WLanguage para interagir com a DLL do VeriLook SDK, encapsulando os principais métodos em procedures reutilizáveis.

📌 Estrutura das Procedures
• VeriLook_Inicializar(): Inicializa a biblioteca.
• VeriLook_Finalizar(): Finaliza a biblioteca.
• VeriLook_CriarContexto(): Cria um contexto para operações faciais.
• VeriLook_LiberarContexto(): Libera um contexto criado.
• VeriLook_DetectarRosto(): Detecta rostos em uma imagem.
• VeriLook_ExtrairCaracteristicas(): Extrai características faciais da imagem.
• VeriLook_Verificar(): Compara duas imagens para verificar se pertencem à mesma pessoa.

Implementação em WLanguage

// Definição de constantes para os códigos de erro
CONSTANTE
VLE_OK = 0
VLE_ERROR = -1
FIM

// Variáveis globais para armazenar o identificador da DLL e do contexto
g_hVeriLookDLL é um inteiro = 0
g_hContexto é um inteiro = 0

// 🚀 Inicializa a biblioteca VeriLook
PROCEDURE VeriLook_Inicializar()
SE g_hVeriLookDLL = 0 ENTÃO
g_hVeriLookDLL = LoadDLL("VLook.dll")
SE g_hVeriLookDLL = 0 ENTÃO
Info("Erro ao carregar a DLL VeriLook")
RETORNA VLE_ERROR
FIM
FIM

// Obtém o endereço da função VLInitialize e a chama
VLInitialize é um inteiro = GetProcAddress(g_hVeriLookDLL, "VLInitialize")
SE VLInitialize = 0 ENTÃO
Info("Erro ao obter endereço de VLInitialize")
RETORNA VLE_ERROR
FIM

// Chama a função de inicialização
SE CallDLL32(VLInitialize) <> VLE_OK ENTÃO
Info("Erro ao inicializar VeriLook")
RETORNA VLE_ERROR
FIM

Info("VeriLook inicializado com sucesso!")
RETORNA VLE_OK
FIM

// 🛑 Finaliza a biblioteca VeriLook
PROCEDURE VeriLook_Finalizar()
SE g_hVeriLookDLL <> 0 ENTÃO
VLFinalize é um inteiro = GetProcAddress(g_hVeriLookDLL, "VLFinalize")
SE VLFinalize <> 0 ENTÃO
CallDLL32(VLFinalize)
FIM
FreeDLL(g_hVeriLookDLL)
g_hVeriLookDLL = 0
FIM
Info("VeriLook finalizado!")
FIM

// 📌 Cria um contexto para operações faciais
PROCEDURE VeriLook_CriarContexto()
SE g_hVeriLookDLL = 0 ENTÃO
Info("Erro: VeriLook não foi inicializado")
RETORNA VLE_ERROR
FIM

VLCreateContext é um inteiro = GetProcAddress(g_hVeriLookDLL, "VLCreateContext")
SE VLCreateContext = 0 ENTÃO
Info("Erro ao obter endereço de VLCreateContext")
RETORNA VLE_ERROR
FIM

g_hContexto = CallDLL32(VLCreateContext)
SE g_hContexto = 0 ENTÃO
Info("Erro ao criar contexto VeriLook")
RETORNA VLE_ERROR
FIM

Info("Contexto VeriLook criado com sucesso!")
RETORNA g_hContexto
FIM

// 🔄 Libera um contexto criado
PROCEDURE VeriLook_LiberarContexto()
SE g_hContexto <> 0 ENTÃO
VLFreeContext é um inteiro = GetProcAddress(g_hVeriLookDLL, "VLFreeContext")
SE VLFreeContext <> 0 ENTÃO
CallDLL32(VLFreeContext, g_hContexto)
FIM
g_hContexto = 0
Info("Contexto VeriLook liberado!")
SENÃO
Info("Nenhum contexto para liberar.")
FIM
FIM

// 📷 Detecta rostos em uma imagem
PROCEDURE VeriLook_DetectarRosto(sCaminhoImagem é uma string)
SE g_hContexto = 0 ENTÃO
Info("Erro: Contexto VeriLook não criado")
RETORNA VLE_ERROR
FIM

VLDetect é um inteiro = GetProcAddress(g_hVeriLookDLL, "VLDetectFaceOnce")
SE VLDetect = 0 ENTÃO
Info("Erro ao obter endereço de VLDetectFaceOnce")
RETORNA VLE_ERROR
FIM

// Carregar a imagem usando WLanguage
img é uma imagem = dLoadImage(sCaminhoImagem)
SE img = NULL ENTÃO
Info("Erro ao carregar a imagem")
RETORNA VLE_ERROR
FIM

// Chamada da função de detecção
nFaceCount é um inteiro = CallDLL32(VLDetect, img, NULL, g_hContexto)
Info("Número de rostos detectados: " + nFaceCount)

RETORNA nFaceCount
FIM

// 🏷️ Extrai características faciais da imagem
PROCEDURE VeriLook_ExtrairCaracteristicas(sCaminhoImagem é uma string)
SE g_hContexto = 0 ENTÃO
Info("Erro: Contexto VeriLook não criado")
RETORNA VLE_ERROR
FIM

VLExtract é um inteiro = GetProcAddress(g_hVeriLookDLL, "VLExtract")
SE VLExtract = 0 ENTÃO
Info("Erro ao obter endereço de VLExtract")
RETORNA VLE_ERROR
FIM

// Carregar imagem
img é uma imagem = dLoadImage(sCaminhoImagem)
SE img = NULL ENTÃO
Info("Erro ao carregar a imagem")
RETORNA VLE_ERROR
FIM

// Definir pontos dos olhos manualmente (exemplo, deve ser obtido dinamicamente)
pLeftEye é um Ponto = {X = 50, Y = 50}
pRightEye é um Ponto = {X = 150, Y = 50}

// Criar buffer para armazenar características faciais
sFeatures é uma string

// Chamar a função de extração
SE CallDLL32(VLExtract, img, pLeftEye, pRightEye, &sFeatures, g_hContexto) <> VLE_OK ENTÃO
Info("Erro ao extrair características")
RETORNA VLE_ERROR
FIM

Info("Características faciais extraídas com sucesso!")
RETORNA sFeatures
FIM

// 🔍 Verifica se duas imagens pertencem à mesma pessoa
PROCEDURE VeriLook_Verificar(sImagem1 é uma string, sImagem2 é uma string)
sFeature1 é uma string = VeriLook_ExtrairCaracteristicas(sImagem1)
sFeature2 é uma string = VeriLook_ExtrairCaracteristicas(sImagem2)

VLVerify é um inteiro = GetProcAddress(g_hVeriLookDLL, "VLVerify")
SE VLVerify = 0 ENTÃO
Info("Erro ao obter endereço de VLVerify")
RETORNA VLE_ERROR
FIM

nSimilaridade é um real

// Chamar a função de verificação
SE CallDLL32(VLVerify, &sFeature1, &sFeature2, &nSimilaridade, g_hContexto) <> VLE_OK ENTÃO
Info("Erro ao verificar correspondência")
RETORNA VLE_ERROR
FIM

Info("Similaridade entre as imagens: " + nSimilaridade + "%")

RETORNA nSimilaridade
FIM

📌 Como Usar

VeriLook_Inicializar()
VeriLook_CriarContexto()
VeriLook_DetectarRosto("C:\imagens\foto.jpg")
VeriLook_Verificar("C:\imagens\pessoa1.jpg", "C:\imagens\pessoa2.jpg")
VeriLook_LiberarContexto()
VeriLook_Finalizar()

Esse conjunto de procedures encapsula toda a lógica de reconhecimento facial com o VeriLook SDK dentro do WINDEV! 🚀

--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 99949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/