<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>facemark &#8211; Visão Computacional</title>
	<atom:link href="https://visaocomputacional.com.br/tag/facemark/feed/" rel="self" type="application/rss+xml" />
	<link>https://visaocomputacional.com.br</link>
	<description>Tecnologias, teorias e testes.</description>
	<lastBuildDate>Thu, 28 Aug 2025 18:26:15 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=5.8.1</generator>

<image>
	<url>https://visaocomputacional.com.br/wp-content/uploads/2021/12/cropped-logo-150x150-1-32x32.png</url>
	<title>facemark &#8211; Visão Computacional</title>
	<link>https://visaocomputacional.com.br</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Experimento &#8211; Detecção de piscadas e contador de piscadas com OpenCV e Dlib</title>
		<link>https://visaocomputacional.com.br/deteccao-e-contagem-de-piscadas-com-opencv-e-dlib/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=deteccao-e-contagem-de-piscadas-com-opencv-e-dlib</link>
		
		<dc:creator><![CDATA[Piemontez]]></dc:creator>
		<pubDate>Thu, 21 Oct 2021 11:53:02 +0000</pubDate>
				<category><![CDATA[Experimentos]]></category>
		<category><![CDATA[Contador Piscadas]]></category>
		<category><![CDATA[Detecção Piscadas]]></category>
		<category><![CDATA[Dlib]]></category>
		<category><![CDATA[facemark]]></category>
		<category><![CDATA[OpenCV]]></category>
		<category><![CDATA[Pontos Faciais]]></category>
		<guid isPermaLink="false">http://visaocomputacional.com.br/?p=2297</guid>

					<description><![CDATA[<p>Apresentação dos resultados dos experimentos na detecção de piscadas com as bibliotecas OpenCV e Dlib.</p>
<p>The post <a rel="nofollow" href="https://visaocomputacional.com.br/deteccao-e-contagem-de-piscadas-com-opencv-e-dlib/">Experimento &#8211; Detecção de piscadas e contador de piscadas com OpenCV e Dlib</a> appeared first on <a rel="nofollow" href="https://visaocomputacional.com.br">Visão Computacional</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<div class="ratio ratio-16x9"><iframe loading="lazy" title="VC - Experimento - Detecção de piscadas e contador de piscadas com OpenCV e Dlib" width="800" height="450" src="https://www.youtube.com/embed/6Fi8jTeIG8s?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></div>
</div></figure>



<p>Neste vídeo, apresento os resultados obtidos no experimento de detecção e contagem de piscadas com a webcam.</p>



<p>Para realizar este experimento, foi necessário coletar o contorno dos olhos através da detecção de pontos faciais do rosto e criar um pequeno controlador que verifica a proporção do olho aberto e fechado.&nbsp; Este controlador verifica se o olho foi fechado e depois verifica se o olho voltou a estar aberto, ao realizar finalizar este processo contabiliza uma piscada.</p>



<p>A coleta dos pontos faciais foi realizada com a biblioteca OpenCV e Dlib, que por padrão informa 6 referências para cada olho. Os posts &#8220;Detecção de pontos faciais com <a href="http://visaocomputacional.com.br/deteccao-de-pontos-faciais-facemark-com-opencv/">OpenCV&#8221;</a> e &#8220;Detecção de pontos faciais com <a href="http://visaocomputacional.com.br/deteccao-de-pontos-faciais-facemark-com-dlib/">Dlib</a>&#8220;, detalham melhor esta coleta.</p>



<p>A proporção de olho aberto é calculada apenas dividindo a altura do olho pela largura do olho, conforme ilustrado na Fig 1. abaixo.</p>



<div class="wp-block-image"><figure class="aligncenter"><a href="http://visaocomputacional.com.br/wp-content/uploads/2021/10/calculo_proporcao_olho.png"><img loading="lazy" width="493" height="191" src="http://visaocomputacional.com.br/wp-content/uploads/2021/10/calculo_proporcao_olho.png" alt="" class="wp-image-2312" srcset="https://visaocomputacional.com.br/wp-content/uploads/2021/10/calculo_proporcao_olho.png 493w, https://visaocomputacional.com.br/wp-content/uploads/2021/10/calculo_proporcao_olho-300x116.png 300w" sizes="(max-width: 493px) 100vw, 493px" /></a><figcaption>Fig 1. Informações utilizadas para calcular a proporção de olho aberto.</figcaption></figure></div>



<p>Caso você esteja se perguntando, &#8220;mas por que ele não utiliza apenas a informação da altura olho?&#8221;. Na imagem abaixo (Fig 2.) espero responder esta pergunta. Note, nesta imagem, que existem diversos tamanhos de olhos, se for considerado apenas a altura do olho aberto, para saber se o olho está fechando ou não, o controlador irá identificar piscadas apenas com um único tamanho de imagem de olho, e não para qualquer tamanho de olho encontrado.</p>



<div class="wp-block-image"><figure class="aligncenter"><a href="http://visaocomputacional.com.br/wp-content/uploads/2021/10/olho_diferente_tamanhos.png"><img loading="lazy" width="491" height="121" src="http://visaocomputacional.com.br/wp-content/uploads/2021/10/olho_diferente_tamanhos.png" alt="" class="wp-image-2319" srcset="https://visaocomputacional.com.br/wp-content/uploads/2021/10/olho_diferente_tamanhos.png 491w, https://visaocomputacional.com.br/wp-content/uploads/2021/10/olho_diferente_tamanhos-300x74.png 300w" sizes="(max-width: 491px) 100vw, 491px" /></a><figcaption>Fig 2. Olhos com diferentes tamanhos na imagem.</figcaption></figure></div>



<p>Para calcular a largura do olho, basta calcular a distância euclidiana entre os pontos da lateral esquerda e lateral direita do olho. A Fig 3. ilustra o cálculo da distância euclidiana.</p>



<div class="wp-block-image"><figure class="aligncenter"><a href="http://visaocomputacional.com.br/wp-content/uploads/2021/10/distancia_euclidiana-1.png"><img loading="lazy" width="454" height="269" src="http://visaocomputacional.com.br/wp-content/uploads/2021/10/distancia_euclidiana-1.png" alt="" class="wp-image-2324" srcset="https://visaocomputacional.com.br/wp-content/uploads/2021/10/distancia_euclidiana-1.png 454w, https://visaocomputacional.com.br/wp-content/uploads/2021/10/distancia_euclidiana-1-300x178.png 300w" sizes="(max-width: 454px) 100vw, 454px" /></a><figcaption>Fig 3. Fórmula distância euclidia.</figcaption></figure></div>



<p>E para calcular a altura dos olhos é preciso coletar o centro da parte superior e o centro da parte inferior do olho. O centro da parte superior é obtido somando os X e Y das posições 38 e 39 do olho e dividindo por 2, conforme Fig 1. E o centro da parte inferior é obtido da mesma forma, porém utilizando as posições 42 e 41. A Fig 4. ilustra todo o cálculo realizado para calcular a proporção do olho e a condicional para verificar se o olho está aberto e fechado.</p>



<div class="wp-block-image"><figure class="aligncenter"><a href="http://visaocomputacional.com.br/wp-content/uploads/2021/10/proporcao_olho_aberto.png"><img loading="lazy" width="591" height="338" src="http://visaocomputacional.com.br/wp-content/uploads/2021/10/proporcao_olho_aberto.png" alt="" class="wp-image-2328" srcset="https://visaocomputacional.com.br/wp-content/uploads/2021/10/proporcao_olho_aberto.png 591w, https://visaocomputacional.com.br/wp-content/uploads/2021/10/proporcao_olho_aberto-300x172.png 300w, https://visaocomputacional.com.br/wp-content/uploads/2021/10/proporcao_olho_aberto-150x85.png 150w" sizes="(max-width: 591px) 100vw, 591px" /></a><figcaption>Fig 4. Cálculo de proporção de olho aberto.</figcaption></figure></div>



<p>Todo o código fonte do projeto está disponível para replicação do experimento no link abaixo. Caso tenham dúvidas e sugestões de melhorias no post, deixe seu comentário abaixo.</p>



<p>Source:<br><a href="https://github.com/visaocomputacionalexemplos/experimentos_faciais/tree/main/identificar_piscada">https://github.com/visaocomputacionalexemplos/experimentos_faciais/tree/main/identificar_piscada</a></p>
<p>The post <a rel="nofollow" href="https://visaocomputacional.com.br/deteccao-e-contagem-de-piscadas-com-opencv-e-dlib/">Experimento &#8211; Detecção de piscadas e contador de piscadas com OpenCV e Dlib</a> appeared first on <a rel="nofollow" href="https://visaocomputacional.com.br">Visão Computacional</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Detecção de pontos faciais (Facemark) com Dlib</title>
		<link>https://visaocomputacional.com.br/deteccao-de-pontos-faciais-facemark-com-dlib/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=deteccao-de-pontos-faciais-facemark-com-dlib</link>
		
		<dc:creator><![CDATA[Piemontez]]></dc:creator>
		<pubDate>Tue, 19 Oct 2021 14:03:07 +0000</pubDate>
				<category><![CDATA[Visão computacional]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[Dlib]]></category>
		<category><![CDATA[facemark]]></category>
		<category><![CDATA[Pontos Faciais]]></category>
		<category><![CDATA[shape predictor]]></category>
		<guid isPermaLink="false">http://visaocomputacional.com.br/?p=2192</guid>

					<description><![CDATA[<p>Saiba como realizar a detecção de pontos faciais, com a biblioteca Dlib, utilizando o algoritmo Shape Predictor de Kazemi.</p>
<p>O código fonte disponibilizado contém o modelo treinado para possibilitar a replicação do experimento.</p>
<p>The post <a rel="nofollow" href="https://visaocomputacional.com.br/deteccao-de-pontos-faciais-facemark-com-dlib/">Detecção de pontos faciais (Facemark) com Dlib</a> appeared first on <a rel="nofollow" href="https://visaocomputacional.com.br">Visão Computacional</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<div class="ratio ratio-16x9"><iframe loading="lazy" title="VC - Detecção de pontos faciais (Facemark) com Dlib" width="800" height="450" src="https://www.youtube.com/embed/_ALx8It4Eqo?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></div>
</div></figure>



<p>Neste post, é apresentado como realizar a detecção de pontos faciais com o algoritmo de Kazemi, implementado na biblioteca Dlib utilizando Shape Predictor. Na primeira parte deste tutorial, é apresentado o conceito de shape predictor (preditor de forma/ponto de referência) e como ele pode se usado para prever localizações específicas em objetos estruturais.</p>



<p>Este conteúdo é continuação do post <a href="http://visaocomputacional.com.br/deteccao-de-pontos-faciais-facemark-com-opencv-e-dlib/">Detecção de pontos faciais (Facemark) com OpenCV,</a> recomendo a leitura dele primeiro, para melhor entender os conceitos básicos aqui apresentados.</p>



<h2>Revisão de Conteúdo</h2>



<p>Caso você não queira ler o <a href="http://visaocomputacional.com.br/deteccao-de-pontos-faciais-facemark-com-opencv-e-dlib/">post anterior</a>, segue uma rápida revisão do conteúdo.</p>



<p>Os pontos faciais, em visão computacional, como o próprio nome diz, são pequenas regiões faciais identificadas por uma numeração, conforme ilustra a Fig 1.. Estas regiões, são identificadas por um ponto e uma numeração que pode variar de técnica para técnica utilizada.</p>



<div class="wp-block-image"><figure class="aligncenter"><a href="http://visaocomputacional.com.br/wp-content/uploads/2021/10/pontosfaciais.png"><img loading="lazy" width="150" height="150" src="http://visaocomputacional.com.br/wp-content/uploads/2021/10/pontosfaciais-150x150.png" alt="" class="wp-image-1925" srcset="https://visaocomputacional.com.br/wp-content/uploads/2021/10/pontosfaciais-150x150.png 150w, https://visaocomputacional.com.br/wp-content/uploads/2021/10/pontosfaciais-230x230.png 230w" sizes="(max-width: 150px) 100vw, 150px" /></a><figcaption>Fig 1. Principais pontos faciais utilizados.</figcaption></figure></div>



<p>Para realizar a detecção de pontos faciais, são necessárias as seguintes etapas antecessoras à coleta dos pontos na imagem: (1) identificar os rostos na imagem; (2) rotacionar o rosto caso necessário e (3) identificar os pontos faciais A Fig 2. Ilustra estas etapas..</p>



<div class="wp-block-image"><figure class="aligncenter"><a href="http://visaocomputacional.com.br/wp-content/uploads/2021/10/etapas_facemark.png"><img loading="lazy" width="300" height="105" src="http://visaocomputacional.com.br/wp-content/uploads/2021/10/etapas_facemark-300x105.png" alt="" class="wp-image-1971" srcset="https://visaocomputacional.com.br/wp-content/uploads/2021/10/etapas_facemark-300x105.png 300w, https://visaocomputacional.com.br/wp-content/uploads/2021/10/etapas_facemark-768x268.png 768w, https://visaocomputacional.com.br/wp-content/uploads/2021/10/etapas_facemark-600x209.png 600w, https://visaocomputacional.com.br/wp-content/uploads/2021/10/etapas_facemark.png 998w" sizes="(max-width: 300px) 100vw, 300px" /></a><figcaption>Fig 2. Etapas antecessoras a detecção de pontos faciais.</figcaption></figure></div>



<h2>Algoritmo Shape Predictor de Kazemi</h2>



<p>&#8220;Shape Predictor&#8221; são utilizados para localizar coordenadas (x, y) específicas a partir de uma forma de entrada. O termo &#8220;Shape&#8221; é arbitrário, mas presume-se que a forma seja de natureza estrutural, como: rostos; mãos; dedos; etc <a href="#refs_r">[R]</a>.</p>



<p>Por exemplo, os rostos têm formas e tamanhos diversos, e todos eles compartilham características estruturais comuns: os olhos estão acima do nariz, o nariz está acima da boca, etc. O objetivo dos preditores de forma/ponto de referência, é explorar esse conhecimento estrutural e, com dados de treinamento suficientes, aprender como prever automaticamente a localização dessas estruturas <a href="#refs_r">[R]</a>.</p>



<p>Existem vários algoritmos preditores de forma. O algoritmo do preditor de forma implementado na biblioteca Dlib vem do artigo <a href="https://www.csc.kth.se/~vahidk/face_ert.html">CVPR de Kazemi e Sullivan de 2014, One Millisecond Face Alignment with an Ensemble of Regression Trees </a> &nbsp;<a href="http://visaocomputacional.com.br/deteccao-de-pontos-faciais-facemark-com-opencv-e-dlib/#ref_kj1">[KJ1]</a>.</p>



<h2>Código e Experimentos</h2>



<p>A seguir, são apresentados partes do código criado para realizar os experimentos de detecção de pontos faciais. Caso queira replicar estes experimentos, basta baixar o código fonte disponível no github (link na seção “Source” no final deste post).</p>



<p>Neste primeiro bloco, são inicializados todos os detectores do sistema, o detector facial e o detector de pontos faciais. Para iniciar todos estes detectores é muito simples, basta instanciar a classe <strong>dlib::frontal_face_detector</strong>, instanciar a classe <strong>dlib::shape_predictor</strong> e carregar o modelo treinado para a classe shape_predictor.</p>



<pre class="wp-block-preformatted">...
#include &lt; dlib/image_processing/frontal_face_detector.h &gt;
#include &lt; dlib/image_processing.h &gt;
<strong>dlib::frontal_face_detector detector;</strong>
<strong>dlib::shape_predictor shapePredictor;
</strong>
main() {
...
    // Inicia Detector faciauk
    <strong>detector = dlib::get_frontal_face_detector()</strong>;
    //Carrega o modelo treinado do shape predictor
    iniciarDetectorPontosFacialSP(shapePredictor);
...
}
void iniciarDetectorPontosFacialSP(dlib::shape_predictor &amp;sp)
{
    <strong>dlib::deserialize("../../extra/shape_predictor_68_face_landmarks.dat")</strong> &gt;&gt; sp;
}
</pre>



<p>Para carregar o modelo de dados com Dlib, basta utilizar a função de <strong>dlib::deserialize</strong> e informar o caminho do arquivo. Esta função carrega o modelo treinado e transfere os dados carregados para a classe de predição com o operador &#8220;&gt;&gt;&#8221;&nbsp; conforme trecho de código <strong>&#8220;&gt;&gt; sp&#8221;</strong>.</p>



<p>Com os detectores/preditores carregados, agora precisamos carregar a imagem com os rostos a serem detectados. Neste experimento, utilizamos a webcam para este fim e para carregar as imagens da webcam, utilizamos a biblioteca OpenCV, que é de fácil instalação.</p>



<p>Para capturar a câmera do vídeo com o OpenCV, basta instanciar a classe “cv::VideoCapturecap” e coletar a imagem do vídeo com o operador “&gt;&gt;” conforme trecho de código “cap&gt;&gt;img”.</p>



<pre class="wp-block-preformatted">main() {
  ...
  //Inicia captura dos vídeos
<strong>  cv::VideoCapturecap cap(0);</strong>
  if (!cap.isOpened()) {
    std::cout&lt;&lt;"Video Capture Fail"&lt;&lt;std::endl; return1; } cv::Mat img; cap&gt;&gt;img;
    return 1;
  }
  //Calcula nova dimensão da imagem para 320 pixels
  auto showSize = cv::Size(320, ((float)320 / img.cols) * img.rows);
  for (;;)
  {
    //Coleta a imagem da camera
    <strong>cap&gt;&gt;img;</strong>
    //Reescala a imagem para uma largura de 320 pixels
    cv::resize(img, img, showSize, 0, 0, cv::INTER_LINEAR_EXACT);
    <strong>coletarPontosFaciais(img);
</strong>
    cv::imshow("Origem", img);
    cv::waitKey(5);
  }
}
</pre>



<p>Por fim, no último trecho de código, é apresentado como coletar os pontos faciais com o OpenCV.</p>



<pre class="wp-block-preformatted">dlib::image_window win, win_faces;
std::vector&lt; dlib::rectangle &gt; rostosDetectados;
void coletarPontosFaciais(const dlib::array2d&amp; imagemOriginal)
{
    //Detecta os pontos faciais e retorna a lista de rostos detectados
    rostosDetectados = <strong>detector(imagemOriginal)</strong>;
    //Percorre os rostos detectados e coloca os pontos faciais
    <strong>std::vector&lt; dlib::full_object_detection &gt; pontosFaciais</strong>;
    for (unsigned long j = 0; j &lt; rostosDetectados.size(); ++j)
    {
        //Coleta os pontos faciais de um único rosto
        <strong>dlib::full_object_detection shape = shapePredictor(imagemOriginal, rostosDetectados[j]);</strong>
        pontosFaciais.push_back(shape);
    }
    // Exibe a imagem com o contorno dos pontos.
    win.clear_overlay();
    win.set_image(imagemOriginal);
    win.add_overlay(render_face_detections(pontosFaciais));
    // Recorta o rosto da imagem original e a exibe.
    dlib::array rostosRecortados;
    extract_image_chips(imagemOriginal, get_face_chip_details(pontosFaciais), rostosRecortados);
    win_faces.set_image(tile_images(rostosRecortados));
}
</pre>



<p>Observe que para detectar os rostos faciais com a classe dlib::frontal_face_detector, basta utilizar a variável <strong>detector&nbsp;</strong>como fosse uma função, passando a imagem como parâmetro. Ao utilizar o detector como função, serão detectados os rostos e retorna uma lista de retângulos com sua localização.</p>



<p>Com os rostos detectados, basta percorrer cada região dos rostos e chamar a função do <strong>shapePredictor</strong>, para coletar os pontos faciais. Esta função retorna uma lista com todos pontos localizados.</p>



<p>A classe <strong>dlib::image_window</strong> é utilizada para criar uma janela para exibição das imagens. A função render_face_detections é disponibilizada pela própria Dlib a fim de demarcar as regiões do rosto na imagem. E as funções extract_image_chips e get_face_chip_details recortam o rosto a partir dos pontos faciais. Como resultado deste projeto, foi realizado o experimento&nbsp;ilustrado&nbsp;pela Fig 3.&nbsp;</p>



<div class="wp-block-image"><figure class="aligncenter"><a href="http://visaocomputacional.com.br/wp-content/uploads/2021/10/detecao_pontos_faciais_dlib.gif"><img loading="lazy" width="518" height="246" src="http://visaocomputacional.com.br/wp-content/uploads/2021/10/detecao_pontos_faciais_dlib.gif" alt="" class="wp-image-2273"/></a><figcaption>Fig 4. Resultados obtidos com este experimento</figcaption></figure></div>



<p>Espero que esse conteúdo os ajudem na tarefa de identificação de pontos faciais.&nbsp;<br>Caso tenham dúvidas e sugestões de melhorias no post, deixe seu comentário abaixo.</p>



<p>Source:</p>



<p><a href="https://github.com/visaocomputacionalexemplos/experimentos_faciais/tree/main/detectar_pontos_faciais_dlib">https://github.com/visaocomputacionalexemplos/experimentos_faciais/tree/main/detectar_pontos_faciais_dlib</a></p>



<p><strong>Referencias:</strong></p>



<p>Huber, Patrik. (2018). Real-time 3D morphable shape model fitting to monocular in-the-wild videos.</p>



<p>[R] <a href="https://www.pyimagesearch.com/2019/12/16/training-a-custom-dlib-shape-predictor/">Rosebrock, A, Training a custom dlib shape predictor, 2019, acessado em: 18/10/2101</a></p>



<p>[KJ1]&nbsp;<a style="background-color: #ffffff;" href="https://www.csc.kth.se/~vahidk/papers/KazemiCVPR14.pdf">V. Kazemi and J. Sullivan, “One millisecond face alignment with an ensemble of regression trees,”&nbsp;<em>2014 IEEE Conference on Computer Vision and Pattern Recognition</em>, 2014, pp. 1867-1874, doi: 10.1109/CVPR.2014.241.</a></p>
<p>The post <a rel="nofollow" href="https://visaocomputacional.com.br/deteccao-de-pontos-faciais-facemark-com-dlib/">Detecção de pontos faciais (Facemark) com Dlib</a> appeared first on <a rel="nofollow" href="https://visaocomputacional.com.br">Visão Computacional</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
