{"id":659,"date":"2014-10-01T15:00:54","date_gmt":"2014-10-01T12:00:54","guid":{"rendered":"http:\/\/www.galirows.com.br\/meublog\/opencv-python\/?page_id=659"},"modified":"2014-11-10T15:29:49","modified_gmt":"2014-11-10T12:29:49","slug":"reconhecimento-face","status":"publish","type":"page","link":"http:\/\/www.galirows.com.br\/meublog\/opencv-python\/opencv2-python27\/capitulo2-deteccao\/reconhecimento-face\/","title":{"rendered":"2.2 &#8211; Reconhecimento de face com Python e OpenCV"},"content":{"rendered":"<p>Explica\u00e7\u00e3o sobre os cascade classifier&#8230;.<\/p>\n<p>A primeira parte do c\u00f3digo \u00e9 respons\u00e1vel por determinar qual o padr\u00e3o que dever\u00e1 ser utilizado na detec\u00e7\u00e3o. Foi utilizado o arquivo padr\u00e3o (haarcascade_frontalface_default.xml) dispon\u00edvel em\u00a0<a href=\"https:\/\/github.com\/Itseez\/opencv\/tree\/master\/data\/haarcascades\">https:\/\/github.com\/Itseez\/opencv\/tree\/master\/data\/haarcascades<\/a>. O m\u00e9todo\u00a0<em>cv2.CascadeClassifier()<\/em> \u00e9 respons\u00e1vel por abrir o classificador.<\/p>\n<p>Em seguida \u00e9 criada uma inst\u00e2ncia da webcam e j\u00e1 dentro do la\u00e7o de repeti\u00e7\u00e3o \u00e9 capturada uma imagem da webcam. Na linha 10 \u00e9 feito um espelhamento da imagem pois ela pode estar vindo invertida (voc\u00ea vira a cabe\u00e7a para a esquerda mas na imagem capturada a cabe\u00e7a vira para a direita), sendo uma instru\u00e7\u00e3o opcional.<\/p>\n<p>A detec\u00e7\u00e3o realmente acontece no uso da fun\u00e7\u00e3o\u00a0<em>detectMultiScale(). Os par\u00e2metros necess\u00e1rios para esse m\u00e9todo s\u00e3o:<\/em><\/p>\n<ul>\n<li>Esse m\u00e9todo espera como par\u00e2metro a imagem onde deve ser procurado a ocorr\u00eancia do padr\u00e3o vinculado.<\/li>\n<li>O segundo\u00a0par\u00e2metro define quantos vizinhos cada candidato a ret\u00e2ngulo deve ter para ser considerado. Em s\u00edntese, quanto maior o valor mais seguro ser\u00e1\u00a0a identifica\u00e7\u00e3o da face, evitando marcar coisas que n\u00e3o s\u00e3o faces\u00a0e\u00a0que acabam sendo marcadas, tamb\u00e9m pode fazer uma face verdadeira n\u00e3o ser reconhecida por problemas de ilumina\u00e7\u00e3o e oclus\u00e3o parcial.<\/li>\n<li>O terceiro e quarto par\u00e2metros especificam m\u00ednimo e m\u00e1ximo que um rosto pode ter na captura. Quanto maior for o valor do tamanho m\u00ednimo e menor for a rela\u00e7\u00e3o com o valor m\u00e1ximo, mais rapidamente o algoritmo finalizar\u00e1 o processo, mas em compensa\u00e7\u00e3o isso definir\u00e1 o qu\u00e3o pr\u00f3ximo ou distante uma pessoa poder\u00e1 estar da webcam.<\/li>\n<\/ul>\n<p>A fun\u00e7\u00e3o\u00a0<em>detectMultiScale() <\/em>retornar\u00e1 uma lista de ret\u00e2ngulos onde foram identificadas faces\u00a0e nas\u00a0linhas 21 e 22 \u00e9 percorrido essa lista e utilizado os par\u00e2metros da detec\u00e7\u00e3o para desenhar ret\u00e2ngulos que estar\u00e3o posicionados onde foram identificadas as faces. Como par\u00e2metros para a fun\u00e7\u00e3o <em>cv2.rectangle()<\/em> \u00e9 informada a imagem que vai receber o ret\u00e2ngulo, o ponto inicial onde o ret\u00e2ngulo ser\u00e1 desenhado, o ponto final, a cor (com valores para RGB) e a espessura da linha que ser\u00e1 desenhada.<\/p>\n<pre class=\"lang:python decode:true \">import cv2\r\n\r\narqCasc = 'haarcascade_frontalface_default.xml'\r\nfaceCascade = cv2.CascadeClassifier(arqCasc)\r\n\r\nwebcam = cv2.VideoCapture(0)  #instancia o uso da webcam\r\n\r\nwhile True:\r\n    s, imagem = webcam.read() #pega efeticamente a imagem da webcam\r\n    imagem = cv2.flip(imagem,180) #espelha a imagem\r\n\r\n    faces = faceCascade.detectMultiScale(\r\n        imagem,\r\n        minNeighbors=5,\r\n        minSize=(30, 30),\r\n\tmaxSize=(200,200)\r\n    )\r\n\r\n    # Desenha um ret\u00e2ngulo nas faces detectadas\r\n    for (x, y, w, h) in faces:\r\n        cv2.rectangle(imagem, (x, y), (x+w, y+h), (0, 255, 0), 2)\r\n\r\n    cv2.imshow('Video', imagem) #mostra a imagem captura na janela\r\n\r\n    #o trecho seguinte \u00e9 apenas para parar o c\u00f3digo e fechar a janela\r\n    if cv2.waitKey(1) &amp; 0xFF == ord('q'):\r\n        break\r\n\r\nwebcam.release() #dispensa o uso da webcam\r\ncv2.destroyAllWindows() #fecha todas a janelas abertas<\/pre>\n<p>O final restante do c\u00f3digo \u00e9 respons\u00e1vel por mostrar a captura em uma janela e finalizar o la\u00e7o de repeti\u00e7\u00e3o quando for pressionada a letra &#8216;q&#8217;. Ao encerrar o la\u00e7o de repeti\u00e7\u00e3o \u00e9 liberado o uso da webcam e tamb\u00e9m fechada todas as janelas que foram abertas (no caso do algoritmo, a \u00fanica janela aberta).<\/p>\n<p>MOSTRAR V\u00cdDEO COM OS RESULTADOS<\/p>\n<p>LINKAR ARTIGO SOBRE DETE\u00c7\u00c3O DE QUALQUER OBJETO<\/p>\n<p><strong>Refer\u00eancias<\/strong><\/p>\n<p><a href=\"https:\/\/realpython.com\/blog\/python\/face-recognition-with-python\/#installing-opencv\">https:\/\/realpython.com\/blog\/python\/face-recognition-with-python\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Explica\u00e7\u00e3o sobre os cascade classifier&#8230;. A primeira parte do c\u00f3digo \u00e9 respons\u00e1vel por determinar qual o padr\u00e3o que dever\u00e1 ser utilizado na detec\u00e7\u00e3o. Foi utilizado o arquivo padr\u00e3o (haarcascade_frontalface_default.xml) dispon\u00edvel em\u00a0https:\/\/github.com\/Itseez\/opencv\/tree\/master\/data\/haarcascades. O m\u00e9todo\u00a0cv2.CascadeClassifier() \u00e9 respons\u00e1vel por abrir o classificador. Em &hellip; <a href=\"http:\/\/www.galirows.com.br\/meublog\/opencv-python\/opencv2-python27\/capitulo2-deteccao\/reconhecimento-face\/\">Continue lendo <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":652,"menu_order":2,"comment_status":"open","ping_status":"closed","template":"onecolumn-page.php","meta":{"footnotes":""},"class_list":["post-659","page","type-page","status-publish","hentry"],"aioseo_notices":[],"_links":{"self":[{"href":"http:\/\/www.galirows.com.br\/meublog\/opencv-python\/wp-json\/wp\/v2\/pages\/659","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.galirows.com.br\/meublog\/opencv-python\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"http:\/\/www.galirows.com.br\/meublog\/opencv-python\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"http:\/\/www.galirows.com.br\/meublog\/opencv-python\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.galirows.com.br\/meublog\/opencv-python\/wp-json\/wp\/v2\/comments?post=659"}],"version-history":[{"count":2,"href":"http:\/\/www.galirows.com.br\/meublog\/opencv-python\/wp-json\/wp\/v2\/pages\/659\/revisions"}],"predecessor-version":[{"id":697,"href":"http:\/\/www.galirows.com.br\/meublog\/opencv-python\/wp-json\/wp\/v2\/pages\/659\/revisions\/697"}],"up":[{"embeddable":true,"href":"http:\/\/www.galirows.com.br\/meublog\/opencv-python\/wp-json\/wp\/v2\/pages\/652"}],"wp:attachment":[{"href":"http:\/\/www.galirows.com.br\/meublog\/opencv-python\/wp-json\/wp\/v2\/media?parent=659"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}