2012-09-25 24 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()'がイメージを正常に読み込んでいることを確認してください。アプリケーションでロードする必要があるファイルをハードコードしました。あなたはアプリケーションのディレクトリに** 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); 
関連する問題