我有一个非常简单的应用程序写在QT中,我想通过使用QMediaPlayer
来显示电影,但在显示任何帧之前我想检测它的一些对象并标记它们通过在其上画一个矩形。修改和显示在QAbstractVideoSoSface中获取的QVideoFrame
我读过http://doc.qt.io/qt-5/videooverview.html,我可以访问每个框架的子类QAbstractVideoSurface
,所以我决定。
class VideoSurface : public QAbstractVideoSurface {
Q_OBJECT
bool present(const QVideoFrame &frame) override {
if (surfaceFormat().pixelFormat() != frame.pixelFormat()
|| surfaceFormat().frameSize() != frame.size()) {
setError(IncorrectFormatError);
stop();
return false;
} else {
currentFrame = frame;
return true;
}
}
...
}
现在,我在该成员函数正在接收帧,我想通过借鉴它在哪里检测到的物体的地方矩形修改,然后,我想在屏幕上显示它们(优选在某些插件) 。
我该怎么做?
如果我
VideoSurface
类包含QWidget
成为会员?或者我应该子类QWidget
其中将包含VideoSurface
?在这两种情况下,我怎样才能显示这个框架?我应该先将它转换为
QImage
然后再显示(这对我来说很方便,因为我的检测系统与QImage
一起工作,但效率会如何)?我知道我不能在绘画事件之外绘画,所以我不能在present
函数中绘画,那么究竟应该在哪里绘制这个绘画函数,以及我可以如何调用它?我应该在哪里检测这些对象并修改框架?在
present
函数中,还是在绘图函数中?