2013-04-15 16 views
8

Lavorando su Rilevamento visi e riconoscimento, e dopo aver rilevato correttamente un volto, voglio solo ritagliare il viso e salvarlo da qualche parte nell'unità per dare per il codice di riconoscimento. Sto facendo fatica a salvare la regione di interesse come una nuova immagine. Ho alcuni codici online ma è scritto nella versione precedente di OpenCV che utilizza IplImage*. Sto usando OpenCV 2.4.2 che utilizza cv::Mat.
Heeeelp !!!
Pubblicherò i miei codici (riconoscimento dei volti e riconoscimento di per sé) se lo volete.ritaglia e salva ROI come nuova immagine in OpenCV 2.4.2 utilizzando cv :: Mat

#include <cv.h> 
#include <highgui.h> 
#include <math.h> 

// alphablend <imageA> <image B> <x> <y> <width> <height> 
// <alpha> <beta> 

IplImage* crop(IplImage* src, CvRect roi) 
{ 

    // Must have dimensions of output image 
    IplImage* cropped = cvCreateImage(cvSize(roi.width,roi.height), src->depth, src->nChannels); 

    // Say what the source region is 
    cvSetImageROI(src, roi); 

    // Do the copy 
    cvCopy(src, cropped); 
    cvResetImageROI(src); 

    cvNamedWindow("check", 1); 
    cvShowImage("check", cropped); 
    cvSaveImage ("style.jpg" , cropped); 

    return cropped; 
} 

int main(int argc, char** argv) 
{ 
    IplImage *src1, *src2; 

    CvRect myRect; 

    // IplImage* cropped ; 
    src1=cvLoadImage(argv[1],1); 
    src2=cvLoadImage(argv[2],1); 

    { 
    int x = atoi(argv[3]); 
    int y = atoi(argv[4]); 
    int width = atoi(argv[5]); 
    int height = atoi(argv[6]); 

    double alpha = (double)atof(argv[7]); 
    double beta = (double)atof(argv[8]); 

    cvSetImageROI(src1, cvRect(x,y,width,height)); 
    cvSetImageROI(src2, cvRect(100,200,width,height)); 

    myRect = cvRect(x,y,width,height) ; 

    cvAddWeighted(src1, alpha, src2, beta,0.0,src1); 

    cvResetImageROI(src1); 
    crop (src1 , myRect); 

    cvNamedWindow("Alpha_blend", 1); 
    cvShowImage("Alpha_blend", src1); 

    cvWaitKey(0); 
    } 

    return 0; 
} 

Grazie. Peace

+1

Nella cartella tutorial opencv è presente un codice sul rilevamento del volto. Considera quello. Dovrai usare 'cv :: imwrite' per salvare il file. – Acorbe

+0

Hai ancora il codice di riconoscimento, ritaglio e rilevamento? Ho lo stesso identico progetto! –

risposta

23

Utilizzare gli oggetti cv::Mat renderà il codice notevolmente più semplice. Supponendo che il volto rilevato consiste in un rettangolo chiamato faceRect di tipo cv::Rect, tutto quello che dovete digitare per ottenere una versione ritagliata è:

cv::Mat originalImage; 
cv::Rect faceRect; 
cv::Mat croppedFaceImage; 

croppedFaceImage = originalImage(faceRect).clone(); 

O in alternativa:

originalImage(faceRect).copyTo(croppedImage); 

Questo crea un cv::Mat oggetto temporaneo (senza copiare i dati) dal rettangolo che fornisci. Quindi, i dati reali vengono copiati sul nuovo oggetto tramite il metodo clone o copy.

+0

Ho già fatto il ritaglio con IplImage *, quello che voglio fare è salvare tutte le facce ritagliate separatamente e come una nuova immagine sul disco rigido del mio computer. L'obiettivo di salvare queste immagini è nutrire il loro percorso per un altro riconoscimento codice.Il disagio per me qui è, dopo aver rilevato più facce, come assegnare un nome particolare per ogni volto rilevato (usando cvNamedWindow()) e quindi salvare queste immagini, richiamando e inoltrando il percorso di queste immagini salvate al codice di riconoscimento. – Sisay

Problemi correlati