web-dev-qa-db-fra.com

copier une partie de l'image avec openCv c ++

J'utilise open source et je veux créer une image à partir d'une partie d'une autre image.

Je n’ai pas trouvé de fonction qui fasse cela, alors j’essaie de mettre en œuvre mon idée qui consiste à copier l’image pixel par pixel, mais j’ai vainement obtenu le résultat attendu.

Tout le monde a une autre idée

Code:

#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;
}
12
Wadii Slatnia

Ce que vous essayez d'accomplir peut être accompli en définissant uneROI(région d'intérêt) sur cette image et en copiant la partie définie par le retour sur investissement dans une nouvelle image.

Vous pouvez voir un démo utilisant IplImage sur ce message }.

Ces publications montrent les utilisations du retour sur investissement pour résoudre différents scénarios:

Il est important de noter que votre code utilise l'interface C de OpenCV. L'interface C++ offre cv::Mat, qui est l'équivalent de IplImage. En d'autres termes, vous recherchez une solution C au problème.

8
karlphillip

Vous devriez utiliser le constructeur de copie de cv::Mat. C'est beaucoup mieux que IplImage:

int x = 10,
    y = 20, 
    width = 200,
    height = 200;

Mat img1, img2;
img1 = imread("Lenna.png");
img2 = img1(Rect(x, y, width, height));
26
Froyo

Utilisation du constructeur de copie:

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

Recherchez la fonction cvSetImageROI () .

Définit une région d’intérêt image (ROI) pour un rectangle donné.

1
Boyko Perfanov