crop and Save ROI as new image in OpenCV 2.4.2 using cv::Mat

拈花ヽ惹草 提交于 2019-12-03 04:38:30

问题


Working on Face Detection and Recognition, and after successfully detecting a face, I just want to crop the face and save it somewhere in the drive to give it for the recognition code. I am having hard time doing the saving the Region of Interest as a new image. I have got some codes online but it is written in the previous version of OpenCV that uses IplImage*. I am using OpenCV 2.4.2 that uses cv::Mat.
Heeeelp!!!
I will post my codes(Face detection and Recognition per se) if you guys want it.

#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;
}

Thanks. Peace


回答1:


Using cv::Mat objects will make your code substantially simpler. Assuming the detected face lies in a rectangle called faceRect of type cv::Rect, all you have to type to get a cropped version is:

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

croppedFaceImage = originalImage(faceRect).clone();

Or alternatively:

originalImage(faceRect).copyTo(croppedImage);

This creates a temporary cv::Matobject (without copying the data) from the rectangle that you provide. Then, the real data is copied to your new object via the clone or copy method.




回答2:


For cropping the region, the ROI(Region of interest) is used. The opencv2 does the job quite easily. You can check the link: http://life2coding.blogspot.com/search/label/cropping%20of%20image



来源:https://stackoverflow.com/questions/16014093/crop-and-save-roi-as-new-image-in-opencv-2-4-2-using-cvmat

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!