任何人都可以推荐一个操作指南,或简要概述将OpenCV与更大的基于GUI的程序集成的内容吗?有哪些流行的方法呢?
特别是,在使用HighGUI进行视频捕获/预览而不使用进行视频处理时,使用OpenCV处理视频尤其神秘。我希望有人能揭开神秘面纱。
我的特殊配置是使用Juce或Qt,具体取决于可以做什么。跨平台的事情并不重要 - 如果在Windows中有一个很棒的方法,我可能会相信。社区支持的可用性很重要。
我听说HighGUI完全用于测试,不适合实际应用。有人推荐VideoInput库,但它是实验性的。
emit
信号。使用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();
答案 0 :(得分:10)
以下是我使用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
答案 1 :(得分:2)
创建一个openCV图像来保存您捕获的图像。
对其进行处理,然后将数据复制到要显示的图像(例如QImage)
您可以通过创建opencv cv :: Mat图像以与
共享内存来进行视频修改QImage但由于QImage通常使用ARGB,并且大多数图像处理任务最好以灰度或RGB的形式完成,因此最好使用opencv cvtColor()函数复制图像并在它们之间进行转换
然后简单地包括包含opencv头文件,并链接到opencv库 - opencv wiki上有针对您特定环境的指南