2013-04-15 49 views
8

Làm việc trên Nhận diện khuôn mặt và Nhận dạng, và sau khi phát hiện thành công khuôn mặt, tôi chỉ muốn cắt mặt và lưu nó ở đâu đó trong ổ đĩa nó cho mã nhận dạng. Tôi đang gặp khó khăn trong việc tiết kiệm Khu vực quan tâm dưới dạng hình ảnh mới. Tôi đã có một số mã trực tuyến nhưng nó được viết trong phiên bản trước của OpenCV sử dụng IplImage*. Tôi đang sử dụng OpenCV 2.4.2 sử dụng cv::Mat.
Heeeelp !!!
Tôi sẽ đăng các mã của tôi (Nhận diện khuôn mặt và Nhận dạng mỗi lần) nếu bạn muốn.cắt và Lưu ROI dưới dạng hình ảnh mới trong OpenCV 2.4.2 bằng cách sử dụng 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; 
} 

Cảm ơn. Hòa bình

+1

Trong thư mục hướng dẫn opencv có một mã về phát hiện khuôn mặt. Hãy xem xét một. Bạn sẽ phải sử dụng 'cv :: imwrite' để lưu tập tin. – Acorbe

+0

Bạn vẫn có mã nhận dạng, cắt xén và phát hiện? Tôi có cùng một dự án! –

Trả lời

23

Sử dụng các đối tượng cv::Mat sẽ làm cho mã của bạn đơn giản hơn đáng kể. Giả sử các mặt phát hiện nằm trong một hình chữ nhật được gọi là faceRect loại cv::Rect, tất cả các bạn phải gõ để có được một phiên bản cắt là:

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

croppedFaceImage = originalImage(faceRect).clone(); 

Hoặc cách khác:

originalImage(faceRect).copyTo(croppedImage); 

Điều này tạo ra một đối tượng tạm thời cv::Mat (mà không sao chép dữ liệu) từ hình chữ nhật mà bạn cung cấp. Sau đó, dữ liệu thực được sao chép vào đối tượng mới của bạn thông qua phương thức sao chép hoặc sao chép.

+0

Tôi đã thực hiện cắt xén với IplImage *, những gì tôi muốn làm là lưu tất cả các khuôn mặt bị cắt một cách riêng biệt và như một hình ảnh mới trên ổ cứng của máy tính của tôi. code. Khó khăn đối với tôi ở đây là, sau khi phát hiện nhiều khuôn mặt, cách gán một tên cụ thể cho mỗi khuôn mặt được phát hiện (sử dụng cvNamedWindow()) và sau đó lưu các ảnh này, nhớ lại và nạp đường dẫn của các ảnh đã lưu này vào mã nhận dạng. – Sisay

Các vấn đề liên quan