使用openCv c ++复制图像的一部分
c
c++
image-processing
opencv
4
0

我正在使用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;
}
参考资料:
Stack Overflow
收藏
评论
共 3 个回答
高赞 时间 活跃

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

您可以在这篇文章中看到使用IplImage演示

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

请务必注意,您的代码使用的是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
收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号