gpt4 book ai didi

qt - 将 OpenCV 与更大的程序集成

转载 作者:太空宇宙 更新时间:2023-11-03 20:39:44 25 4
gpt4 key购买 nike

谁能推荐一份操作指南或简要概述将 OpenCV 与更大的基于 GUI 的程序集成所涉及的内容?流行的方法有哪些?

特别是,在不使用 HighGUI 进行视频捕获/预览的同时使用 OpenCV 处理视频似乎特别神秘。我希望有人能揭开这个神秘面纱。

我的特定配置是使用 Juce 或 Qt,具体取决于可以做什么。跨平台的事情并不重要——如果在 Windows 中有一种很棒的方法可以做到这一点,我可能会相信。社区支持的可用性很重要。

听说HighGUI完全是用来测试的,不适合真正的应用。有人推荐了 VideoInput图书馆,但它是实验性的。


答案要点:

  • 使用 Qt(因为 Qt 很棒并且有很大的社区)。
  • 打开一个新线程以循环运行 cv::VideoCapture 并在帧捕获后发出 信号。使用 Qt 的 msleep 机制,而不是 OpenCV。 因此,我们仍然使用 OpenCV highgui 进行捕获。
  • 将 cv::Mat 转换为 QtImage:

    QImage qtFrame(cvFrame.data, cvFrame.size().width, cvFrame.size().height, cvFrame.step, QImage::Format_RGB888);

    qtFrame = qtFrame.rgbSwapped();

  • 可选:使用 GLWidget 渲染。使用 Qt 内置方法将 QtImage 转换为 GLFormat:

    m_GLFrame = QGLWidget::convertToGLFormat(frame);

    this->updateGL();

最佳答案

这是我用 Qt 做的。欢迎您使用任何对您有用的东西:)

/// OpenCV_GLWidget.h
#ifndef OPENCV_GLWIDGET_H_
#define OPENCV_GLWIDGET_H_

#include <qgl.h>
#include <QImage>

class OpenCV_GLWidget: public QGLWidget {
public:
OpenCV_GLWidget(QWidget * parent = 0, const QGLWidget * shareWidget = 0, Qt::WindowFlags f = 0);
virtual ~OpenCV_GLWidget();

void renderImage(const QImage& frame);
protected:
virtual void paintGL();
virtual void resizeGL(int width, int height);

private:
QImage m_GLFrame;
};

#endif /* OPENCV_GLWIDGET_H_ */

/// OpenCV_GLWidget.cpp
#include "OpenCV_GLWidget.h"

OpenCV_GLWidget::OpenCV_GLWidget(QWidget* parent, const QGLWidget* shareWidget, Qt::WindowFlags f) :
QGLWidget(parent, shareWidget, f)
{
// TODO Auto-generated constructor stub

}

OpenCV_GLWidget::~OpenCV_GLWidget() {
// TODO Auto-generated destructor stub
}

void OpenCV_GLWidget::renderImage(const QImage& frame)
{
m_GLFrame = QGLWidget::convertToGLFormat(frame);
this->updateGL();
}

void OpenCV_GLWidget::resizeGL(int width, int height)
{
// Setup our viewport to be the entire size of the window
glViewport(0, 0, width, height);

// Change to the projection matrix and set orthogonal projection
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, width, height, 0, 0, 1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}

void OpenCV_GLWidget::paintGL() {
glClear (GL_COLOR_BUFFER_BIT);
glClearColor (0.0, 0.0, 0.0, 1.0);
if (!m_GLFrame.isNull()) {
m_GLFrame = m_GLFrame.scaled(this->size(), Qt::IgnoreAspectRatio, Qt::SmoothTransformation);

glEnable(GL_TEXTURE_2D);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, m_GLFrame.width(), m_GLFrame.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, m_GLFrame.bits() );
glBegin(GL_QUADS);
glTexCoord2f(0, 0); glVertex2f(0, m_GLFrame.height());
glTexCoord2f(0, 1); glVertex2f(0, 0);
glTexCoord2f(1, 1); glVertex2f(m_GLFrame.width(), 0);
glTexCoord2f(1, 0); glVertex2f(m_GLFrame.width(), m_GLFrame.height());
glEnd();
glDisable(GL_TEXTURE_2D);

glFlush();
}
}

此类处理将图像渲染到提升的 QWidget 上。接下来,我创建了一个线程来提供小部件。 (我在这里使用 Qt 信号槽架构作弊,因为它很简单......可能不是书中表现最好的,但它应该让你入门)。

void VideoThread::run()
{
cv::VideoCapture video(0);

while(!m_AbortCapture)
{
cv::Mat cvFrame;
video >> cvFrame;

cv::Mat gray(cvFrame.size(), CV_8UC1);
cv::GaussianBlur(cvFrame, cvFrame, cv::Size(5, 5), 9.0, 3.0, cv::BORDER_REPLICATE);
cv::cvtColor(cvFrame, gray, CV_RGB2GRAY);

m_ThresholdLock.lock();
double localThreshold = m_Threshold;
m_ThresholdLock.unlock();

if(localThreshold > 0.0)
{
qDebug() << "Threshold = " << localThreshold;
cv::threshold(gray, gray, localThreshold, 255.0, cv::THRESH_BINARY);
}

cv::cvtColor(gray, cvFrame, CV_GRAY2BGR);

// convert the Mat to a QImage
QImage qtFrame(cvFrame.data, cvFrame.size().width, cvFrame.size().height, cvFrame.step, QImage::Format_RGB888);
qtFrame = qtFrame.rgbSwapped();

// queue the image to the gui
emit sendImage(qtFrame);
msleep(20);
}
}

我花了一些时间才弄明白,所以希望它能帮助您和其他人节省一些时间 :D

关于qt - 将 OpenCV 与更大的程序集成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7801522/

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