Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Erro de array 1-D a executar o código da aula

Estou recebendo este erro ao executar o código da aula.


ValueError Traceback (most recent call last) Cell In[44], line 60 57 imagem_anotada = imagem_pessoa_seria.copy() 58 imagem_anotada = anotar_marcos_casca_convexa(imagem_anotada, marcos_faciais) ---> 60 valor_olho_esquerdo = aspecto_razao_olhos(marcos_faciais[0][LEFT_EYE]) 61 valor_olho_direito = aspecto_razao_olhos(marcos_faciais[0][RIGHT_EYE])

Cell In[44], line 28, in aspecto_razao_olhos(pontos_olhos) 26 def aspecto_razao_olhos(pontos_olhos): ---> 28 a = dist.euclidean(pontos_olhos[1], pontos_olhos[5]) 29 b = dist.euclidean(pontos_olhos[2], pontos_olhos[4]) 30 c = dist.euclidean(pontos_olhos[0], pontos_olhos[3])

File ~\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\scipy\spatial\distance.py:520, in euclidean(u, v, w) 484 def euclidean(u, v, w=None): 485 """ 486 Computes the Euclidean distance between two 1-D arrays. 487 (...) 518 519 """ --> 520 return minkowski(u, v, p=2, w=w)

File ~\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\scipy\spatial\distance.py:463, in minkowski(u, v, p, w) 413 def minkowski(u, v, p=2, w=None): 414 """ 415 Compute the Minkowski distance between two 1-D arrays. 416 (...) 461 462 """ --> 463 u = _validate_vector(u) 464 v = _validate_vector(v) 465 if p <= 0:

File ~\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\scipy\spatial\distance.py:302, in _validate_vector(u, dtype) 300 if u.ndim == 1: 301 return u --> 302 raise ValueError("Input vector should be 1-D.")

ValueError: Input vector should be 1-D.

O código executado é este aqui:



def pontos_marcos_faciais(imagem):
    retangulos = face_detector(imagem, 1)
    
    if len(retangulos) == 0:
        return None
    
    marcos = []
    
    for ret in retangulos:
        marcos.append(np.matrix([[p.x, p.y] for p in dlib_model_68(imagem,ret).parts()]))
    
    return marcos

def anotar_marcos_faciais(imagem, marcos):
    
    for marco in marcos:
        for idx, ponto in enumerate(marco):
            centro = (ponto[0,0], ponto[0,1])
            cv2.circle(imagem, centro, 3, (255,255,0), -1)
            cv2.putText(imagem, str(idx), centro, cv2.FONT_HERSHEY_SIMPLEX, 0.8,
                       (255,255,255), 2)
    
    return imagem


def aspecto_razao_olhos(pontos_olhos):
    
    a = dist.euclidean(pontos_olhos[1], pontos_olhos[5])
    b = dist.euclidean(pontos_olhos[2], pontos_olhos[4])
    c = dist.euclidean(pontos_olhos[0], pontos_olhos[3])
    
    aspecto_razao = (a + b)/(2.0 * c)
    
    return aspecto_razao

def anotar_marcos_casca_convexa(imagem, marcos):
    retangulos = face_detector(imagem, 1)
    
    if len(retangulos) == 0:
        return None
    
    for idx, ret in enumerate(retangulos):
        marco = marcos[idx]
        
        pontos = cv2.convexHull(marco[LEFT_EYE])
        cv2.drawContours(imagem, [pontos], 0, (0,255,0), 2)
        
        pontos = cv2.convexHull(marco[RIGHT_EYE])
        cv2.drawContours(imagem, [pontos], 0, (0,255,0), 2)
    
    return imagem

imagem_pessoa_seria = cv2.imread("px-man-serious.jpg")
imagem_pessoa_seria = cv2.cvtColor(imagem_pessoa_seria, cv2.COLOR_BGR2RGB)

marcos_faciais = pontos_marcos_faciais(imagem_pessoa_seria)
imagem_anotada = imagem_pessoa_seria.copy()
imagem_anotada = anotar_marcos_casca_convexa(imagem_anotada, marcos_faciais)

valor_olho_esquerdo = aspecto_razao_olhos(marcos_faciais[0][LEFT_EYE])
valor_olho_direito = aspecto_razao_olhos(marcos_faciais[0][RIGHT_EYE])

As definições de variavel estão iguais, ou seja LEFT_EYE = OLHO_ESQUERDO, assim como o detector de face e o classificador.

1 resposta
solução!

Olá Gustavo, tudo bem?

Poderia verificar se o trecho abaixo foi executado? Ele inicializa os valores dos pontos dos olhos.

FACE = list(range(17, 68))
FACE_COMPLETA = list(range(0, 68))
LABIO = list(range(48, 61))
SOMBRANCELHA_DIRETA = list(range(17, 22))
SOMBRANCELHA_ESQUERDA = list(range(22, 27))
OLHO_DIREITO = list(range(36,42))
OLHO_ESQUERDO = list(range(42,48))
NARIZ = list(range(27,35))
MANDIBULA = list(range(0,17))

No seu caso adapte para os nomes que você definiu.

Abraço.