2011-09-19 49 views
4

我是OpenCV的新手。目前,試圖加載並保存圖像的定義ROI。 對於OpenCV的1.x中,我得到了它具有以下功能的工作...OpenCV 2:如何保存投資回報率

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

任何幫助或建議?

回答

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版本看到的是imgInput是更大然後imgRoi和重新分配一個新的全尺寸的矩陣,使複印件。 imgRoi已經是一個子圖像,你可以簡單地將它傳遞給任何OpenCV函數。

+1

哇!就是這樣,謝謝, – Paulus

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; 
} 
相關問題