PROFESSIONAL NEWSGROUPSWINDEV , WEBDEV and WINDEV Mobile
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: adrianobollerhttp://wxinformatica.com.br/