开发者

OpenCV 2: How to save a ROI

I am new to OpenCV. Currently, trying to load and save a defined ROI of an image. For Ope开发者_如何学GonCV 1.x, I got it working 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 the OpenCV 2 or C++. I tried the following without a success, the whole 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?


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

In your version copyTo sees that imgInput is bigger then imgRoi and reallocates a new full-size matrix to make the copy. imgRoi is already a sub-image and you can simply pass it to any OpenCV function.


Here is some tested code for blending, cropping and saving new images. You crop and then save that 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;
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