2017-02-23 12 views
3

私はOpenCVについて次の質問をしています。私はいつもOpenCVのメモリ管理が多かれ少なかれ奇妙であることを知っています。したがって、次の操作が安全であるかどうかは分かりません(指差しポインタ、メモリリークなどは発生しません)。OpenCV:同じMatオブジェクトをソースセーフとデスティネーションセーフの両方として使用していますか?

私はMatオブジェクトを持っていて、イメージを格納しています。サイズを変更するには、OpenCV関数を使ってサイズを変更します。

私は次のように機能を使用したい:

resize(image,image,Size(),paramStruct.upScaleRatio,paramStruct.upScaleRatio, INTER_LANCZOS4); 

私も宛先としてソースオブジェクトを使用しています。この場合、OpenCVの正確な動作は、イメージオブジェクトの古いデータをサイズ変更した後に安全に解放します(ほとんどの場合、一時オブジェクトになる可能性があります)。あるいは、私はいつもソースとは異なる新しいMatオブジェクトを使うべきですか? (コードを複雑にするので、できるだけそれを好むわけではありません)

+1

いいえ毎回新しいMatオブジェクトを作成する必要はありません。この実装は安全です。 – ZdaR

+0

安全ですが、割り当てを解除して新しいメモリをより頻繁に割り当てる可能性があるため、パフォーマンスは低下する可能性があります。 – Micka

答えて

2

インプレースのサイズを変更できないので、常に新しいMatオブジェクトを作成します。 imageオブジェクトは、image.dataのアドレスと考えることができます。実行すると、実際にはオーバーヘッドのみが転送されます。

image = temp_img 

したがって、操作は最小限です。

temp_impが(resizeのような)ローカル変数である場合、関数が終了すると解放されます。

関連する問題