Qtに問題があります。
これが私を悩ませているコードの一部です:
void FullScreenImage::QImageIplImageCvt(IplImage *input)
{
help=cvCreateImage(cvGetSize(input), input->depth, input->nChannels);
cvCvtColor(input, help, CV_BGR2RGB);
QImage tmp((uchar *)help->imageData, help->width, help->height, help->widthStep, QImage::Format_RGB888);
this->setPixmap(QPixmap::fromImage(tmp).scaled(this->size(), Qt::IgnoreAspectRatio, Qt::SmoothTransformation));
cvReleaseImage(&help);
}
void FullScreenImage::hideOnScreen() {
this->hide();
this->clear();
}
void FullScreenImage::showOnScreen(IplImage *slika, int delay) {
QImageIplImageCvt(slika);
this->showFullScreen();
if(delay>0)
QTimer::singleShot(delay*1000, this, SLOT(hideOnScreen()));
}
そのため、このメソッドshowOnScreen
はプライベートメソッドQImageIplImageCvt
を使用して(OpenCVで使用される)から作成し、画像を全画面で表示するために作成するために使用されQImage
ます。クラスはを継承します。IplImage
QPixmap
FullScreenImage
QLabel
少し遅れるとフルスクリーン画像が非表示になるはずなので、QTimer
少し遅れてイベントをトリガーするために使用します。イベントハンドラはhideOnScreen
、ラベルを非表示にし、メモリをクリアする必要があるメソッドです。
問題は次のとおりです。
を呼び出すたびにQPixmap::fromImage
、ピックスマップデータ用のメモリが割り当てられ、データがQImage
メモリバッファからメモリバッファにコピーされQPixmap
ます。ラベルが非表示になった後も、QPixmap
データは割り当てられたままになります。さらに悪いことに、新しいQPixmap::fromImage
呼び出しの後、新しいメモリチャンクが新しい画像に割り当てられ、古いデータはメモリから解放されません。これにより、メモリリークが発生します(テスト画像では、メソッド呼び出しごとにcca 10 MB)。どうすればそのリークを解決できますか?
プライベートQPixmap
変数を作成し、QPixmap::fromImage
それによって作成されたpixmapを格納してから、メソッドでそのデストラクタを呼び出そうとしましたhideOnScreen
が、役に立ちませんでした。
QPixmap
から作成する非静的な方法はありますQImage
か?またはさらに良いことに、QPixmap
から直接作成する方法はありIplImage*
ますか?
よろしくお願いします。