Qt使用OpenCv

本文档详细介绍了如何在Windows 11环境下配置Qt 5.12.12、Visual Studio 2015和OpenCV,以创建一个图像处理应用。首先,下载并安装OpenCV,然后添加环境变量。接着,在Qt项目的.pro文件中配置OpenCV库路径,并编写代码实现图像的美白和美颜功能,包括对比度和亮度调整。通过提供的代码示例,读者可以学习到如何将OpenCV集成到Qt应用程序中进行图像处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

环境配置学习视频来源:https://haokan.baidu.com/author/1706884117046568

代码编写复制来源:QT+OpenCV从零打造美颜软件 | 图像处理入门教程_哔哩哔哩_bilibili

电脑环境:Windows11家庭中文版+Qt5.12.12 +VS2015+可以正常开发Qt Widgets Application项目

OpenCv下载地址:Releases - OpenCV

下载完成是这样的:

 

双击进行安装:选好路径,点Extract开始安装

 安装完的样子:

 添加环境变量:

 在Qt能正常使用的情况下,在pro文件中添加外部库,库文件选:

C:\opencv\build\x64\vc15\lib\opencv_world460d.lib

添加完应该是这样的:

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

win32:CONFIG(release, debug|release): LIBS += -LC:/opencv/build/x64/vc15/lib/ -lopencv_world460
else:win32:CONFIG(debug, debug|release): LIBS += -LC:/opencv/build/x64/vc15/lib/ -lopencv_world460d
else:unix: LIBS += -LC:/opencv/build/x64/vc15/lib/ -lopencv_world460

在pro文件中手动写点内容:

INCLUDEPATH += C:/opencv/build/include
DEPENDPATH += C:/opencv/build/include

 到此环境配置结束;

以下是测试demo的代码,供后续参考复习

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QFileDialog>
#include <QImage>
#include <QPixmap>

#include <opencv2/opencv.hpp>
using namespace cv;
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    QImage MatToImage(Mat&src);
    void whiteFace(Mat&m);
private slots:
    void on_pushButton_clicked();
    void on_contrastSlider_valueChanged(int value);
    void on_brightSlider_valueChanged(int value);
    void on_pushButton_2_clicked();
    void on_pushButton_3_clicked();
private:
    Ui::MainWindow *ui;
    QString m_FileName;
    Mat  m_Mat;
    float m_Contrast;
    int  m_Brightness;

};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    m_Contrast = 1;
    m_Brightness = 0;
}

MainWindow::~MainWindow()
{
    delete ui;
}

QImage MainWindow::MatToImage(Mat &src)
{
    if(src.type() == CV_8UC3){
        QImage image((uchar*)src.data,src.cols,src.rows,static_cast<int>(src.step),QImage::Format_RGB888);
        return  image.rgbSwapped();
    }
    else{
        QImage image;
        return  image;
    }

}

void MainWindow::whiteFace(Mat &m)
{
    for (int i = 0;i<m.rows ;i++ ) {
        for (int j =0;j<m.cols ;j++ ) {
            for (int k=0;k<3 ;k++ ) {
                m.at<Vec3b>(i,j)[k]=saturate_cast<uchar>(m_Contrast*m_Mat.at<Vec3b>(i,j)[k]+m_Brightness);
            }
        }
    }
}

void MainWindow::on_pushButton_clicked()
{
    m_FileName = QFileDialog::getOpenFileName(this,"选择图片","","");
    if(m_FileName.isEmpty()){return;}
    m_Mat = imread(m_FileName.toStdString());
    QImage img = MatToImage(m_Mat);
    img = img.scaled(ui->label->geometry().width(),ui->label->geometry().height()
                     ,Qt::KeepAspectRatio,Qt::SmoothTransformation);
    QPixmap tempPixmap= QPixmap::fromImage(img);
    ui->label->setPixmap(tempPixmap);
}


void MainWindow::on_contrastSlider_valueChanged(int value)
{
    m_Contrast = 1 + (float)value/10;

    Mat result(m_Mat.rows,m_Mat.cols,m_Mat.type());
    whiteFace(result);
    QImage img = MatToImage(result);
    img = img.scaled(ui->label->geometry().width(),ui->label->geometry().height()
                     ,Qt::KeepAspectRatio,Qt::SmoothTransformation);
    QPixmap tempPixmap= QPixmap::fromImage(img);
    ui->label_4->setPixmap(tempPixmap);
}


void MainWindow::on_brightSlider_valueChanged(int value)
{
    m_Brightness = value;

    Mat result(m_Mat.rows,m_Mat.cols,m_Mat.type());
    whiteFace(result);
    QImage img = MatToImage(result);
    img = img.scaled(ui->label->geometry().width(),ui->label->geometry().height()
                     ,Qt::KeepAspectRatio,Qt::SmoothTransformation);
    QPixmap tempPixmap= QPixmap::fromImage(img);
    ui->label_4->setPixmap(tempPixmap);
}


