在Windows上用MinGW编译OpenCV项目运行全流程

2024-06-22 09:44

本文主要是介绍在Windows上用MinGW编译OpenCV项目运行全流程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、准备软件

  1. OpenCV源码
  2. CMake工具
  3. MinGW工具链(需要选用 posix 线程版本:原因见此)

二、操作步骤

官网提供了VC16构建版本的二进制包,但是没有给出GCC编译的版本。所以如果使用MinGW进行构建,那就只能从源码开始构建了。

但是如果你愿意用MSVC的话,那就可以跳过编译的步骤(当然也可以不跳过),直接使用二进制文件,进行后面的软件设计:

OpenCV源码
CMake
mingw32-make
头文件
.a
.dll
发布版
源程序
gcc
exe
运行结果

2.1 使用cmake

打开 cmake-gui.exe

选择目录、选择编译器。通常应该能自动选上MinGW,如果没有选上的话,可能MinGW路径没有加入环境变量:

cmake-configure

输入 world,打开 BUILD_opencv_world 的开关,这控制着将所有有关OpenCV的函数全部输出到一个文件中。

如果你不需要这一点,也可以不选。

中途可能报错,但是没有关系,OpenCV的主要函数功能应该都是可以编译通过的:

cmake-generate

2.2 使用mingw

在build目录下打开cmd,运行下面两行。其中 -j8 表示启用8线程并行编译,也可以不加:

mingw32-make -j8
mingw32-make install

第一条命令会运行很长很长时间。

第二条命令会创建一个名为 install 的文件夹,目录结构大概是这个样子:

编译OpenCV

这个文件夹路径要记住,后面要用。

2.3 编写OpenCV程序

写一段计算两个旋转矩形的IoU的算法,其中 rotatedRectIOU 函数来自于 ~\opencv\modules\dnn\src\nms.cpp 文件。

但是由于原本的这个函数是 inline 的,所以无法直接调用。

我这里直接复制过来了:

/* main.cpp */#include "opencv2/opencv.hpp"using namespace cv;float rotatedRectIOU(const RotatedRect& a, const RotatedRect& b) {std::vector<Point2f> inter;int res = rotatedRectangleIntersection(a, b, inter);if (inter.empty() || res == INTERSECT_NONE)return 0.0f;if (res == INTERSECT_FULL)return 1.0f;float interArea = contourArea(inter);return interArea / (a.size.area() + b.size.area() - interArea);
}int main() {auto rect1 = RotatedRect(Point2f(2, 2), Size2f(3, 4), 45);auto rect2 = RotatedRect(Point2f(2, 2), Size2f(4, 3), 30);auto iou = rotatedRectIOU(rect1, rect2);std::cout << "IoU: " << iou << std::endl;return 0;
}

测试输入的两个旋转矩形,画出来是这么个效果:

旋转矩形相交
我拿尺子测量了一下,矩形面积12平方 ,平行四边形面积9.3平方。

按照定义,IoU应大致为:

I o U = 9.3 / ( 12 + 12 − 9.3 ) = 0.633 IoU = 9.3 / (12 + 12 - 9.3) = 0.633 IoU=9.3/(12+129.3)=0.633

拿程序验证一下,编写 dist.bat 文件,其中 ^ 是转义的意思,可以方便将多行代码写到一行内:

@echo offset install=<INSTALL_FOLDER>g++ main.cpp -o main.exe ^-I %install%/include ^-L %install%/x64/mingw/lib ^-l opencv_world490

其中 -I 控制的是头文件目录,-L 控制的是库文件目录,-l 是具体要链接的库文件的名字(去掉开头的 lib 和后面的 .dll.a 后缀)。

INSTALL_FOLDER:这里填写前面 mingw32-make install 命令生成出来的文件夹路径。如果操作步骤都和我一致的话,路径应该是 ~/opencv/build/install

mingw:这里使用MinGW编译,所以文件夹是在 mingw 路径。如果使用MSVC编译,文件夹路径应该类似于是 vc16

