gpt4 book ai didi

c++ - Qt OpenCV 网络摄像头流打开和关闭

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:25:53 25 4
gpt4 key购买 nike

我使用 Qt 创建了一个非常简单的 UI,它由一个简单的按钮和一个标签组成。当按钮的 clicked() 信号发出时,将调用使用 OpenCV 从网络摄像头捕获帧的函数。我目前用于实现此目的的代码是:

cv::Mat MainWindow::captureFrame(int width, int height)
{

//sets the width and height of the frame to be captured
webcam.set(CV_CAP_PROP_FRAME_WIDTH, width);
webcam.set(CV_CAP_PROP_FRAME_HEIGHT, height);

//determine whether or not the webcam video stream was successfully initialized
if(!webcam.isOpened())
{
qDebug() << "Camera initialization failed.";
}

//attempts to grab a frame from the webcam
if (!webcam.grab()) {
qDebug() << "Failed to capture frame.";
}

//attempts to read the grabbed frame and stores it in frame
if (!webcam.read(frame)) {
qDebug() << "Failed to read data from captured frame.";
}

return frame;
}

捕获帧后,必须将其转换为 QImage 才能显示在标签中。为了实现这一点,我使用了以下方法:

QImage MainWindow::getQImageFromFrame(cv::Mat frame) {
//converts the color model of the image from RGB to BGR because OpenCV uses BGR
cv::cvtColor(frame, frame, CV_RGB2BGR);
return QImage((uchar*) (frame.data), frame.cols, frame.rows, frame.step, QImage::Format_RGB888);
}

我的 MainWaindow 类的构造函数如下所示:

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
resize(1280, 720);
move(QPoint(200, 200));
webcam.open(0);
fps = 1000/25;
qTimer = new QTimer(this);
qTimer->setInterval(fps);
connect(qTimer, SIGNAL(timeout()), this, SLOT(displayFrame()));
}

QTimer 应该通过调用 dislayFrame() 显示一个帧

void MainWindow::displayFrame() {
//capture a frame from the webcam
frame = captureFrame(640, 360);
image = getQImageFromFrame(frame);

//set the image of the label to be the captured frame and resize the label appropriately
ui->label->setPixmap(QPixmap::fromImage(image));
ui->label->resize(ui->label->pixmap()->size());
}

每次发出 timeout() 信号。然而,虽然这似乎在一定程度上起作用,但实际发生的是来 self 的网络摄像头(Logitech Quickcam Pro 9000)的视频捕获流反复打开和关闭。表明网络摄像头打开的蓝色环反复闪烁就证明了这一点。这导致网络摄像头视频流标签的刷新率非常低,这是不可取的。有什么方法可以使网络摄像头流保持打开状态,以防止发生这种“闪烁”?

最佳答案

我似乎已经通过删除线解决了网络摄像头流打开和关闭的问题:

webcam.set(CV_CAP_PROP_FRAME_WIDTH, width);
webcam.set(CV_CAP_PROP_FRAME_HEIGHT, height);

来自 captureFrame() 函数并在 MainWindow 构造函数中设置要捕获的帧的宽度和高度。

关于c++ - Qt OpenCV 网络摄像头流打开和关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19460346/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com