0

I have been working on an image recognition program for a while now, but suddenly I noticed that when I test my program for a longer amount of time the function cvLoadImage stops returning an image sometimes. I see no clear pattern or time this occurs, but after it fails once it will keep failing for the rest of the program untill I restart again. The piece of code only runs once in a while to update my user interface.

My code:

IplImage* UIframe = cvLoadImage("../images/background.jpg", CV_LOAD_IMAGE_COLOR);
if(UIframe) {
 //do stuff
} else {
 cout<<"Image not loaded"<<endl;
}
cvReleaseImage(&UIframe);

There are a couple of reasons I already found for cvLoadImage failing that I checked:

  • The path is static and is working earlier on in the program so the file is there
  • I release the image and there are no other memory leaks to cause this
  • The .jpg is not being updated while trying to load it
  • I have all the right libraries installed as cvLoadImage is working earlier on

One solution is to only load the image once and keep updating it from memory, but I'd like to find out why this is happening and how to fix this.

4

3 に答える 3

1

最新の OpenCV (2.3.1) を使用していますか?

もう 1 つ気をつけなければならないことは、システムに新しいイメージをロードするのに十分なメモリがないために、その中にあるものが//do stuffメモリ リークを引き起こし、しばらくするとcvLoadImage()失敗する可能性があるということです。

実際には、問題が OpenCVにあるのかコードにあるのかを調べる簡単なテストがあります。同じ画像を N 回ロードする最小限のアプリケーションを作成します。cvLoadImage()を呼び出す以外に、ループ内で何もしないでくださいcvReleaseImage()

この単純なアプリケーションが失敗した場合、OpenCV 側の問題である可能性があります。そうでない場合は、コードで何か間違ったことをしていることがわかります。

于 2012-04-25T13:25:10.750 に答える
0

相対パスを使用する場合は注意してください。作業ディレクトリを再確認することをお勧めします。ここで.exeが実行されます。または、実行時にプログラムが作業ディレクトリを変更していると言いますか?

于 2012-04-25T09:20:29.363 に答える
0

また、UIframe を解放した後、UIframe を NULL に設定する必要があります。解放しても問題ありませんが、NULL 割り当ての前に問題を引き起こすバグさえあるかもしれません。:)

これにより、万が一の場合に備えて、ファイルに何も保持されなくなります。詳細については、SO に関するこの質問をお読みください。

于 2012-04-25T09:44:43.230 に答える