我创建了一个QVideoWidget子类,以显示摄像机中的视频帧(Basler,Pylon )。简单地说,帧被转换为cv::Mat,然后用神经网络进行分析。在此之后,我对向QAbstractVideoSurface提供框架的VideoWidget进行了子类化。
当我试图在QVideoWidget中显示我的框架时,void paintEvent(QPaintEvent *event)函数是由update()或repaint()触发的,但是小部件上没有显示任何内容。怎么了?
我检查了从管道开始,到结束,一切都是好的(帧包含数据,像素格式是OK,大小确定,我可以保存一个视频文件与实际帧在其中,等等)。我可以在UI中看到这个小部件。我真的怀疑我的paintEvent函数。
下面是我的paintEvent(QPaintEvent *event)函数:
// VideoWidget.h
protected:
void paintEvent(QPaintEvent *event) override;// VideoWidget.cpp
void VideoWidget::paintEvent(QPaintEvent *event) {
QPainter p(this);
p.drawImage(QRectF(m_targetRect), m_frameConv);
QVideoWidget::paintEvent(event);
}PS:我在MacOS 11上(在MacOSX上都不起作用),我使用的是CMake 3.17。
发布于 2021-01-27 13:21:59
您不需要为此对QVideoWidget进行子类处理。转换frame to image并将其显示在QVideoWidget::videoSurface()上,如文档所示
videoWidget = new QVideoWidget;
QVideoSurfaceFormat format(imgSize, QVideoFrame::Format_ARGB32);
videoWidget->videoSurface()->start(format);
QImage img = frameToImage(m_frameConv).convertToFormat(QImage::Format_ARGB32);
videoWidget->videoSurface()->present(img);
videoWidget->show();https://stackoverflow.com/questions/65910004
复制相似问题