2013-04-15 3 views
8

Работая над обнаружением и распознаванием лиц, и после успешного обнаружения лица я просто хочу обрезать лицо и сохранить его где-нибудь в драйвере, чтобы дать это для кода распознавания. У меня с трудом удается сохранить регион интереса как новый образ. У меня есть коды в Интернете, но он написан в предыдущей версии OpenCV, которая использует IplImage*. Я использую OpenCV 2.4.2, который использует cv::Mat.
Heeeelp !!!
Я отправлю свои коды (распознавание лиц и распознавание как таковые), если вы этого захотите.Обрезать и сохранить ROI как новое изображение в OpenCV 2.4.2 с помощью 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 объектов сделает ваш код существенно проще. Если предположить, что обнаруженное лицо находится в прямоугольнике под названием faceRect типа cv::Rect, все, что вам нужно ввести, чтобы получить обрезанную версия:

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

croppedFaceImage = originalImage(faceRect).clone(); 

Или же:

originalImage(faceRect).copyTo(croppedImage); 

Это создает временный cv::Mat объект (без копирования данных) из прямоугольника, который вы предоставляете. Затем реальные данные копируются на ваш новый объект с помощью метода клонирования или копирования.

+0

Я уже делал обрезку с помощью IplImage *, что я хочу сделать, это сохранить все обрезанные лица по отдельности и как новое изображение на жестком диске моего компьютера. Цель сохранения этих изображений - проложить путь для другого распознавания code.The трудности для меня здесь, после обнаружения нескольких лиц, как назначить определенное имя для каждого обнаруженного лица (используя cvNamedWindow()), а затем сохранить эти изображения, напомнить и передать путь этих сохраненных изображений к коду распознавания. – Sisay

-1

Для обрезки региона используется ROI (Область интересов). Opencv2 делает работу довольно легко. Вы можете проверить ссылку: http://life2coding.blogspot.com/search/label/cropping%20of%20image

+0

Не могли бы вы обобщить содержание ссылки в случае, если ссылка умирает? –