我想使用QLabel类来显示相机的每一帧(OpenCV Mat(,但update()
无法连续显示图像,所以我使用repain();
,但这里有一个问题,我的ui无法移动,其他按钮也无法点击,所以如果我想显示视频,我该怎么办;使用opencv、qt和vs;提前感谢!
只需将视频捕获周期移动到另一个线程中,并使用signal/slot系统将帧发送到gui线程。
线程
class VideoThread : public QThread
{
Q_OBJECT
public:
VideoThread(QObject *parent = nullptr);
protected:
void run();
signals:
void frameCaptured(cv::Mat frame);
};
void VideoThread::run()
{
VideoCapture cap(0);
if(!cap.isOpened()){
qDebug() << "Cant capture video";
return ;
}
while(1){
Mat frame;
cap >> frame;
if (frame.empty()) {
qDebug() << "Empty frame";
break;
}
emit frameCaptured(frame);
}
}
使用
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(&m_videoThread, &VideoThread::frameCaptured,
this, &MainWindow::OnFrameCaptured);
}
void MainWindow::OnFrameCaptured(const cv::Mat &frame)
{
QImage imgIn= QImage((uchar*) frame.data, frame.cols, frame.rows, frame.step, QImage::Format_RGB888);
ui->lblVideo->setPixmap(QPixmap::fromImage(imgIn));
}
不要忘记注册元类型
qRegisterMetaType<cv::Mat>("cv::Mat");
并运行线程
m_videoThread.start();