2014-11-28 19 views
7

Sto provando a rilevare i bordi di un biglietto da visita (e disegnarli) con una fotocamera dell'iPhone, usando openCV. Sono nuovo in questo framework, oltre a Computer Vision o C++.iOS rileva i rettangoli dalla fotocamera con openCV

Sto cercando di utilizzare la soluzione spiegato qui: https://stackoverflow.com/a/14123682/3708095, quale progetto GitHub è https://github.com/foundry/OpenCVSquares

Funziona con un'immagine predefinita, ma sto cercando di farlo funzionare con la fotocamera.

Per farlo, sto usando il CvVideoCameraDelegate protocol sua attuazione nel CVViewController.mm come spiegano in http://docs.opencv.org/doc/tutorials/ios/video_processing/video_processing.html come questo:

#ifdef __cplusplus 
-(void)processImage:(cv::Mat &)matImage 
{ 
//NSLog (@"Processing Image"); 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

    matImage = CVSquares::detectedSquaresInImage(matImage, self.tolerance, self.threshold, self.levels, [self accuracy]); 

    UIImage *image = [[UIImage alloc]initWithCVMat:matImage orientation:UIImageOrientationDown]; 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     self.imageView.image = image; 
    }); 
}); 

} 
#endif 

EDIT:

Se lo faccio come questo, mi dà un EXC_BAD_ACCESS ...

Se clonare il matImage prima di elaborarlo, registrandolo, sembra elaborare l'immagine e anche trovare i rettangoli, ma il rettangolo non viene disegnato per l'output dell'immagine per imageView.

cv::Mat temp = matImage.clone();  

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

    UIImage *image = [[UIImage alloc]CVSquares::detectedSquaresInImage(temp, self.tolerance, self.threshold, self.levels, [self accuracy]) 
             orientation:UIImageOrientationDown]; 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     self.imageView.image = image; 
    }); 
}); 

Sono abbastanza sicuro che mi manca qualcosa, probabilmente perché non sto passando correttamente qualche oggetto, puntatore ot di opporsi o giù di lì, e l'oggetto che ho bisogno di essere modificato non è.

In ogni caso, se questo non è l'approccio giusto, vorrei davvero apprezzare un tutorial o un esempio dove fanno qualcosa di simile, sia utilizzando OpenCV o GPUImage (che non hanno familiarità con esso sia) ...

+0

È questo approccio è valido? Dovrei provare qualcos'altro? Grazie! – jdev

risposta

0

Così il soluzione era in realtà piuttosto semplice ...

Invece di cercare di utilizzare matImage per impostare il imageView.image, aveva solo bisogno di trasformare matImage per essere realmente modificato nella IMAGEVIEW dal momento che la CvVideoCamera era già inizializzato con (e collegato a) l'ImageView :

self.videoCamera = [[CvVideoCamera alloc]initWithParentView:self.imageView];

infine la funzione è stata in questo modo:

#ifdef __cplusplus 
-(void)processImage:(cv::Mat &)matImage 
{ 
    matImage = CVSquares::detectedSquaresInImage(matImage, self.angleTolerance, self.threshold, self.levels, self.accuracy); 
} 
#endif 
Problemi correlati