{"id":588,"date":"2014-09-29T13:11:27","date_gmt":"2014-09-29T16:11:27","guid":{"rendered":"http:\/\/www.galirows.com.br\/meublog\/?p=588"},"modified":"2014-10-01T10:10:03","modified_gmt":"2014-10-01T13:10:03","slug":"basico-opencv-python-video-webcam","status":"publish","type":"post","link":"http:\/\/www.galirows.com.br\/meublog\/blog\/basico-opencv-python-video-webcam\/","title":{"rendered":"B\u00e1sico do OpenCV com Python \u2013 mostrar v\u00eddeo e webcam"},"content":{"rendered":"<p>A captura de v\u00eddeos ou de imagem da webcam \u00e9 realizada de forma similar. Iniciarei explicando a captura da imagem da webcam. O tutorial tamb\u00e9m mostra uma manipula\u00e7\u00e3o simples da imagem capturada, fazendo algo baseado no tutorial visto no\u00a0<a title=\"B\u00e1sico do OpenCV com Python \u2013 mostrar imagem\" href=\"http:\/\/www.galirows.com.br\/meublog\/blog\/basico-opencv-python-mostrar-imagem\/\" target=\"_blank\">B\u00e1sico do OpenCV com Python \u2013 mostrar imagem<\/a>.<\/p>\n<p style=\"text-align: center;\"><strong><span style=\"color: #ff6600;\">Esse tutorial pode estar desatualizado. Encontre a vers\u00e3o revisada em meu blog dedicado ao tema <a style=\"color: #ff6600;\" href=\"http:\/\/www.galirows.com.br\/meublog\/opencv-python\/capitulo1-basico\/1-2-mostrar-webcam-e-video\/\" target=\"_blank\">clicando aqui<\/a>.<\/span><\/strong><\/p>\n<p><!--more--><\/p>\n<p>O c\u00f3digo a seguir inicia com a importa\u00e7\u00e3o da OpenCV (linha 1) e posterior instancia\u00e7\u00e3o de um objeto de captura de v\u00eddeo. Ao\u00a0m\u00e9todo <em>VideoCapture()<\/em> foi informado o valor zero, que corresponde a uma webcam. Se voc\u00ea tiver mais de uma webcam conectada, pode ser necess\u00e1rio testar qual \u00e9 a sua webcam identificada pelo n\u00famero zero e alterar o valor\u00a0sequencialmente\u00a0para encontrar a webcam que se deseja utilizar na captura. Com uma \u00fanica webcam, o valor zero ir\u00e1 funcionar.<\/p>\n<p>O que a webcam realiza \u00e9 a captura de uma imagem (tamb\u00e9m chamado de frame de imagem) por cada instante de tempo. Por exemplo, se uma webcam adquire imagens a 20 FPS (frames por segundo), significa que a cada segundo 20 imagens s\u00e3o capturadas. A captura do v\u00eddeo ent\u00e3o consiste em capturar essas imagens e ir mostrando cada uma dessas imagens. Sendo assim o c\u00f3digo especifica uma estrutura de repeti\u00e7\u00e3o com condi\u00e7\u00e3o que gerar\u00e1 uma repeti\u00e7\u00e3o infinita e a cada repeti\u00e7\u00e3o \u00e9 lido uma imagem da webcam (linha 6) e em seguida (linha 7) \u00e9 mostrada a imagem capturada em uma janela de exibi\u00e7\u00e3o (igual mostrar uma imagem lida, conforme visto no <a title=\"B\u00e1sico do OpenCV com Python \u2013 mostrar imagem\" href=\"http:\/\/www.galirows.com.br\/meublog\/blog\/basico-opencv-python-mostrar-imagem\/\" target=\"_blank\">tutorial anterior<\/a>).<\/p>\n<p>As linhas 9, 10 e 11 s\u00e3o respons\u00e1veis por fazer para a repeti\u00e7\u00e3o gerada pelo la\u00e7o <em>while<\/em>, quando for pressionada a tecla &#8220;esc&#8221; do teclado. Para descobrir o c\u00f3digo para outras teclas, utilize <a title=\"Mostrar qual tecla foi pressionada\" href=\"http:\/\/www.galirows.com.br\/meublog\/blog\/tecla-pressionada-opencv-python\/\" target=\"_blank\">esse script<\/a>.<\/p>\n<p>Por fim, as duas \u00faltimas linhas s\u00e3o respons\u00e1veis por liberar a webcam e fechar todas as janelas abertas pelo script (no caso, apenas uma).<\/p>\n<pre class=\"lang:python decode:true\">import cv2\r\n\r\ncaptura = cv2.VideoCapture(0)\r\n\r\nwhile(1):\r\n    ret, frame = captura.read()\r\n    cv2.imshow(\"Video\", frame)\r\n   \r\n    k = cv2.waitKey(30) &amp; 0xff\r\n    if k == 27:\r\n        break\r\n\r\ncaptura.release()\r\ncv2.destroyAllWindows()<\/pre>\n<p>Caso o objetivo seja exibir\/utilizar um v\u00eddeo ao inv\u00e9s da captura da webcam, a \u00fanica modifica\u00e7\u00e3o est\u00e1 em informar o endere\u00e7amento do v\u00eddeo no lugar do identificador da webcam. Substituindo a linha 3 pela especifica\u00e7\u00e3o a seguir faz com que esse v\u00eddeo seja utilizado (considerando que o v\u00eddeo est\u00e1 no mesmo diret\u00f3rio do script.<\/p>\n<pre class=\"striped:false marking:false ranges:false nums:false nums-toggle:false wrap-toggle:false lang:python decode:true\">captura = cv2.VideoCapture(\"video.avi\")<\/pre>\n<p style=\"text-align: right; padding-left: 150px;\">Utilizar um v\u00eddeo no lugar da webcam pode \u00a0ser \u00fatil para testes repetitivos, dispensando ficar realizando uma sequencia de testes.<\/p>\n<h4 style=\"text-align: left;\">Gravando o v\u00eddeo<\/h4>\n<p style=\"text-align: left;\"><span style=\"color: #ff6600;\">* falta fazer<\/span><\/p>\n<h4 style=\"text-align: left;\">Modificando a captura<\/h4>\n<p style=\"text-align: left;\">O c\u00f3digo a seguir apenas adiciona 3 novas instru\u00e7\u00f5es (linhas 8, 9 e 10) a captura vista anteriormente. O que essas instru\u00e7\u00f5es fazem \u00e9 pegar as cores do\u00a0pixel na coordenada 200, 200 (linha 8)\u00a0e depois utilizar essa cor para preencher um ret\u00e2ngulo que \u00e9 mostrado no canto superior esquerdo (atrav\u00e9s da instru\u00e7\u00e3o da linha 10). A linha 9 \u00e9 respons\u00e1vel apenas por desenhar um pequeno quadrado vermelho de onde ser\u00e1 obtida a cor, de forma apenas a orientar o usu\u00e1rio.<\/p>\n<pre class=\"lang:python mark:8-10 decode:true\">import cv2\r\n\r\ncaptura = cv2.VideoCapture(0)\r\n\r\nwhile(1):\r\n    ret, frame = captura.read()\r\n\r\n    (b, g, r) = frame[200, 200]\r\n    frame[198:202, 198:202] = (0, 0, 255)\r\n    frame[10:90, 10:90] = (b, g, r)\r\n       \r\n    cv2.imshow('frame',frame)\r\n   \r\n    k = cv2.waitKey(30) &amp; 0xff\r\n    if k == 27:\r\n        break\r\n\r\ncaptura.release()\r\ncv2.destroyAllWindows()<\/pre>\n<p>Um frame capturado de um v\u00eddeo ou da webcam \u00e9 simplesmente uma imagem e essa pode ser modificada livremente\u00a0como qualquer imagem.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>A captura de v\u00eddeos ou de imagem da webcam \u00e9 realizada de forma similar. Iniciarei explicando a captura da imagem da webcam. O tutorial tamb\u00e9m mostra uma manipula\u00e7\u00e3o simples da imagem capturada, fazendo algo baseado no tutorial visto no\u00a0B\u00e1sico do OpenCV com Python \u2013 mostrar imagem. Esse tutorial pode estar desatualizado. Encontre a vers\u00e3o revisada [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":616,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[19],"tags":[21,20],"class_list":["post-588","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-visao-computacional","tag-opencv","tag-python"],"aioseo_notices":[],"amp_enabled":true,"_links":{"self":[{"href":"http:\/\/www.galirows.com.br\/meublog\/wp-json\/wp\/v2\/posts\/588","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.galirows.com.br\/meublog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.galirows.com.br\/meublog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.galirows.com.br\/meublog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.galirows.com.br\/meublog\/wp-json\/wp\/v2\/comments?post=588"}],"version-history":[{"count":7,"href":"http:\/\/www.galirows.com.br\/meublog\/wp-json\/wp\/v2\/posts\/588\/revisions"}],"predecessor-version":[{"id":618,"href":"http:\/\/www.galirows.com.br\/meublog\/wp-json\/wp\/v2\/posts\/588\/revisions\/618"}],"wp:featuredmedia":[{"embeddable":true,"href":"http:\/\/www.galirows.com.br\/meublog\/wp-json\/wp\/v2\/media\/616"}],"wp:attachment":[{"href":"http:\/\/www.galirows.com.br\/meublog\/wp-json\/wp\/v2\/media?parent=588"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.galirows.com.br\/meublog\/wp-json\/wp\/v2\/categories?post=588"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.galirows.com.br\/meublog\/wp-json\/wp\/v2\/tags?post=588"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}