2010-12-07 5 views
2

Je fais une application qui utilise OpenCV pour analyser la sortie de la caméra iPhone et afficher le résultat sur l'écran. Je sais que l'appareil photo de l'iPhone lit en orientation paysage, il est donc nécessaire de convertir avant d'afficher les résultats sur l'écran. Je me suis dit que je devrais juste redimensionner, faire pivoter -90 degrés et ensuite traduire (tx = largeur de l'image), mais cela ne fonctionne pas. J'ai trouvé un exemple de code en ligne, qui est ci-dessous, mais cela ne fonctionne pas non plus pour une orientation autre que le paysage à gauche.Comment convertir les coordonnées des caméras iPhone pour afficher les coordonnées?

Quelle est la bonne façon de convertir de la vue de la caméra à la vue de l'utilisateur?

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection 
{ 
    //lock the pixel buffer 
    CVImageBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); 
    CVPixelBufferLockBaseAddress(pixelBuffer, 0); 

    //declare variables 
    int bufferHeight = CVPixelBufferGetHeight(pixelBuffer); 
    int bufferWidth = CVPixelBufferGetWidth(pixelBuffer); 

    //a bunch of OpenCV stuff that finds features in an image and 
    // returns a cameraRect 

    //translate to view coordinates 
    float scaleX = 320/(float)bufferHeight; 
    float scaleY = 460/(float)bufferWidth; 
    deviceRect.origin.x = 320 - ((cameraRect.y + cameraRect.height) * scaleX); 
    deviceRect.origin.y =  (cameraRect.x * scaleY); 

    CVPixelBufferUnlockBaseAddress(pixelBuffer, 0); 
} 

//elsewhere 
previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill; 

Edit: En ne fonctionne pas, je veux dire que le rectangle affiché à l'écran ne correspond pas à l'objet apparié qui est visible dans la couche de prévisualisation. Je détecte les visages, et en fonction de l'orientation de l'appareil téléphonique, le dessin tracé sur l'écran est soit un peu ou beaucoup du visage qui est dans la couche de prévisualisation. En mode paysage, deviceRect correspond parfaitement à la face visible.

+0

Vous dites que cela ne fonctionne pas - pouvez-vous fournir des détails sur la façon dont cela ne fonctionne pas? – Greg

Répondre

0
CGRectMake((640-puntos[1])*480/640-135, puntos[0]*320/480+25,5, 5); 

Je fais cette conversion et elle fonctionne plus ou moins.

Questions connexes