2013-04-15 3 views
8

얼굴 인식 및 인식 작업을 수행하고 얼굴을 성공적으로 감지 한 후 얼굴을 자르고 드라이브의 어딘가에 저장하면 그것은 인식 코드입니다. 관심 영역을 새로운 이미지로 저장하는 데 어려움을 겪고 있습니다. 온라인 코드가 있지만 OpenCV의 이전 버전 인 IplImage*으로 작성되었습니다. 나는 cv::Mat을 사용하는 OpenCV 2.4.2를 사용하고 있습니다.
Heeeelp !!!
내가 원한다면 내 코드 (얼굴 인식 및 인식 그 자체)를 게시 할 것입니다.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 자습서 폴더에는 얼굴 인식에 대한 코드가 하나 있습니다. 저것을 고려하십시오. 파일을 저장하기 위해서'cv :: imwrite'를 사용할 필요가 있습니다. – Acorbe

+0

인식, 자르기 및 탐지 코드가 여전히 있습니까? 나는 똑같은 프로젝트를 가지고있다! –

답변

23

cv::Mat을 사용하면 코드가 훨씬 간단 해집니다. 감지 된 얼굴을 가정하면 유형 cv::RectfaceRect라는 사각형에있다, 사용자가 입력해야하는 것은 얻을 수 자른 버전입니다 : 또는

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

croppedFaceImage = originalImage(faceRect).clone(); 

또는 :

originalImage(faceRect).copyTo(croppedImage); 

이 임시 cv::Mat 객체를 생성 (당신이 제공하는 사각형에서 데이터를 복사하지 않고). 그런 다음 실제 데이터가 복제 또는 복사 방법을 통해 새 객체에 복사됩니다.

+0

IplImage *로 자르기를 이미 했으므로 자른 얼굴을 별도로 저장하고 컴퓨터의 하드 드라이브에 새 이미지로 저장하는 것이 좋습니다. 이러한 이미지를 저장하는 목적은 다른 인식을 위해 경로를 제공하는 것입니다. 여기에 대한 어려움은 여러 얼굴을 검색 한 후 cvNamedWindow()를 사용하여 각 감지 된 얼굴에 특정 이름을 지정하고 이러한 이미지를 저장하고 저장된 이미지의 경로를 인식 코드로 보내는 방법입니다. – Sisay