ruotato di rilevamento del volto

C’è una libreria per il rilevamento di volti che sono stati girati nel piano dell’immagine? O c’è qualche modo in cui potrei usare una cascata per il montaggio verticale di rilevamento del volto con opencv per farlo?

  • hai provato EXIF biblioteca?. Sono sicuro che sarà utile.

 

6 Replies
  1. 9

    Ecco un semplice ho scritto con Python cv2

    Non è il più efficiente della cosa, e si utilizza l’ingenuo modo suggerito da etarion, ma funziona abbastanza bene solo per la normale inclinazione della testa (Non rileva nulla da -40 a 40 inclinazione del capo, che è circa quanto si può inclinare la testa rimanendo in posizione verticale.

    import cv2
    from math import sin, cos, radians
    
    camera =  cv2.VideoCapture(0)
    face = cv2.CascadeClassifier("haarcascade_frontalface_alt2.xml")
    
    settings = {
        'scaleFactor': 1.3, 
        'minNeighbors': 3, 
        'minSize': (50, 50), 
        'flags': cv2.cv.CV_HAAR_FIND_BIGGEST_OBJECT|cv2.cv.CV_HAAR_DO_ROUGH_SEARCH
    }
    
    def rotate_image(image, angle):
        if angle == 0: return image
        height, width = image.shape[:2]
        rot_mat = cv2.getRotationMatrix2D((width/2, height/2), angle, 0.9)
        result = cv2.warpAffine(image, rot_mat, (width, height), flags=cv2.INTER_LINEAR)
        return result
    
    def rotate_point(pos, img, angle):
        if angle == 0: return pos
        x = pos[0] - img.shape[1]*0.4
        y = pos[1] - img.shape[0]*0.4
        newx = x*cos(radians(angle)) + y*sin(radians(angle)) + img.shape[1]*0.4
        newy = -x*sin(radians(angle)) + y*cos(radians(angle)) + img.shape[0]*0.4
        return int(newx), int(newy), pos[2], pos[3]
    
    while True:
        ret, img = camera.read()
    
        for angle in [0, -25, 25]:
            rimg = rotate_image(img, angle)
            detected = face.detectMultiScale(rimg, **settings)
            if len(detected):
                detected = [rotate_point(detected[-1], img, -angle)]
                break
    
        # Make a copy as we don't want to draw on the original image:
        for x, y, w, h in detected[-1:]:
            cv2.rectangle(img, (x, y), (x+w, y+h), (255,0,0), 2)
    
        cv2.imshow('facedetect', img)
    
        if cv2.waitKey(5) != -1:
            break
    
    cv2.destroyWindow("facedetect")
    
  2. 3

    Personalmente, non so di una biblioteca. Ma, quello che posso dire è, utilizzare un occhio di rilevamento Haar A Cascata, e tracciare una linea tra i due occhi. Quindi, è possibile utilizzare il atan funzione e trovare l’angolo che la testa è ruotata. (Supponendo che la persona ha entrambi gli occhi sullo stesso livello orizzontale quando la testa è ruotata)

    deg = atan( (leftEye.y - rightEye.y) /(leftEye.x - rightEye.x) )
    

    Una volta che si ottiene questo angolo, ruotare l’immagine negativa della deg gradi e si dovrebbe avere un volto che non può essere rilevata con la Haar Cascate.

    • Qualche idea per il rilevamento del sinistro/destro occhio separatamente? Ho provato haarcascade_lefteye_2splits ma sembra di rilevare sia a destra che a sinistra allo stesso tempo (per lo più).
  3. 2

    Ingenuo modo:

    • Generare un elenco di punti di vista (per esempio, da -170 a 180 10 gradi)
    • Per ogni angolo n in elenco:
      • Ruotare l’immagine di n gradi
      • Eseguire face detector sull’immagine ruotata
      • Calcolare la posizione dei volti rilevati nell’immagine originale (annulla la rotazione)
    • Eseguire non di soppressione massima sul aderito risultato da tutte le angolazioni (sarà probabilmente ottenere di più rilevamenti vicini angoli)
    • questo rende il rilevamento molto lento e restituisce molto di più falsi positivi, ma è probabilmente l’unico modo per rendere il Haar di rilevamento tipo di rotazione-invariante…
    • questa non è una buona soluzione. occhi sulla testa inclinata non essere rilevato, e avete bisogno di più di una risoluzione più grande di zoom per rilevare gli occhi di confronto di testa. scommessa migliore è quello di addestrare il proprio nn con le foto sono sfocati
  4. 1

    Metodi per il rilevamento del viso, in base al colore istogramma sono indipendenti faccia orientamento.

    • quali sono i metodi?
  5. 1

    Ho avuto a che fare con lo stesso problema di rilevamento del volto per non immagini frontali. Provare a utilizzare Multi Task CNN. E ‘ la migliore soluzione per il rilevamento del viso e l’allineamento. Esso è in grado di affrontare problemi come la posa, l’illuminazione, l’occlusione.

    La carta è disponibile a Link. Il codice è disponibile su GitHub a Link. Ho usato python attuazione e i risultati sono eccezionali. Anche se il codice è un po ‘ lento, se l’immagine ha un sacco di facce.

    Anche se, se si vuole rispettare la libreria OpenCV, quindi un profondo e nuovo modello di apprendimento per il riconoscimento dei volti è stato aggiunto alla libreria OpenCV. I risultati non sono buoni come Multi Task CNN. C’è un’implementazione di OpenCV in Profondità il Modello di Apprendimento per il Rilevamento del Viso a pyimagesearch Link

  6. 0

    è possibile utilizzare un sacchetto di parole/borsa di funzioni con il metodo di vincoli di AAM,ASM metodi.
    ma possono anche non dare la soluzione ottimale converge non al massimo globale.

    anche haar-like-funzionalità sono solo un insieme di caratteristiche e si può usare la rotazione invariante caratteristiche e metterlo poi in adaboost classifer.

Lascia un commento