使用OpenCV C++复制图像的一部分

14

我正在使用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个回答

34

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

2
这并不是说新的C++ API比旧的OpenCV更好,只是不同而已。确实如此,但在OpenCV 3中,旧的IplImage将被弃用,我建议所有阅读此文的人切换到新的cv :: Mat风格。 - TimZaman

9
你想要实现的目标可以通过在图像上设置一个ROI(感兴趣区域)并将ROI定义的部分复制到一个新图像中来完成。
你可以在这篇文章中使用IplImage的演示中看到。
这些文章展示了使用ROI解决不同场景的用法:

需要注意的是,您的代码正在使用OpenCV的C接口。C++接口提供了cv::Mat,它是IplImage的等效物。换句话说,您要寻找的是一个C语言解决方案


5
使用拷贝构造函数:
cv::Mat whole = ...; // from imread or anything else
cv::Mat part(
   whole,
   cv::Range( 20, 220 ), // rows
   cv::Range( 10, 210 ));// cols

2

请查阅cvSetImageROI()函数。

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


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