void MainWindow::on_pushButton_2_clicked()
{
    int val = 40;
    Mat bfMat;
    Mat result(m_Mat.rows,m_Mat.cols,m_Mat.type());
    bilateralFilter(m_Mat,bfMat,val,val*2,val/2);

    GaussianBlur(bfMat,result,Size(3,3),1,1);
    addWeighted(bfMat,1.5,result,-0.5,0,result);

    QImage img = MatToImage(result);
    img = img.scaled(ui->label->geometry().width(),ui->label->geometry().height()
                     ,Qt::KeepAspectRatio,Qt::SmoothTransformation);
    QPixmap tempPixmap= QPixmap::fromImage(img);
    ui->label_4->setPixmap(tempPixmap);
}


void MainWindow::on_pushButton_3_clicked()
{
    Mat hsvMat,destFrame,result;
    cvtColor(m_Mat,hsvMat,COLOR_BGR2HSV);

    for (int i= 0;i<hsvMat.cols ;i++ ) {
        qDebug()<< hsvMat.at<Vec3b>(500,i)[0]<<hsvMat.at<Vec3b>(500,i)[1]<<hsvMat.at<Vec3b>(500,i)[2];
    }

    inRange(hsvMat,Scalar(10,10,50),Scalar(60,120,190),destFrame);

    cvtColor(destFrame,destFrame,COLOR_GRAY2BGR);
    bitwise_and(m_Mat,destFrame,result);

    QImage img = MatToImage(result);
    img = img.scaled(ui->label->geometry().width(),ui->label->geometry().height()
                     ,Qt::KeepAspectRatio,Qt::SmoothTransformation);
    QPixmap tempPixmap= QPixmap::fromImage(img);
    ui->label_4->setPixmap(tempPixmap);
}

### 如何在Qt项目中集成和使用OpenCV进行图像处理 #### QtOpenCV简介 Qt 是一个跨平台的应用程序框架,适用于开发图形用户界面(GUI),而 OpenCV 则是一个专注于实时计算机视觉的开源库。为了使两者协同工作,在Qt应用程序中利用OpenCV的强大功能来执行图像处理任务,可以借助专门设计用于连接这两个工具集的中间件——如QtOpenCV这样的轻量级开源库[^1]。 #### 集成方法概述 要实现两者的集成,通常涉及以下几个方面: - **安装依赖项**:确保已正确安装了所需的版本的Qt以及OpenCV库。 - **配置构建环境**:对于基于qmake的Qt项目来说,可以通过修改`.pro`文件中的设置轻松完成这一过程;而对于CMake管理下的工程,则需调整相应的CMakeLists.txt文件以包含必要的路径指示和其他编译选项。 - **编写代码逻辑**:创建能够调用OpenCV API并将其结果呈现给用户的GUI组件。这可能涉及到将OpenCV特有的矩阵对象(Cv::Mat)转换为适合Qt使用的图片格式(QImage)。 #### 实际操作指南 ##### 修改 `.pro` 文件 (针对 qmake 项目) ```plaintext QT += core gui opengl widgets greaterThan(QT_MAJOR_VERSION, 4): QT += widgets CONFIG += c++11 # 添加 Opencv 库目录 INCLUDEPATH += /path/to/opencv/include \ /path/to/other_headers_if_needed/ LIBS += -L/path/to/opencv/lib \ -lopencv_core \ -lopencv_imgproc \ -lopencv_features2d \ -lopencv_flann \ -lopencv_ml \ -lopencv_objdetect \ -lopencv_photo \ -lopencv_video \ -lopencv_videostab # 如果使用的是动态链接库(DLLs), 还应指定运行时路径 QMAKE_RPATHDIR += $$PWD/../lib ``` ##### 使用 `CMakeLists.txt`(针对 CMake 项目) ```cmake find_package(OpenCV REQUIRED) include_directories(${OpenCV_INCLUDE_DIRS}) add_executable(MyProject main.cpp widget.cpp ...) target_link_libraries(MyProject ${OpenCV_LIBS}) ``` ##### 编写简单的图像加载与显示例子 下面给出了一段Python风格伪代码作为概念验证,展示了如何在一个基本窗口内加载一张照片并通过按钮触发边缘检测效果: ```cpp #include <opencv2/opencv.hpp> #include "ui_mainwindow.h" class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = nullptr); private slots: void on_pushButton_clicked(); }; MainWindow::MainWindow(QWidget *parent){ ui->setupUi(this); connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(on_pushButton_clicked())); } void MainWindow::on_pushButton_clicked(){ cv::Mat img = cv::imread("example.jpg"); cvtColor(img,img,COLOR_BGR2RGB); // 调整颜色空间匹配QImage预期输入 QImage image((uchar*)img.data, img.cols, img.rows, static_cast<int>(img.step), QImage::Format_RGB888); QGraphicsScene* scene = new QGraphicsScene; QPixmap pixmap = QPixmap::fromImage(image); scene->addPixmap(pixmap); ui->graphicsView->setScene(scene); } ``` 上述示例仅作示意用途,并未考虑错误处理等问题。实际应用时应当更加严谨地对待每一个细节,比如确认文件是否存在、内存释放等重要事项。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值