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.