OpenCV 2:如何保存ROI

4

我是OpenCV的新手。目前,我正在尝试加载和保存图像的定义ROI。 对于OpenCV 1.x版本,我使用以下函数成功实现了...

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

如何使用OpenCV 2或C++实现此操作。我尝试了以下方法,但没有成功,整个图像都被保存。
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);
        }
    }
}

需要帮忙或建议吗?

2个回答

4

您不需要调用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);
        }
    }
}

在您的版本中,copyTo发现imgInputimgRoi大,并重新分配一个新的全尺寸矩阵来进行复制。 imgRoi已经是子图像,您可以将其直接传递给任何OpenCV函数。

3

以下是一些已测试的代码,用于混合、裁剪和保存新图像。您可以裁剪图像并将该区域保存到一个新文件中。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接