2013-04-15 18 views
8

Arbeiten auf Gesichtserkennung und Anerkennung, und nach einem Gesicht erfolgreich Erkennen, ich will nur das Gesicht beschneiden und es irgendwo im Laufwerk speichern zu geben es für den Erkennungscode. Es fällt mir schwer, die Region of Interest als neues Image zu speichern. Ich habe einige Codes online, aber es ist in der vorherigen Version von OpenCV geschrieben, die IplImage* verwendet. Ich verwende OpenCV 2.4.2, das cv::Mat verwendet.
Heeeelp !!!
Ich werde meine Codes (Gesichtserkennung und Erkennung per se) veröffentlichen, wenn Sie es wollen.Ernte und Speicher ROI als neues Bild in OpenCV 2.4.2 cv mit :: 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; 
} 

Danke. Frieden

+1

Im opencv Tutorial Ordner dort ein Code über die Gesichtserkennung. Betrachten Sie diesen einen. Sie müssen 'cv :: imwrite' verwenden, um die Datei zu speichern. – Acorbe

+0

Haben Sie immer noch den Code zum Erkennen, Beschneiden und Erkennen? Ich habe genau das gleiche Projekt! –

Antwort

23

Mit cv::Mat Objekten werden Ihren Code wesentlich einfacher machen. in einem Rechteck faceRect vom Typ genannt liegt das erkannte Gesicht Unter der Annahme, cv::Rect, alles, was Sie eingeben müssen eine beschnittene Version zu bekommen ist:

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

croppedFaceImage = originalImage(faceRect).clone(); 

Oder alternativ:

originalImage(faceRect).copyTo(croppedImage); 

Dies erzeugt ein temporäres cv::Mat Objekt (ohne die Daten zu kopieren) aus dem von Ihnen bereitgestellten Rechteck. Anschließend werden die realen Daten über die Klon- oder Kopiermethode in Ihr neues Objekt kopiert.

+0

Ich habe bereits mit IplImage * abgeschnitten, was ich tun möchte ist, alle beschnittenen Gesichter getrennt und als neues Bild auf der Festplatte meines Computers zu speichern. Das Ziel der Speicherung dieser Bilder ist, ihren Pfad für eine weitere Anerkennung zu füttern Code. Die Schwierigkeit für mich ist hier, nach dem Erkennen mehrerer Gesichter, wie Sie einen bestimmten Namen für jede erkannte Gesichter zuweisen (mit cvNamedWindow()) und speichern Sie diese Bilder, Abruf und füttern den Pfad dieser gespeicherten Bilder zum Erkennungscode. – Sisay