1

現在のところ、画像のリスト全体を cv::Mats の形式でベクター内に保存して、後で処理できるようにしようとしています。現在、次のようなものがあります。

do
{
 image = readimage();
 cv::Mat mat = cv::Mat((length, width, CV_8UC4, image));
 cv::Mat temp = mat.clone();
 saved_images.push_back();

 mat.release();
 temp.release();
 freeimagememory(image);
}
while(hasimage);

これは実際に機能します。画像の非常に小さなリストの場合、それらは問題なく保存されます。ただし、大量の画像を取得すると、Abort() が呼び出されたと言ってプログラムが一貫してクラッシュし、検査すると cv::exception をスローしていると表示されます。

これがなぜなのか誰か知っていますか?スペースを節約するために、ベクターを cv::Mats へのポインターのベクターに変更することを考えました (クローン作成はコストがかかるようです) が、それがうまくいくかどうかはわかりません。

誰でも助けることができますか?

EDIT1:スローされた正確なエラーは、割り当てられた X バイトに失敗しました。これは、何らかの形で使用可能なメモリをすべて使い果たしているためだと思います(8ギガのメモリに座っていて、間違いなくメモリが空いているにもかかわらず)。

EDIT2:

以下のコードも機能するようです。

std::vector<cv::Mat*> ptrvec;
do{

 image.readimage();
 ptrvec.push_back(new cv::Mat((length, width, CV_8UC4, image)));
 freeimagememory(image);
}
while(hasimage);

これはメモリに問題はありません(必要なすべての画像をプッシュできます)が、実行しようとするとアクセス違反が発生します

cv::imshow("Test Window", *ptrvec[0]);

EDIT3:

32 ビットの上限に達している可能性はありますか? 私はこれを 64 ビット プロジェクトに再コンパイルできます。

4

1 に答える 1

1

800 x 600 の 3000 個のカラー イメージをベクトルに格納すると、メモリが不足する場合があります。データはまだ RAM に割り当てられているため、Mat ポインタをメモリに格納しても問題は解決しません。

すべての画像を保存するのに十分なメモリがシステムにあるかどうかを確認してください。そうでない場合は、バッチで画像をアップロードできます。たとえば、最初の 500 枚の画像を処理してから、次の 500 枚の画像を処理するなどです。

あなたのプログラムでは、 vector をstackに割り当てます。大きなメモリブロックが必要な場合(あなたの場合) 、ヒープに割り当てることをお勧めします。そのため、代わりにベクターをヒープに割り当てることができます (ベクターを格納するのに十分なメモリがある場合)。詳細については、stack vs heap、またはこの cpp-tutorialを参照してください。

于 2013-08-12T19:52:34.867 に答える