2013-04-15 7 views
8

顔検出と認識に取り組んで、顔を正しく検出したら、顔を切り抜いてドライブのどこかに保存したいそれは認識コード用です。興味のある領域を新しいイメージとして保存するのに苦労しています。私はいくつかのコードをオンラインで持っていますが、それはIplImage*を使用するOpenCVの以前のバージョンで書かれています。私はcv::Matを使用するOpenCV 2.4.2を使用しています。
Heeeelp !!!
もしあなたがそれを望むなら私は自分のコード(顔検出と認識それ自体)を投稿します。OpenCV 2.4.2でOpenCV 2.4.2でROIを新しい画像として保存する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; 
} 

ありがとう。平和

+1

opencvチュートリアルフォルダには、顔検出に関するコードが1つあります。それを考えてみましょう。ファイルを保存するには、 'cv :: imwrite'を使う必要があります。 – Acorbe

+0

認識、クロッピング、検出のコードはありますか?私はまったく同じプロジェクトを持っています! –

答えて

23

cv::Matオブジェクトを使用するとコードが大幅に簡単になります。 (

originalImage(faceRect).copyTo(croppedImage); 

これは一時的なcv::Matオブジェクトを作成します。検出された顔がタイプcv::RectfaceRectと呼ばれる長方形であると仮定すると、あなたはトリミングされたバージョンを取得するために入力する必要があり、すべてがある:

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

croppedFaceImage = originalImage(faceRect).clone(); 

または代わりにあなたが提供する四角形からデータをコピーすることなく)。次に、実データは、クローンまたはコピーメソッドを使用して新しいオブジェクトにコピーされます。

+0

私はすでにIplImage *でトリミングを行っています。私がやりたいことは、切り取ったすべての面を別々に、コンピュータのハードドライブに新しい画像として保存することです。これらの画像を保存する目的は、ここでは、複数の顔を検出した後、検出された各顔に特定の名前を割り当てる方法(cvNamedWindow()を使用して)を保存し、これらの画像を保存し、これらの保存された画像のパスを認識コードに送ります。 – Sisay

関連する問題