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

4 に答える 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));
于 2013-03-20T17:14:53.703 に答える
8

その画像にROI(関心領域)を設定し、ROIによって定義されたその部分を新しい画像にコピーすることで、達成しようとしていることを実行できます。

この投稿でを使用してデモをIplImage見ることができます。

これらの投稿は、さまざまなシナリオを解決するためのROIの使用法を示しています。

コードがOpenCVのCインターフェースを使用していることに注意することが重要です。C ++インターフェイスはcv::Mat、と同等のを提供しますIplImage。言い換えれば、あなたが探しているのは問題のCソリューションです。

于 2013-03-20T17:28:03.910 に答える
5

コピーコンストラクターの使用:

cv::Mat whole = ...; // from imread or anything else
cv::Mat part(
   whole,
   cv::Range( 20, 220 ), // rows
   cv::Range( 10, 210 ));// cols
于 2014-12-01T13:59:43.720 に答える
2

cvSetImageROI ()関数を検索します。

特定の長方形の画像の関心領域(ROI)を設定します。

于 2013-03-20T16:35:07.713 に答える