2012-09-25 2 views
6

opencv에서 IplImage를 자르는 가장 효과적인 방법은 무엇일까? 나는 현재 다음과 같은 일을하지만, 너무 복잡해 보이고, 일을하는 좋은 방법이 있다고 확신한다.가장 효과적으로 IplImage 자르기

// 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); 

더 좋은 방법은 이미지를 자르려면?

답변

5

있습니다. 끝에 원본 이미지를 다시 만드는 것 같습니다. 다음 코드를 보여줍니다으로 즉, 필요하지 않습니다 :

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"); 

불행하게도, 당신이 cvCopy()의 결과를 저장하는 임시 이미지를 만드는 것이 필수적이다.

+1

확실'cvLoadImage을 확인 successfully.try 확인하십시오()'sucessfuly 이미지를로드. 응용 프로그램에서로드해야하는 파일을 하드 코딩했습니다. ** 응용 프로그램의 디렉토리에 ** test.jpg **가 없습니다. 나는이 코드가 작동 함을 보장한다. 당신의 컴퓨터에 충돌이 발생한다면, 정말로, 정말로, 당신이 다르게 (또는하지 않고)하고있는 것에주의를 기울여야합니다. – karlphillip

+0

비디오 프레임을 자르려면이 코드를 사용할 때 메모리 누수 문제가 있습니다. – Kamil

+0

[아마도'cvCloneImage()'또는'cvLoadImage()'] (http://www.cprogramdevelop.com/4885055/) 때문일 것입니다. 'cvReleaseImage()'를 잊어 버렸습니까? – karlphillip

0

C++를 사용하여 이미지를 쉽게자를 수 있습니다. 확인이 코드가

     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); 
관련 문제