crop and Save ROI as new image in OpenCV 2.4.2 using cv::Mat
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::Mat
object (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.
Sisay
Updated on July 09, 2022Comments
-
Sisay almost 2 years
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 usescv::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
-
Acorbe about 11 yearsIn the opencv tutorial folder there is one code about face detection. Consider that one. You will have to use
cv::imwrite
to save the file. -
Hassen Ch. about 9 yearsDo you still have the code of recognition, cropping and detection? I have the exact same project!
-
-
Sisay about 11 yearsI already did the cropping with IplImage*, what i want to do is to save all the cropped faces separately and as a new image on the hard drive of my computer.The aim of saving these images is to feed their path for another recognition code.The hardship for me here is, after detecting multiple faces, how to assign a particular name for each detected faces(using cvNamedWindow()) and then save these images, recalling and feed the path of these saved images to the recognition code.
-
Eric Hauenstein almost 9 yearsCould you summarize the link content in case the link dies?
-
Serguzest over 3 yearsThe link did exactly that... it died.