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

时间:2013-03-20 16:32:58

标签: c++ c opencv image-processing

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

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

任何人都有另一个想法

代码:

#include "cv.h"
#include "highgui.h"
#include <stdlib.h>
#include <stdio.h>
#include <iostream>

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;k<3;k++){
        img1->imageData[i*widthStep+j*nChannels]=data[i*widthStep+j*nChannels];
      }
    }
  }
  cvShowImage("image_Originale2",img1);
  cvWaitKey(0);
  cvReleaseImage(&img);
  return 0;
}

4 个答案:

答案 0 :(得分:28)

您应该使用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));

答案 1 :(得分:8)

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

您可以看到demo using IplImage on this post

这些帖子显示了使用ROI来解决不同的情况:

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

答案 2 :(得分:4)

使用复制构造函数:

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

答案 3 :(得分:1)

查找cvSetImageROI()功能。

  

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