2013-03-20 3 views
11

Я использую opencv, и я хочу создать изображение из части другого изображения.скопируйте часть изображения с помощью openCv C++

Я не нашел функцию, которая делает это, поэтому я пытаюсь реализовать свою Идею, которая состоит из копирования пикселя изображения на пиксель, но напрасно я не получил результат, которого я жду.

Любой из них имеет другую идею

Код:

#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; 
} 

ответ

8

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

Вы можете увидеть demo using IplImage on this post.

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

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

0

Посмотрите функцию cvSetImageROI().

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

23

Вы должны использовать конструктор копирования 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

Это не лучше, по определению, это по-другому; устаревший OpenCV против «нового» C++ api. Действительно, но старые вещи IplImage будут обесцениваться в OpenCV 3, и я советую всем, кто читает это, переключиться на новый стиль cv :: Mat. – TimZaman

2

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

cv::Mat whole = ...; // from imread or anything else 
cv::Mat part(
    whole, 
    cv::Range(20, 220), // rows 
    cv::Range(10, 210));// cols 
Смежные вопросы