8

iOS で OpenCV を使用して、UIImage.

メソッドprocessImageが大量のメモリを消費しています。Instruments での割り当てを使用してアプリをプロファイリングするとき。のLive Bytesピークは65MB70MB1 秒間です。これにより、アプリケーションがクラッシュします。

以前は高かった。つまり~90MB、変更するとint ddepthこれが減少した ( からCV_16SCV_8U)。「宛先画像の望ましい深さ」を減らすと消費されるメモリが減る可能性があることは理解していますが、最適な形式を選択することが内部の仕組みを理解していません。

の削減ddepthにより、メソッドの実行時間も増加するようです。

Live Bytesピークを大幅に減らし、メソッドの実行時間も短縮したいと考えています。

これを達成する方法についての洞察は大歓迎です。

- (void)processImage:(UIImage *)imageToProcess
{
cv::Mat imageMatrix;

double  sigmaX = 1.0;

int ddepth = CV_8U; //  ddepth – The desired depth of the destination image

cv::GaussianBlur( [self cvMatFromUIImage:imageToProcess], imageMatrix, cv::Size(3,3), sigmaX);

cv::Laplacian(imageMatrix, imageMatrix, ddepth, 1);

double minVal;
double maxVal;

cv::minMaxLoc(imageMatrix, &minVal, &maxVal);

std::cout << "min val : " << minVal << std::endl;
std::cout << "max val: " << maxVal << std::endl;

}

編集注:私はからcvMatFromUIImageを使用していますdocs.opencv.org

編集の更新: @sansuiso の回答はLive Bytesbyを減らしたので受け入れました~3MB。しかし、私はまださらなる削減を探しています。どんな提案でも大歓迎です。ありがとう。

4

2 に答える 2

3

この関数cv::GaussianBlurは、画像をその場で処理できます。[self cvMatFromUIImage:imageToProcess]の出力を変数に割り当てることができますimageMatrix。これにより、余分な画像の作成が回避され、ピーク値が減少します。つまり、次のように進みます。

cv::Mat imageMatrix = `[self cvMatFromUIImage:imageToProcess];
cv::GaussianBlur(imageMatrix, imageMatrix, cv::Size(3,3), sigmax);

メソッドの内容をチェックして、cvMatFromUIImage内部ですべてが正しくリリースされていることを確認することもできます。

于 2013-04-15T14:18:57.897 に答える
2

これは、メモリ リーク[self cvMatFromUIImage:]またはメモリ割り当ての問題であることがよくあります

メモリ リークがないことを確認するには、リストを表示してくださいcvMatFromUIImage

メモリ割り当て

すべての一時画像をクラス メンバーに移動してみてください。これにより、不要なメモリ割り当てがなくなり、コードは各フレームで割り当てられたメモリを再利用します。ユーザー コードが大量のメモリを常に割り当てて解放することを好むメモリ マネージャはいません。cv::Mat の割り当てを解除した後、メモリ マネージャが使用中の空きメモリをしばらく保持できるため、メモリ消費量の急増とクラッシュが発生するため、回避する必要があります。

于 2013-04-19T08:08:02.287 に答える