{"id":655,"date":"2014-10-01T14:59:22","date_gmt":"2014-10-01T11:59:22","guid":{"rendered":"http:\/\/www.galirows.com.br\/meublog\/opencv-python\/?page_id=655"},"modified":"2014-11-10T15:29:57","modified_gmt":"2014-11-10T12:29:57","slug":"deteccao-movimento","status":"publish","type":"page","link":"http:\/\/www.galirows.com.br\/meublog\/opencv-python\/opencv2-python27\/capitulo2-deteccao\/deteccao-movimento\/","title":{"rendered":"2.1 &#8211; Detec\u00e7\u00e3o de movimento com Python e OpenCV"},"content":{"rendered":"<p>Esse tutorial objetiva mostrar como detectar movimentos usando Python\u00a0e\u00a0OpenCV. A detec\u00e7\u00e3o \u00e9 feita atrav\u00e9s da compara\u00e7\u00e3o de imagens capturadas da webcam.<\/p>\n<p>O primeiro passo est\u00e1 em capturar e mostrar a imagem da webcam e isso \u00e9 feito atrav\u00e9s do c\u00f3digo abaixo. O c\u00f3digo instancia o uso da webcam e cria uma janela para que posteriormente seja inserida as capturas da webcam nessa janela. No la\u00e7o de repeti\u00e7\u00e3o se pega uma imagem da webcam e depois se mostra a imagem na janela. Para sair da aplica\u00e7\u00e3o foi configurado o uso da tecla &#8216;q&#8217;.<\/p>\n<pre class=\"lang:python decode:true\">import cv2\r\nwebcam   = cv2.VideoCapture(0) #instancia o uso da webcam\r\njanela   = \"Tela de captura\"\r\ncv2.namedWindow(janela, cv2.CV_WINDOW_AUTOSIZE) #cria uma janela\r\nwhile True:\r\n  s, imagem = webcam.read() #pega efeticamente a imagem da webcam\r\n  cv2.imshow(janela,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    cv2.destroyWindow(janela)\r\n    break\r\n\r\nprint \"Fim\"\r\n<\/pre>\n<p>O princ\u00edpio da identifica\u00e7\u00e3o de movimentos \u00e9 capturar um frame e compar\u00e1-lo com o frame anterior subtraindo os pixels de uma imagem da outra. Sendo assim, todas as imagem que estiverem iguais ir\u00e3o se anular. Como as imagem que estar\u00e3o iguais s\u00e3o as que n\u00e3o mudaram de lugar, isso acaba mostrando apenas os locais onde alguma mudan\u00e7a (movimento) aconteceu.<\/p>\n<p>A OpenCV oferece uma fun\u00e7\u00e3o que subtrai duas imagens, \u00e9 a\u00a0<em>absdiff()<\/em>. A fun\u00e7\u00e3o recebe dois array (a imagem \u00e9 um array bidimensional) e retorna sua diferen\u00e7a absoluta. Tamb\u00e9m usaremos a fun\u00e7\u00e3o <em>bitwise_and()<\/em> para alcan\u00e7ar o resultado final na diferencia\u00e7\u00e3o das imagens. Esses dois m\u00e9todos est\u00e3o inseridos na fun\u00e7\u00e3o <em>calculaDiferenca()<\/em> do c\u00f3digo a seguir.<\/p>\n<p>Al\u00e9m da fun\u00e7\u00e3o adicionada no c\u00f3digo foram adicionadas as linhas 11,12 e 13\u00a0que criam vari\u00e1veis para armazenar 3 frames capturados e que ser\u00e3o utilizados na compara\u00e7\u00e3o da fun\u00e7\u00e3o criada. Inicialmente os tr\u00eas frames ter\u00e3o a mesma imagem, se diferenciamento a partir da terceira captura.\u00a0S\u00e3o armazenados o \u00faltimo frame (frame atual), o pen\u00faltimo frame e o antepen\u00faltimo frame. Veja que a captura da webcam \u00e9 alterada para uma imagem em preto e branco atrav\u00e9s da fun\u00e7\u00e3o cv2.cvtColor() com o segundo\u00a0par\u00e2metro\u00a0cv2.COLOR_RGB2GRAY.<\/p>\n<p>Foram utilizadas as compara\u00e7\u00f5es com 3 frames, mas seria poss\u00edvel utilizar apenas os dois \u00faltimo frames, mas com os 3 frames o resultado \u00e9 melhor. Caso opte por utilizar apenas 2 frames, a fun\u00e7\u00e3o <em>calculaDiferenca() \u00a0<\/em>pode calcular apenas o valor de d2 e retorn\u00e1-lo.<\/p>\n<p>J\u00e1 no la\u00e7o de repeti\u00e7\u00e3o est\u00e1 sendo feita a atualiza\u00e7\u00e3o dos 3 frames de imagem. O antepen\u00faltimo frame passa a conter a imagem do\u00a0pen\u00faltimo, assim como o pen\u00faltimo passa a conter o frame que era o atual e o frame atual \u00e9 atualizado com uma nova imagem capturada da webcam.<\/p>\n<pre class=\"lang:python decode:true\">import cv2\r\n\r\ndef calculaDiferenca(img1, img2, img3):\r\n  d1 = cv2.absdiff(img3, img2)\r\n  d2 = cv2.absdiff(img2, img1)\r\n  return cv2.bitwise_and(d1, d2)\r\n\r\nwebcam = cv2.VideoCapture(0) #instancia o uso da webcam\r\njanela = \"Tela de captura\"\r\ncv2.namedWindow(janela, cv2.CV_WINDOW_AUTOSIZE) #cria uma janela\r\n\r\n#faz a leitura inicial de imagens\r\nultima        = cv2.cvtColor(webcam.read()[1], cv2.COLOR_RGB2GRAY)\r\npenultima     = ultima\r\nantepenultima = ultima\r\n\r\nwhile True:\r\n  antepenultima = penultima\r\n  penultima     = ultima\r\n  ultima        = cv2.cvtColor(webcam.read()[1], cv2.COLOR_RGB2GRAY)\r\n\r\n  cv2.imshow(janela, calculaDiferenca(antepenultima,penultima,ultima))\r\n  \r\n  if cv2.waitKey(1) &amp; 0xFF == ord('q'):\r\n    cv2.destroyWindow(janela)\r\n    break\r\n\r\nprint \"Fim\"\r\n<\/pre>\n<p>FAZER UM VIDEO PARA MOSTRAR COMO FICOU<\/p>\n<p>Para determinar a &#8220;quantidade&#8221; de movimento que est\u00e1 acontecendo \u00e9 poss\u00edvel, dentro do la\u00e7o de repeti\u00e7\u00e3o, mostrar\u00a0uma soma de todos os pixels atrav\u00e9s \u00a0da instru\u00e7\u00e3o <em>sum(sum(imagem))<\/em>. Ao visualizar a diferen\u00e7a nos valores voc\u00ea vai perceber que a diferen\u00e7a n\u00e3o \u00e9 t\u00e3o grande. Isso porque a imagem ficou em escala de cinza e isso dificulta essa identifica\u00e7\u00e3o.\u00a0adicionar uma nova instru\u00e7\u00e3o para aumentar a diferen\u00e7a dos valores.<\/p>\n<p>Altere a fun\u00e7\u00e3o <em>calculaDifereca()<\/em> adicionando a opera\u00e7\u00e3o de<em> threshold()<\/em> da OpenCV. A fun\u00e7\u00e3o espera como primeiro par\u00e2metro a imagem que ser\u00e1 utilizada e em seguida o valor m\u00e1<\/p>\n<p><a href=\"http:\/\/opencvpython.blogspot.com.br\/2013\/05\/thresholding.html\">http:\/\/opencvpython.blogspot.com.br\/2013\/05\/thresholding.html<\/a><\/p>\n<p><a href=\"http:\/\/docs.opencv.org\/modules\/imgproc\/doc\/miscellaneous_transformations.html#threshold\">http:\/\/docs.opencv.org\/modules\/imgproc\/doc\/miscellaneous_transformations.html#threshold<\/a><\/p>\n<pre class=\"lang:python decode:true\">def calculaDiferenca(img1, img2, img3):\r\n  d1 = cv2.absdiff(img3, img2)\r\n  d2 = cv2.absdiff(img2, img1)\r\n  imagem = cv2.bitwise_and(d1, d2)\r\n  s,imagem = cv2.threshold(imagem, 35, 255, cv2.THRESH_BINARY)\r\n  return imagem<\/pre>\n<p>&nbsp;<\/p>\n<p>MOSTRAR GANHOS E DESTAQUE ONDE EST\u00c1 O MOVIMENTO &#8211; vira outro artigo<\/p>\n<p><strong>Refer\u00eancias<\/strong><\/p>\n<p><a href=\"http:\/\/www.steinm.com\/blog\/motion-detection-webcam-python-opencv-differential-images\/\">http:\/\/www.steinm.com\/blog\/motion-detection-webcam-python-opencv-differential-images\/<br \/>\n<\/a><a href=\"http:\/\/docs.opencv.org\/master\/modules\/core\/doc\/operations_on_arrays.html?highlight=absdiff\">http:\/\/docs.opencv.org\/master\/modules\/core\/doc\/operations_on_arrays.html?highlight=absdiff<br \/>\n<\/a><a href=\"http:\/\/opencvpython.blogspot.com.br\/2013\/05\/thresholding.html\">http:\/\/opencvpython.blogspot.com.br\/2013\/05\/thresholding.html<br \/>\n<\/a><a href=\"http:\/\/docs.opencv.org\/modules\/imgproc\/doc\/miscellaneous_transformations.html#threshold\">http:\/\/docs.opencv.org\/modules\/imgproc\/doc\/miscellaneous_transformations.html#threshold<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Esse tutorial objetiva mostrar como detectar movimentos usando Python\u00a0e\u00a0OpenCV. A detec\u00e7\u00e3o \u00e9 feita atrav\u00e9s da compara\u00e7\u00e3o de imagens capturadas da webcam. O primeiro passo est\u00e1 em capturar e mostrar a imagem da webcam e isso \u00e9 feito atrav\u00e9s do c\u00f3digo &hellip; <a href=\"http:\/\/www.galirows.com.br\/meublog\/opencv-python\/opencv2-python27\/capitulo2-deteccao\/deteccao-movimento\/\">Continue lendo <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":652,"menu_order":1,"comment_status":"open","ping_status":"closed","template":"onecolumn-page.php","meta":{"footnotes":""},"class_list":["post-655","page","type-page","status-publish","hentry"],"aioseo_notices":[],"_links":{"self":[{"href":"http:\/\/www.galirows.com.br\/meublog\/opencv-python\/wp-json\/wp\/v2\/pages\/655","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=655"}],"version-history":[{"count":2,"href":"http:\/\/www.galirows.com.br\/meublog\/opencv-python\/wp-json\/wp\/v2\/pages\/655\/revisions"}],"predecessor-version":[{"id":696,"href":"http:\/\/www.galirows.com.br\/meublog\/opencv-python\/wp-json\/wp\/v2\/pages\/655\/revisions\/696"}],"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=655"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}