我正在努力编写一个使用 OpenCV 从视频中读取帧并将其显示在 QWidget 中的视频播放器。
这是我的代码:
// video caputre is opened here
...
void VideoPlayer::run()
{
int sleep = 1000 / static_cast<unsigned long>(video_capture_.get(CV_CAP_PROP_FPS));
forever
{
QScopedPointer<cv::Mat> frame(new cv::Mat);
if(!video_capture_.read(*frame))
break;
cv::resize(*frame, *frame, cv::Size(640, 360), 0, 0, cv::INTER_CUBIC);
cv::cvtColor(*frame, *frame, CV_BGR2RGB);
QImage image(frame->data, frame->cols, frame->rows, QImage::Format_RGB888);
emit signalFrame(image); // notifying QWidget to draw an image
msleep(sleep); // wait before we read another frame
}
}
在 QWidget 方面,我只是使用这张图片并将其绘制在paintEvent
.
在我看来,参数sleep
在这里并不重要。尽管我减少了它(以获得更多的 FPS),但视频并不流畅。
留给我的唯一一件事是我放弃了这种方法,因为它不起作用,但我想在这里再问一次,只是为了确定——我在这里做错了吗?