0

私は次のことをしたい:

  1. 何とか取得した Cv::mat のコピーを作成
  2. それを変換します
  3. データへのポインターをメタ情報 (サイズ、フォーマットなど) と共に呼び出し元に返します。
  4. 完了したら、データを解放します

私が使用しているコードは次のとおりです。

cv::Mat m(...); //here is source image

cv::Mat *img  = new cv::Mat(m.clone());// copy the data
//do transformations
(*result)->pdata = img->data; // pointer to data gois to out parameter
img->addref(); //to prevent freeing the image data after tempo
delete img; //dispose of temporary object

...

delete [] outparam->pdata; //result == &outparam; free data after use

ただし、このコードを実行すると、次の場合にアサーション エラーが発生します。

_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));

どうすれば目標を達成できますか?

4

2 に答える 2

3

Mat事前に割り当てられたメモリのオブジェクトを作成できます。このような場合、参照カウントは無効になり、オブジェクトはデストラクタでこのメモリを解放しません:

cv::Mat m(...);
Mat img(rows, cols, type, (*result)->pdata);
m.copyTo(img);
...
delete [] (*result)->pdata;
于 2013-07-26T13:31:05.997 に答える
2

やりたいことは、OpenCV の参照カウントによって実装されます。ポイントと割り当てを自分で使用するよりも、それに依存する方がはるかに良い考えです。

cv::Mat m(...);
cv::Mat img = m; // this does not copy data, all the changes in img will be in m as well
// ... use img
// no delete necessary

元のコンテンツを削除せずにデータを変換する場合は、データをコピーする必要があることに注意してください。このような場合には:

cv::Mat m(...)
cv::Mat img = m.clone(); // this copies data, m and img can be used as two different Mats
// ... use img
// no delete necessary, img will be automatically deallocated

解放がいつ発生するかが重要な場合は、スコープで制御できます。

cv::Mat m(...)
{
  cv::Mat img = m.clone();
  ...
} // img is automatically deleted here
// img is no longer available
于 2013-07-26T13:37:39.073 に答える