world:前面勾选了 BUILD_opencv_world 开关,所以这里会是 opencv_world 这个库文件名。如果你前面没有勾选,则你在程序中引用了哪个库文件的函数,则需要加上哪个库的名字。

490:我这里使用的是 4.9.0 的版本,所以数字编号是 490。如果版本不同,需要根据实际情况修改。

2.4 运行程序

运行程序,需要将 ~\install\x64\mingw\bin 目录下的 libopencv_world490.dll 文件拷贝到运行程序的同级目录下。

最后运行 main.exe ,返回结果为:

IoU: 0.634597

和绘图计算结果验证正确。

这篇关于在Windows上用MinGW编译OpenCV项目运行全流程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1083936

相关文章

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

opencv图像处理之指纹验证的实现

《opencv图像处理之指纹验证的实现》本文主要介绍了opencv图像处理之指纹验证的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录一、简介二、具体案例实现1. 图像显示函数2. 指纹验证函数3. 主函数4、运行结果三、总结一、

一文教你如何将maven项目转成web项目

《一文教你如何将maven项目转成web项目》在软件开发过程中,有时我们需要将一个普通的Maven项目转换为Web项目,以便能够部署到Web容器中运行,本文将详细介绍如何通过简单的步骤完成这一转换过程... 目录准备工作步骤一:修改​​pom.XML​​1.1 添加​​packaging​​标签1.2 添加

tomcat多实例部署的项目实践

《tomcat多实例部署的项目实践》Tomcat多实例是指在一台设备上运行多个Tomcat服务,这些Tomcat相互独立,本文主要介绍了tomcat多实例部署的项目实践,具有一定的参考价值,感兴趣的可... 目录1.创建项目目录,测试文China编程件2js.创建实例的安装目录3.准备实例的配置文件4.编辑实例的

python+opencv处理颜色之将目标颜色转换实例代码

《python+opencv处理颜色之将目标颜色转换实例代码》OpenCV是一个的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上,:本文主要介绍python+ope... 目录下面是代码+ 效果 + 解释转HSV: 关于颜色总是要转HSV的掩膜再标注总结 目标:将红色的部分滤

springboot集成Deepseek4j的项目实践

《springboot集成Deepseek4j的项目实践》本文主要介绍了springboot集成Deepseek4j的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录Deepseek4j快速开始Maven 依js赖基础配置基础使用示例1. 流式返回示例2. 进阶

SpringBoot项目启动报错"找不到或无法加载主类"的解决方法

《SpringBoot项目启动报错找不到或无法加载主类的解决方法》在使用IntelliJIDEA开发基于SpringBoot框架的Java程序时,可能会出现找不到或无法加载主类com.example.... 目录一、问题描述二、排查过程三、解决方案一、问题描述在使用 IntelliJ IDEA 开发基于

SpringBoot项目使用MDC给日志增加唯一标识的实现步骤

《SpringBoot项目使用MDC给日志增加唯一标识的实现步骤》本文介绍了如何在SpringBoot项目中使用MDC(MappedDiagnosticContext)为日志增加唯一标识,以便于日... 目录【Java】SpringBoot项目使用MDC给日志增加唯一标识,方便日志追踪1.日志效果2.实现步

Windows Server服务器上配置FileZilla后,FTP连接不上?

《WindowsServer服务器上配置FileZilla后,FTP连接不上?》WindowsServer服务器上配置FileZilla后,FTP连接错误和操作超时的问题,应该如何解决?首先,通过... 目录在Windohttp://www.chinasem.cnws防火墙开启的情况下,遇到的错误如下:无法与

Java终止正在运行的线程的三种方法

《Java终止正在运行的线程的三种方法》停止一个线程意味着在任务处理完任务之前停掉正在做的操作,也就是放弃当前的操作,停止一个线程可以用Thread.stop()方法,但最好不要用它,本文给大家介绍了... 目录前言1. 停止不了的线程2. 判断线程是否停止状态3. 能停止的线程–异常法4. 在沉睡中停止5