現在のところ、画像のリスト全体を 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 ビット プロジェクトに再コンパイルできます。