当前位置: 首页 > news >正文

Qt使用OpenCv

环境配置学习视频来源: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);
}

相关文章:

  • 【JavaEE进阶系列 | 从小白到工程师】泛型的详细介绍使用与类型通配符,直接上手
  • java毕业设计论坛管理系统mybatis+源码+调试部署+系统+数据库+lw
  • k8s对接ceph,ceph-csi方式
  • Kubernetes控制平面组件:Kubelet
  • 忘记背后,努力面前【开学季flag】
  • 2022-09-04 瞒春 学习笔记
  • 谷歌?亲斤手不推荐 选它就对了
  • Ubuntu20.04下载opencv3.4--未完善
  • (待修改)PyG安装步骤
  • vue2中vant适配-把px都换算成rem
  • 猿创征文|Spring5梦开始的地方:入门必看
  • [中秋特别定制版本]绝美登录页面搭配[登录数据存储到服务器](服务器宝塔数据库开通+短信服务开通+后端redis验证码缓存)
  • 【笔记】文献阅读[YOLOV1]-You_only_look_once_Unified_real-time_object_detection
  • 基于STM32与ESP8266的太空人WiFi天气时钟(代码开源)
  • leetcode 83. Remove Duplicates from Sorted List 删除排序链表中的重复元素(简单)
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • Babel配置的不完全指南
  • docker python 配置
  • Making An Indicator With Pure CSS
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • opencv python Meanshift 和 Camshift
  • orm2 中文文档 3.1 模型属性
  • text-decoration与color属性
  • TypeScript迭代器
  • ViewService——一种保证客户端与服务端同步的方法
  • 第2章 网络文档
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 你不可错过的前端面试题(一)
  • 以太坊客户端Geth命令参数详解
  • Java数据解析之JSON
  • raise 与 raise ... from 的区别
  • 组复制官方翻译九、Group Replication Technical Details
  • ​ubuntu下安装kvm虚拟机
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • (1)常见O(n^2)排序算法解析
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (三) diretfbrc详解
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • (生成器)yield与(迭代器)generator
  • (十)T检验-第一部分
  • (算法)Game
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • (转)创业家杂志:UCWEB天使第一步
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • . Flume面试题
  • .apk 成为历史!