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

第一个Qt开发的OpenCV程序

OpenCV计算机视觉开发实践:基于Qt C++ - 商品搜索 - 京东

下载安装Qt:https://download.qt.io/archive/qt/5.14/5.14.2/qt-opensource-windows-x86-5.14.2.exe

下载安装OpenCV:https://opencv.org/releases/

下载安装CMake:Download CMake

这些软件安装完成完成后,我们可以开始用Qt编写OpenCV程序了。

【例2.2】第一个Qt开发的OpenCV程序

(1)在桌面上找到Qt Creator 4.11.1 (Community),双击打开Qt Creator,我们准备新建一个控制台项目,项目名是hello。在Qt Creator主界面的Projects旁点击New按钮,如图2-31所示。

图2-31

然后在出现的“新建项目”,选中“Qt Console Application”,如图2-32所示。

图2-32

点击Choose按钮,然后输入项目名称和创建路径,路径建议用全英文路径,如图2-33所示。

图2-33

随后连续点击下一步,直到向导结束出现编辑窗口,我们可以看到一个自动生成了一个main函数了。我们来简单修改下程序,使之既能输出图形对话框,又能在命令窗口中输出字符串,代码如下:

#include <QApplication>
#include <QMessageBox>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv); 		//定义应用程序对象
    QString text = "helloworld"; 		//定义一个字符串并赋值
    // 创建并显示消息对话框
    QMessageBox::information(nullptr, "hi", text);
    puts("helloworld"); 					//在控制台窗口输出字符串
    return a.exec(); 					//进入事件循环
}

QApplication是Qt应用程序中必不可少的一部分,它负责管理应用程序的生命周期,处理事件循环,设置应用的整体样式等。QString是Qt框架中处理文本数据的核心类之一。它提供了强大的字符串处理能力,支持多种文本编码和操作,我们定义字符串text,并通过QMessageBox::information将其在消息对话框上输出。然后,用C函数puts在控制台上输出字符串helloworld。程序很简单,没啥好讲,若学过Qt,一看便懂。

由于这个项目原本是控制台项目,因此如果要输出图形消息框,还需要在项目配置文件中进行一些修改,打开hello.pro,在文件开头添加“QT+=widgets”,如下所示:

QT+=widgets

Widgets是在Qt中创建用户界面的主要元素。Widgets可以显示数据和状态信息,接收用户输入,并为应该组合在一起的其他小部件提供容器。QT+的意思是加上widgets模块。如果此时运行程序,则可以出现消息对话框并可以在控制台上输出字符串helloworld。

(2)Qt项目能运行了,但还不是一个OpenCV程序,下面我们加上OpenCV代码。首先要在工程配置文件中添加OpenCV库和头文件的路径,在hello.pro的末尾添加代码如下:

INCLUDEPATH += D:/opencvBuild/install/include/

LIBS += -L D:/opencvBuild/install/x64/mingw/lib/libopencv_*.a

宏INCLUDEPATH用来指定头文件所在路径,LIBS用来指定库文件所在路径,两个宏都要用一个+,并且LIBS+=右边要用-L来指定路径,这个写法和gcc指定库路径写法类似。

下面我们添加源代码,在Qt Creator中打开main.cpp,输入代码如下:

#include <QApplication>
#include <QMessageBox>
#include <opencv2/opencv.hpp>
#include <QDebug>
#include <QDir>
#include <iostream>

using namespace cv;  //所有OpenCV类都在命名空间cv下
using namespace std;

void f()   //自定义函数,实现两幅图片混合
{
    double alpha = 0.5; double beta; double input;
    Mat src1, src2, dst; //创建Mat对象,Mat用于存储图片的矩阵类,dst用于存放混合后的图片

    //提示用户输入第一幅图片的权值alpha
    qDebug() <<"线性混合:";
    qDebug() << "输入第一幅图片的权重alpha [0.0-1.0]: ";
    cin >> input;   //用户输入

    //如果用户输入值介于0和1之间,则用该输入值作为alpha的值
    if (input >= 0 && input <= 1)
        alpha = input;

    QString currentPath = QDir::currentPath();  //获取当前路径
    qDebug() <<"当前路径是:"<< currentPath;

    //读取两幅大小必须一样的JPG图片
    src1 = imread("p1.jpg");
    src2 = imread("sbh.jpg");

    if (src1.empty()) { cout << "Error loading src1" << endl; return; }
    if (src2.empty()) { cout << "Error loading src2" << endl; return; }

    beta = (1.0 - alpha);
    addWeighted(src1, alpha, src2, beta, 0.0, dst);//将图1与图2线性混合
    imshow("res",dst); 	//显示混合后的图片
    waitKey(0); 			//等待按键响应后退出,0改为5000就是5秒后自动退出
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);   	//定义应用程序对象
    QString text = "helloworld";  	//定义一个字符串并赋值

    cv::Mat image = cv::imread("d:/test.jpg");  //读取d盘上test.jpg文件
    if (image.empty()) { 			//判断文件是否为空
       return -1;  					//为空返回-1,结束程序
    }
   std::string strTitle = text.toStdString(); //把QString字符串转为std::string字符串
    
   namedWindow(strTitle, cv::WINDOW_AUTOSIZE); //创建一个标题是strTitle窗口
   imshow(strTitle, image); 	//在标题为strTitle的窗口中显示图像
   waitKey(0); 					//等待用户按键
   destroyWindow(strTitle);		//销毁标题是strTitle的窗口

   // 创建并显示消息对话框
   QMessageBox::information(nullptr, "hi", text);
   f();
   return a.exec();
}

