在 Windows 中的 Qt 中配置 OpenCv

Posted

技术标签:

【中文标题】在 Windows 中的 Qt 中配置 OpenCv【英文标题】:Configuration OpenCv in Qt in windows 【发布时间】:2016-11-23 12:02:00 【问题描述】:

我正在从事一个人工视觉项目,该项目需要 GUI 进行用户交互。

在寻找一些可能的解决方案后,我决定使用 Qt 进行编程。

我遵循了一些我找到的教程,但最后我总是遇到同样的问题:如果我输入一些 opencv 代码,程序在启动后就崩溃了。

我正在使用带有 Visual Studio 编译器(MSCV 2010 for 32bit)的 opencv 2.4.10 和 Qt 5.3.2。

出于学习目的,我正在尝试部署以下项目:

opencvButton.pro:

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = opencvButton
TEMPLATE = app
INCLUDEPATH += C:\\opencv\\build\\include
LIBS += -LC:\\opencv\\build\\x86\\vc10\\lib \
     -lopencv_calib3d2410d \
     -lopencv_contrib2410d \
     -lopencv_core2410d \
     -lopencv_features2d2410d \
     -lopencv_flann2410d \
     -lopencv_gpu2410d \
     -lopencv_highgui2410d \
     -lopencv_imgproc2410d \
     -lopencv_legacy2410d \
     -lopencv_ml2410d \
     -lopencv_nonfree2410d \
     -lopencv_objdetect2410d \
     -lopencv_ocl2410d \
     -lopencv_photo2410d \
     -lopencv_stitching2410d \
     -lopencv_superres2410d \
     -lopencv_ts2410d \
     -lopencv_video2410d \
     -lopencv_videostab2410d


SOURCES += main.cpp\
    mainwindow.cpp

HEADERS  += mainwindow.h

FORMS    += mainwindow.ui

主窗口.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QPushButton>
#include <QMessageBox>
#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

namespace Ui 
     class MainWindow;


class MainWindow : public QMainWindow

    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
    private slots:
    void handleButton();
private:
    QPushButton *m_button;
;

#endif // MAINWINDOW_H

main.cpp:

#include "mainwindow.h"

#include <QApplication>

int main(int argc, char *argv[])

    QApplication app(argc, argv);

    MainWindow mainWindow;
    mainWindow.showMaximized();
    return app.exec();

最后,mainwindow.cpp: #include "mainwindow.h"

 #include <QCoreApplication>

 using namespace cv;

 MainWindow::MainWindow(QWidget *parent)
     : QMainWindow(parent)

     // Create the button, make "this" the parent
     m_button = new QPushButton("Display image", this);
     // set size and location of the button
     m_button->setGeometry(QRect(QPoint(100, 100), QSize(200, 50)));

     // Connect button signal to appropriate slot
     connect(m_button, SIGNAL (released()), this, SLOT (handleButton()));


 void MainWindow::handleButton()

    // Define image path
    String imaloc = "C:\\Users\\Virtualmech\\Desktop\\ipRedCable.png";
    // Mat instance declaration image.
    Mat image;
    // Load imaloc image in Mat instance.
    image = imread(imaloc);
    if(image.empty())
         QMessageBox::about(this, "Error", "Cannot load image");
    else
        // Declare name of window
        namedWindow("Display image");
        // Show image
        imshow("Display image", image);
        // Wait for user interaction
        waitKey(0);
        // Close and destroy window
        destroyAllWindows();
    

这个项目包含一个按钮,当你点击它时,程序应该在路径 imaloc 中显示一个图像。

我得到的应用程序输出是:

正在启动 C:\Users\Virtualmech\Documents\opencvButton\debug\opencvButton.exe...

程序意外结束。

C:\Users\Virtualmech\Documents\opencvButton\debug\opencvButton.exe 崩溃

这甚至没有开始。

如果我在mainwindow.cpp中注释opencv相关代码,程序运行完美。

现在,如果我只声明(不定义)一个 Mat 实例,应用程序将停止运行,并再次显示相同的输出。

我觉得应该是配置问题,但是找不到。

谁能给点线索?

感谢您的帮助和时间。

【问题讨论】:

【参考方案1】:

我认为您忘记将必要的 dll 放在您尝试运行的可执行文件旁边,在您的案例中的调试文件夹中。

要找出您缺少哪些 dll,请尝试直接运行程序,而不是通过 Qt Creator 的界面来运行。

【讨论】:

感谢您的回答。我认为通过输入 INCLUDEPATH(对于 .h)和 LIBS(对于 .lib)的 .pro 文件行就足够了。现在我明白我也必须链接 .dlls 。我将尝试包含这些文件并发布反馈。 非常感谢。你完全正确。我只是将与我的 .lib 文件相关的文件复制到我的项目文件夹 .dll 中,并且项目运行完美:))

以上是关于在 Windows 中的 Qt 中配置 OpenCv的主要内容,如果未能解决你的问题,请参考以下文章

如何在Windows下为Qt配置环境变量

如何在Windows下构建ARM Linux QT开发环境

Windows 中的 Qt Creator - 我如何知道正在使用哪个编译器?

Qt中添加OpenCV库

如何在Windows上安装FFmpeg程序

如何设置Qt中的build settings