我有一个从 cv::VideoCapture 继承的 Camera 类,它的核心方法是将我从直播流中获得的 cv::Mat 转换为 QImage :
QImage Camera::getFrame() {
if(isOpened()) {
cv::Mat image;
(*this) >> image;
cv::cvtColor(image, image, CV_BGR2RGB);
return QImage((uchar*) image.data, image.cols, image.rows, image.step, QImage::Format_RGB888);
}
else return QImage();
}
还有一个封装类 CameraDelayedView,它调用这个方法并添加一个延迟:
void CameraDelayedView::timerEvent(QTimerEvent *evt) {
if(cam != NULL) {
buffer.enqueue(cam->getFrame());
if(buffer.size() > delay*fps) {
setPixmap(QPixmap::fromImage(buffer.dequeue()));
}
}
}
我可以看到视频的初始显示延迟了 5 秒,但之后它运行平稳。看起来图像仍然以某种方式通过指针链接到实时馈送(或者 QQeueue 不是一个合适的 FIFO,但我对此表示怀疑)......是这样吗?
如果是这样,我可以通过这种方式向正在经历同样事情的其他人提供答案,并且我会对一种有效的复制方式(或更有效的上述代码)感兴趣。如果没有,我不知道发生了什么......
提前致谢。
问候,Mystère 先生