Подтвердить что ты не робот

Скопируйте часть изображения с помощью openCv С++

Я использую 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;
}
4b9b3361

Ответ 1

То, что вы пытаетесь выполнить, может быть выполнено путем установки ROI (Область интересов) на этом изображении и копирования этой части, определенной ROI, на новое изображение.

Вы можете увидеть демонстрацию используя IplImage в этом сообщении.

Эти сообщения показывают использование ROI для решения различных сценариев:

Важно отметить, что ваш код использует интерфейс C OpenCV. Интерфейс С++ предлагает cv::Mat, что эквивалентно IplImage. Другими словами, то, что вы ищете, - это решение C.

Ответ 2

Вы должны использовать конструктор cv::Mat copy. Это намного лучше, чем IplImage:

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

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

Ответ 3

Использование конструктора копирования:

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

Ответ 4

Найдите функцию cvSetImageROI().

Устанавливает изображение Region of Interest (ROI) для заданного прямоугольника.