У меня есть очень простое приложение, написанное на QT, в котором я хочу отобразить фильм с помощью QMediaPlayer
, но прежде чем я буду отображать какой-либо кадр, я хотел бы обнаружить на нем некоторые объекты и пометить их, нарисовав прямоугольник над ним.
Я прочитал в http://Working%20with%20Low%20Level%20Video%20Frames что я могу получить доступ к каждому фрейму, создав подкласс 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
или в функции рисования?