Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Dúvida coordenadas

Olá! Para recortar as faces eu utilizei o seguinte código:

for (x,y,w,h) in face1:
    imagem_roi1 = imagem1[x:x+w,y:y+h]

Porém, ao visualizar o recorte, não estava recortando a face. Foi aí que eu percebi que as coordenadas da face (obtida após rodar o classificador) na verdade são [y,x,h,w]. Então eu fiz as alterações e deu certo o recorte das faces:

for (y,x,h,w) in face1:
    imagem_roi1 = imagem1[x:x+w,y:y+h]

Porém, eu fiquei com dúvida sobre o porquê do código desenho do retângulo funcionar com as ordens invertidas e o recorte das imagens não. Saberiam me explicar?

Código para desenho do retângulo (com ordem das coordenadas invertida):

for (x,y,w,h) in face1:
    cv2.rectangle(imagem1_anotada,(x,y),(x+w,y+h), (255,255,0),2)
4 respostas

Olá Vivian, tudo bem?

É possível que algum trecho de código anterior a esses não tenha sido executado corretamente ou esteja diferente, interferindo no recorte da imagem.

Testei o código da solução da atividade e o recorte foi realizado como esperado. Como demonstro no gif abaixo:

gif do notebook com o respectivo código. Há imagens com recortes de rostos.

Portanto, recomendo, verificar se algum trecho de código esteja com dados diferentes e certificar de executar todas as células anteriores.

Espero ter ajudado.

Casos surja alguma dúvida, fico à disposição.

Abraços.

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Olá, não consegui pausar o vídeo para ver os códigos, mas se você usou os mesmos códigos fornecidos em "Ver opinião do instrutor", eu tenho uma dúvida pois:

Para desenhar o retângulo eu utilizei (repare na ordem do x e y no FOR):

for (x,y,w,h) in face1:
    cv2.rectangle(imagem1_anotada,(x,y),(x+w,y+h), (255,255,0),2)

E para recortar as faces (repare na ordem do x e y no FOR):

for (y,x,h,w) in face1:
    imagem_roi1 = imagem1[x:x+w,y:y+h]

Por que se eu usar mesma ordem de x,y que o FOR para desenhar retângulo:

for (x,y,h,w) in face1:
    imagem_roi1 = imagem1[x:x+w,y:y+h]

não funciona? (repara que eu mantive entre colchetes a ordem usual de [x,y] para recortar a imagem.

Olá Vivian, vou contribuir aqui também.

Primeiro, vamos notar que a função de desenhar um retângulo é diferente do slice notation de matrizes. A função de desenho de retângulo espera dois vértices, ou seja, um de cada lado, sendo o primeiro vértice e o vértice oposto.

cv2.rectangle(img, (x1, y1), (x2, y2), color=(255,0,0), thickness=2)

x1,y1 ------
|          |
|          |
|          |
--------x2,y2

Fonte: Stackoverflow

O método detectMultiScale do classificador de cascata de faces também retorna uma lista de retângulos, mas em uma outra notação, a de vértice, comprimento e altura (x,y,w,h). Para desenharmos um retângulo precisamos adaptar essas coordenadas, que ficam como:

cv2.rectangle(img, (x, y), (x+w, y+h), color=(255,0,0), thickness=2)

O recorte de matrizes é uma outra forma de manipulação de dados, que tem o princípio de funcionamento abaixo:

a[start:stop]  # items start through stop-1
a[start:]      # items start through the rest of the array
a[:stop]       # items from the beginning through stop-1
a[:]           # a copy of the whole array

Fonte: Stackoverflow

Para duas matrizes com mais de uma dimensão, cada índice é responsável por uma coordenada, o primeiro por x e o segundo por y: a[x_start:x_stop, y_start:y_stop].

Logo, para obter o recorte de um rosto, precisamos saber os pontos:

x_inicial, x_final y_inicial, y_final

Dadas as coordenadas que temos:

x_inicial =x x_final = x + w (ponto inicial mais seu comprimento)

y_inicial = y y_final = y + h (ponto inicial mais sua altura)

O seu exemplo não deve funcionar pois ao inverter x com y pode ter gerado uma coordenada inválida.

Espero poder ter contribuído!

Abraço.

solução!

Olá, Michel.

Agora compreendi que no recorte da imagem temos: imagem[linha,coluna] = imagem[eixoY, eixoX] = imagem[y:y+h, x:x+w]

Obrigada.