1

以下の機能があります。Matタイプするデータを コピーIplImage *してメインコントロールに戻したいのですが。これはばかげていますが、これを行うための適切な方法を見つけることができませんでした!チートシートMat->IplImage *には、データコピーを使用した変換については何も書かれていません(関数の外で必要なため)。

任意のアイデアやポインタをいただければ幸いです。ベスト-アリ

int test(IplImage **srcImage, int num_images)
{
  vector<Mat> images(num_images); 
  for (int i = 0; i < num_images; ++i) 
  { 
    images[i] = Mat(srcImage[i]); // I guess should be correct! 
      .... 
     // some manipulations on images[i] 
  } 

  // this should be wrong!
  for (int i = 0; i < num_images; ++i) 
  { 
     cvReleaseImage(&srcImage[i]); 
     srcImage[i] = new IplImage(images[i]); 
     images[i].clear();
   } 
  return 0;
 }
4

1 に答える 1

2

短いバージョン:一時的なものに変換してからIplImage、を使用しますcvCopy

ただし、コードにはいくつかの問題があります。

int test(IplImage **srcImage, int num_images)
{
  vector<Mat> images(num_images); 
  for (int i = 0; i < num_images; ++i) 
  { 
    images[i] = Mat(srcImage[i]); // I guess should be correct!

これまでのところ、はい。

      .... 
     // some manipulations on images[i] 

操作がインプレースである場合(sを再割り当てしないでください)、コンストラクターが最初にデータをコピーしなかったMatため、データをコピーして戻す必要はありません。Mat再割り当てする場合は、...

  } 

  // this should be wrong!
  for (int i = 0; i < num_images; ++i) 
  { 
     cvReleaseImage(&srcImage[i]);

これは問題になる可能性があります。images[i]まだ同じメモリを使用している可能性があります。

     srcImage[i] = new IplImage(images[i]);

new IplImage何の役にも立たないでしょう。意味のあるコンストラクターがありません。を使用してcvCreateImageください。

     images[i].clear();

ベクトルはとにかくスコープから外れるので、これは必要ではありません。

   } 
  return 0;
 }

最後のループは次のようになります。

for (int i = 0; i < num_images; ++i) { 
     IplImage* old = srcImage[i]; // store pointer for later deallocation in case of shared data
     IplImage src = images[i];
     srcImage[i] = cvCreateImage(...); // fill appropriate parameters here. If you didn't change size/type/etc, you might not need to create/deallocate(*)
     cvCopy(&src, srcImage[i]);
     cvReleaseImage(&old); // now it is safe to deallocate(*)
} 
于 2011-05-27T11:13:03.573 に答える