OpenCV 2: How to Maintain ROI

I am new to OpenCV. Currently trying to load and save a specific ROI image. For OpenCV 1.x, I got a job with the following function ...

#include <cv.h> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> void SaveROI(const CStringA& inputFile, const CStringA& outputFile) { if (ATLPath::FileExists(inputFile)) { CvRect rect; rect.x = 8; rect.y = 90; rect.width = 26; rect.height = 46; IplImage* imgInput = cvLoadImage(inputFile.GetString(), 1); IplImage* imgRoi = cvCloneImage(imgInput); cvSetImageROI(imgRoi, rect); cvSaveImage(outputFile.GetString(), imgRoi); cvReleaseImage(&imgInput); cvReleaseImage(&imgRoi); } } 

How can this be done with OpenCV 2 or C ++. I tried the following without success, the entire image is saved.

 void SaveROICPP(const CStringA& inputFile, const CStringA& outputFile) { if (ATLPath::FileExists(inputFile)) { cv::Mat imgInput = cv::imread(inputFile.GetString()); if (imgInput.data != NULL) { cv::Mat imgRoi = imgInput(cv::Rect(8, 90, 26, 46)); imgInput.copyTo(imgRoi); cv::imwrite(outputFile.GetString(), imgRoi); } } } 

Any help or suggestion?

+4
source share
2 answers

You just don't need to call copyTo :

 void SaveROICPP(const CStringA& inputFile, const CStringA& outputFile) { if (ATLPath::FileExists(inputFile)) { cv::Mat imgInput = cv::imread(inputFile.GetString()); if (imgInput.data != NULL) { cv::Mat imgRoi = imgInput(cv::Rect(8, 90, 26, 46)); cv::imwrite(outputFile.GetString(), imgRoi); } } } 

Your copyTo version shows that imgInput larger than imgRoi and redistributes the new full-sized matrix to make a copy. imgRoi already a sub-image, and you can simply pass it to any OpenCV function.

+4
source

Here is an example of proven code for mixing, cropping and saving new images. You crop and then save this region in a new file.

 #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; } 
+3
source

All Articles