2

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ます。クラスはを継承します。IplImageQPixmapFullScreenImageQLabel

少し遅れるとフルスクリーン画像が非表示になるはずなので、QTimer少し遅れてイベントをトリガーするために使用します。イベントハンドラはhideOnScreen、ラベルを非表示にし、メモリをクリアする必要があるメソッドです。

問題は次のとおりです。

を呼び出すたびにQPixmap::fromImage、ピックスマップデータ用のメモリが割り当てられ、データがQImageメモリバッファからメモリバッファにコピーされQPixmapます。ラベルが非表示になった後も、QPixmapデータは割り当てられたままになります。さらに悪いことに、新しいQPixmap::fromImage呼び出しの後、新しいメモリチャンクが新しい画像に割り当てられ、古いデータはメモリから解放されません。これにより、メモリリークが発生します(テスト画像では、メソッド呼び出しごとにcca 10 MB)。どうすればそのリークを解決できますか?

プライベートQPixmap変数を作成し、QPixmap::fromImageそれによって作成されたpixmapを格納してから、メソッドでそのデストラクタを呼び出そうとしましたhideOnScreenが、役に立ちませんでした。

QPixmapから作成する非静的な方法はありますQImageか?またはさらに良いことに、QPixmapから直接作成する方法はありIplImage*ますか?

よろしくお願いします。

4

4 に答える 4

0

同様の問題がありましたが、コードが異なっていたため、ここに置く価値はありません。コードを取得して私のメソッドとマージすると、次のようになります。

void FullScreenImage::QImageIplImageCvt(IplImage *input)
{
    help=cvCreateImage(cvGetSize(input), input->depth, input->nChannels);
    cvCvtColor(input, help, CV_BGR2RGB);
    QImage* tmp = new QImage((uchar *)help->imageData, help->width, help->height, help->widthStep, QImage::Format_RGB888);
    this->setPixmap(QPixmap::fromImage(*tmp).scaled(this->size(), Qt::IgnoreAspectRatio, Qt::SmoothTransformation));
    delete tmp;
    cvReleaseImage(&help);
}
于 2011-02-04T14:57:37.693 に答える
0

を使用して直接QPixmap::loadFromData作成できるはずです。QPixmapしたがって、次のようなものが機能する可能性があります。

QPixmap p;
p.loadFromData((uchar *)help->imageData, help->width * help->height);

OpenCV やIplImage.

于 2009-11-17T17:07:01.493 に答える