使用openCv c ++复制图像的一部分

我正在使用opencv,我想从另一个图像的一部分创建一个图像。

我没有找到这样做的function所以我试图实现我的想法,包括逐像素地复制图像但是徒劳无法得到我正在等待的结果。

任何人都有另一个想法

码:

#include "cv.h" #include "highgui.h" #include  #include  #include  int main(int argc,char** argv) { IplImage * img =0; uchar *data; int i,j,k; int height,width,widthStep,nChannels; img=cvLoadImage(argv[1],3); height =img->height; width = img->width; widthStep= img->widthStep; nChannels = img->nChannels; data=(uchar*)img->imageData; IplImage* img1=cvCreateImage(cvSize(height/2,width/2),IPL_DEPTH_8U,nChannels); for(i=0;i<height/2;i++){ for(j=0;j<width/2;j++){ for(k=0;kimageData[i*widthStep+j*nChannels]=data[i*widthStep+j*nChannels]; } } } cvShowImage("image_Originale2",img1); cvWaitKey(0); cvReleaseImage(&img); return 0; } 

您要完成的任务可以通过在该图像上设置ROI感兴趣区域)并将ROI定义的该部分复制到新图像来完成。

你可以在这篇文章中看到使用IplImage的演示 。

这些post显示了ROI用于解决不同场景的用途:

  • MultiCrops在同一图像中
  • 使用鼠标从video上的矩形设置ROI
  • 将图像放入轮廓(OpenCV)
  • IplImage里面的IplImage

请注意,您的代码使用的是OpenCV的C接口 ,这一点很重要。 C ++接口提供了cv::Mat ,它相当于IplImage 。 换句话说,您正在寻找的是问题的C解决方案

你应该使用cv::Mat的复制构造函数。 它比IplImage

 int x = 10, y = 20, width = 200, height = 200; Mat img1, img2; img1 = imread("Lenna.png"); img2 = img1(Rect(x, y, width, height)); 

使用复制构造函数:

 cv::Mat whole = ...; // from imread or anything else cv::Mat part( whole, cv::Range( 20, 220 ), // rows cv::Range( 10, 210 ));// cols 

查找cvSetImageROI()函数。

为给定矩形设置图像感兴趣区域(ROI)。