2012-09-25 9 views
6

Me pregunto cuál es la forma más efectiva de recortar una imagen Ipl en opencv. Actualmente hago lo siguiente, pero parece demasiado complicado y estoy seguro de que hay una forma mejor de hacer las cosas.recortar IplImage más efectivamente

// set ROI on original image, create 'tmp' image and copy data over. 
    cvSetImageROI(orig_image, cvRect(55, 170, 530, 230)); 

    IplImage *tmp = cvCreateImage(cvGetSize(orig_image), 
           orig_image->depth, 
           orig_image->nChannels); 

    cvCopy(m_depth_run_avg, tmp, NULL); 
    cvResetImageROI(orig_image); 

    // copy temporary image back to original image. 
    IplImage *orig_image= cvCreateImage(cvGetSize(tmp), 
          tmp->depth, 
          tmp->nChannels); 
    cvCopy(tmp, orig_image, NULL); 

¿Existe alguna forma mejor de recortar una imagen?

Respuesta

5

, hay. Parece que estás recreando la imagen original al final. Eso no es necesario, ya que el código siguiente muestra:

IplImage* orig = cvLoadImage("test.jpg"); 
if (!orig) 
{ 
    return -1; 
} 
printf("Orig dimensions: %dx%d\n", orig->width, orig->height); 

cvSetImageROI(orig, cvRect(0, 250, 350, 350)); 

IplImage *tmp = cvCreateImage(cvGetSize(orig), 
           orig->depth, 
           orig->nChannels); 

cvCopy(orig, tmp, NULL); 
cvResetImageROI(orig); 

orig = cvCloneImage(tmp); 
printf("Orig dimensions after crop: %dx%d\n", orig->width, orig->height); 

cvNamedWindow("result", CV_WINDOW_AUTOSIZE); 
cvShowImage("result", orig); 
cvWaitKey(0); 
cvDestroyWindow("result"); 

Por desgracia, es imperativo que se crea una imagen temporal para almacenar el resultado de cvCopy().

+1

Asegúrese de que 'cvLoadImage()' haya cargado correctamente una imagen. Codifiqué el archivo que necesitaba cargar en la aplicación. Ciertamente no tienes ** test.jpg ** por ahí en el directorio de la aplicación. Te garantizo que este código funciona. Si se está cayendo en su máquina, realmente debe prestar atención a lo que está haciendo de manera diferente (o no hacer). – karlphillip

+0

Tengo algún tipo de problema de pérdida de memoria con ese código cuando lo estoy usando para recortar cuadros de video. – Kamil

+0

[Esto se debe probablemente a 'cvCloneImage()' o 'cvLoadImage()'] (http://www.cprogramdevelop.com/4885055/). ¿Olvidaste a 'cvReleaseImage()'? – karlphillip

0

puede recortar fácilmente la imagen utilizando C++. Asegúrese de que este código sea exitoso. Repárelo

     IplImage *source_image = cvLoadImage("paper.jpg", 1); 


        cout << "Width:" << source_image->width << " pixels" << endl; 
        cout << "Height:" << source_image->height << " pixels" << endl; 
        int width = source_image->width; 
        int lenght = source_image->height; 

        cv::Rect roi; 
        roi.x = 1200; //1200  // 950 
        roi.y = 355; //350  //150 
        roi.width = 2340; //2360   //2750 
        roi.height = 1425; //1235 /2500   //2810 //2465 fully braille sheet 


        IplImage *cropped_Image1 = cvCreateImage(cvSize(roi.width, roi.height), source_image->depth, source_image->nChannels); 
        cvSetImageROI(source_image, roi); 
        cvCopy(source_image, cropped_Image1); 
        cvResetImageROI(source_image); 
        cvShowImage("Cropped Image", cropped_Image1);