2013-03-09 7 views
0

그래픽 뷰 QObject에 비디오를 표시하는 코드를 작성하고 있습니다. 그것은 다음과 같이 간다 : 당신이 볼 수 있듯이Qimage : 메모리 부족, null 이미지 반환

void MainWindow::UpdateVideo() 
{ 
    cap >> frame; 
    cvtColor(frame, frame,CV_BGR2RGB); 
    QImage Qframe = QImage((uchar*) frame.data, frame.cols, frame.rows, frame.step, QImage::Format_RGB888); 
    QPointer<QGraphicsScene> VideoScene = new QGraphicsScene; 
    VideoScene->addPixmap(QPixmap::fromImage(Qframe)); 
    ui->VideoView->setScene(VideoScene); 
    ui->VideoView->show(); 
} 

void MainWindow::on_pushButton_2_clicked() 
{ 
    cap.open("test1.mpg"); 
    if(!cap.isOpened()) 
     cout<<"CANNOT OPEN FILE"<<endl; //or you can put some error message 
    QPointer<QTimer> UpdateVideo = new QTimer; 
    connect(UpdateVideo, SIGNAL(timeout()), this, SLOT(UpdateVideo())); 
    UpdateVideo->start(10); 
} 

는, 슬롯이 on_pushButton_2_clicked() 10ms마다 첫 번째 클릭 후 타이머 슬롯 UpdateVideo()를 호출합니다. 비디오를 완벽하게 표시하고 싶지만 몇 초 후에 qt 생성자의 응용 프로그램 출력에 다음 오류가 나타납니다.

Qimage : 메모리 부족, null 이미지 반환.

그리고 나서 graphicsView 프레임이 비어있게됩니다. 메모리 누수가 어디 있는지 말해 줄 수 있어요?

+0

타이머를 할당 할 때 어떤 일이 발생하는지 궁금합니다. 이후에 항상 삭제됩니까? –

답변

1

나는 QPointer이 생각하는대로하지 않는다고 생각합니다. 새로운 QGraphicScene을 지속적으로 할당하고 있습니다. 그래서 자원이 부족합니다.

  1. 씬은 창 또는 외부에 있어야합니다.
  2. addPixmap이 반환하는 QGraphicsPixmapItem*을 다시 확인해야합니다.
  3. 이미지를 업데이트하려면 의 setPixmap (const QPixmap &pixmap) 메서드를 호출해야합니다. 예를 들어

:

class PixmapView 
: public QGraphicsView 
{ 
public: 
    QPlotView(QGraphicsScene *scene) 
    : QGraphicsView(scene) 
    , pixmap(256, 256) 
    { 
     pixmapItem = scene->addPixmap(pixmap); 
     buffer.resize(256*256*4); 
     startTimer(100); 
    } 

    void timerEvent(QTimerEvent*) 
    { 
     QImage image(&buffer[0], 256, 256, QImage::Format_ARGB32); 
     pixmapItem->setPixmap( QPixmap::fromImage(image)); 
    } 

private: 
    std::vector<uchar> buffer; 
    QPixmap pixmap; 
    QGraphicsPixmapItem* pixmapItem; 
}; 

편집 :

또한 지속적으로 할당하는 새로운 QTimer의. 메서드의 끝에서 살아남을 필요가 있으므로 단일 타이머가 윈도우의 멤버 여야합니다.

+0

감사합니다. 확인하겠습니다. 연락 드리겠습니다. – jtafurth

+0

해당 정의, std :: unique_ptr 버퍼; 나를 위해 작동하지 않습니다, 나는 ISO C++ 선언 "unique_ptr"형식을 금지합니다. – jtafurth

+0

그런 다음 std :: vector 을 사용하거나 uchar *을 사용하고 소멸자에서 []를 삭제하십시오. – Thomas