Utilizando a API OpenCV 2.x no Python

Enquanto este post é escrito, a versão do OpenCV é 2.4.6.0. Mas não se assuste se ao ler este post, a versão atual já tenha saltado algumas releases.

A verdade é que anda difícil acompanhar as diversas versões do OpenCV, já que as coisas andam bem dinâmicas com esta biblioteca de processamento de imagens. Infelizmente, as atualizações demoram a chegar aos repositórios do Ubuntu e o jeito é se conformar em utilizar versões mais antigas, ou ficar craque em compilar o OpenCV a cada novo release.

Após importantes mudanças na API, incluindo as implementações para Python e Android e após várias reestruturações da homepage, a documentação da API tem deixado a desejar, principalmente para quem vem utilizando o OpenCV 2.x no Python.

Tenho gasto bastante tempo tentando descobrir como definir estruturas de dados que são comumente utilizadas no OpenCV mas cuja definição não estão devidamente documentadas para o Python. A boa notícia é que em geral as estruturas são muito fáceis de serem definidas e utilizadas, se comparadas à interface C++.

No meu mundo ideal, cheios de pôneis cor-de-rosa, eu certamente me candidataria a ser colaboradora para escrita do manual de referência do OpenCV, mas enquanto luto para administrar o tempo do mundo real, segue abaixo uma lista de coisas que descobri na minha peregrinação diária.

Esta lista também será dinâmica e atualizada sempre que eu tiver perdido bastante tempo para descobrir algo novo. Comentários, como sempre, são muito benvindos.

1) Sistema de cores das imagens lidas utilizando a função cv2.imread

Para ler uma imagem no Python, utilizando a API OpenCV 2.x é bem fácil:

import cv2
im=cv2.imread("arquivo_da_imagem")

Neste caso, a imagem lida será retornada com dimensões MxN (se for uma imagem grayscale) ou MxNx3 (se for uma imagem colorida), onde M é o número de pixels correspondente à altura da imagem (M linhas) e  N é o número de pixels correspondente à largura da imagem (N colunas).

MAS ATENÇÃO! A ordem dos planos de cores da imagem não é RGB e sim BGR. Ou seja, ao acessar, por exemplo, o pixel im[100,200,0] de uma imagem colorida você estará lendo o valor do pixel no plano Blue e não no Red.

2) RotatedRect ou CVBox2D

No OpenCV um retângulo rotacionado, ou RotatedRect, é definido pelo seu centro, sua largura e altura e o ângulo em GRAUS.

Esta estrutura é utilizada, por exemplo, em algumas funções de desenho como, por exemplo, cv2.ellipse.

Para definir esta estrutura no Python, utilize a seguinte sintaxe:

box=((centro_x,centro_y),(largura,altura),angulo_graus)

3) Definindo uma cor

Em algumas funções, é solicitado que o usuário defina uma cor.

Exemplo:

Python: cv2.circle(img, center, radius, color[, thickness[, lineType[, shift]]]) → None

Neste caso a cor deve definida utilizando a notação de tupla, definindo-se os valores para os planos R, G e B.
Exemplos:
Vermelho: (255,0,0)
Azul: (0,0,255)

4) Definindo um conjunto de pontos.

Algumas funções exigem que o usuário forneça um conjunto de “n” pontos. É o caso, por exemplo, de funções como cv2.fillConvexPoly e cv2.fillPoly.

Nestes casos, o parâmetro “points” deve ser um array de dimensões (n,2).

Por exemplo, se n=4.

import numpy as np
points=np.asarray([[x1,y1],[x2,y2],[x3,y3],[x4,y4]])
Anúncios

Deixe seu comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s