上述代码的自定义函数f功能将图片p1.jpg和sbh.jpg两幅图片进行混合,它们的大小必须一样。这两幅图片必须复制到D:\ex\build-hello-Desktop_Qt_5_14_2_MinGW_64_bit-Debug目录下。其中,OpenCV库中的API函数imread用来从文件中读取图片。API函数addWeighted用于将两张相同大小、相同类型的图片进行融合,第二个参数alpha表示第一幅图片所占的权重,第四个参数beta表示第2个图片所占的权重。权重越大的图片显示得越多,比如我们输入alpha为0.9,则主要显示第一幅图片。main中的代码比较简单,主要是从d盘读取一个图片文件test.jpg,然后调用f。

(2)复制动态链接库到exe文件所在文件夹。首先我们打开以下路径来查看exe文件:

D:\ex\build-hello-Desktop_Qt_5_14_2_MinGW_64_bit-Debug\debug

 

图2-4

这个路径是我们程序生成的hello.exe文件所在的路径,hello.exe是一个Windows下的可执行文件,是不是觉得很神奇,MinGW能在编译阶段加载Linux下的静态库(.a)文件,最终生成了Windows下的.exe文件。但hello.exe还需要加载OpenCV源码编译出来的动态链接库后才能运行。打开目录D:\opencvBuild\install\x64\mingw\bin\,把该目录下的libopencv_core4100.dll、libopencv_highgui4100.dll、libopencv_imgcodecs4100.dll和libopencv_imgproc4100.dll四个文件复制到hello.exe文件所在文件夹。

(3)运行程序,在Qt Creator中点击点击左下角的三角运行按钮或直接按快捷键Ctrl+R来运行项目。运行结果如图2-4所示。

随便按一个键盘键,则会显示helloworld信息框,关闭信息框,会让我们在控制台窗口上输入权值,这里我们输入0.9,可以看到输入第一幅图片权重是0.9后,sbh.jpg显示的效果就淡了很多,如图2-5所示。

图2-5

如图图片不能加载,请确认p1.jgp和sbh.jpg是否复制到以下路径:

D:\ex\build-hello-Desktop_Qt_5_14_2_MinGW_64_bit-Debug

以及,test.jpg是否复制到d盘。在这个程序中,我们即加载了绝对路径下的图片文件(test.jpg),也加载了当前路径下的图片文件(p1.jpg和sbh.jpg)。这3个文件平时可以到工程目录的res文件夹下找到。

至此,基于Qt Creator的OpenCV的开发环境搭建起来了。

相关文章:

  • 关税扰动下市场波动,如何寻找确定性的长期之锚?
  • 一周学会Pandas2 Python数据处理与分析-Pandas2读取CSV
  • 榕壹云无人共享系统:基于SpringBoot+MySQL+UniApp的物联网共享解决方案
  • 可以使用多种AI模型自动化制作web和手机应用软件的利器:bolt.diy
  • (十五)安卓开发中不同类型的view之间继承关系详解
  • 去重新闻数据中重复的正文内容(body 字段),并把唯一的新闻内容保存到一个新的 JSON 文件中
  • Ubuntu 软件卸载与清理终极指南
  • 在项目中,引入【全局异常处理器】
  • Spring IoC深度解析:掌控Bean存储艺术与分层架构的智慧​​
  • 通过代码获取接口文档工具
  • 智膳优选 | AI赋能的智慧食堂管理专家 —— 基于飞书多维表格和扣子(Coze)的智能解决方案
  • 医院PACS系统源码
  • 初级社会工作者考试精选题库
  • react+Tesseract.js实现前端拍照获取/选择文件等文字识别OCR
  • TPS入门DAY04 服务器篇
  • 文件内容课堂总结
  • 14 nginx 的 dns 缓存的流程
  • 为了避免unboundLocalError和为什么X的值一直不变呢?
  • Gartner发布软件供应链安全市场指南:软件供应链安全工具的8个强制功能、9个通用功能及全球29家供应商
  • 如何查看linux history命令文件
  • 苏州网站建设科技有限公司/360优化大师app
  • 网页设计字体代码/杭州seo
  • 网站中的二级菜单怎么做23/网店推广培训
  • 网站开发前台和后台/营销培训机构哪家最专业
  • IC 网站建设/关联词有哪些
  • Django可以做门户网站吗/绍兴seo排名收费