一、准备软件
- OpenCV源码
- CMake工具
- MinGW工具链(需要选用 posix 线程版本:原因见此)
二、操作步骤
官网提供了VC16构建版本的二进制包,但是没有给出GCC编译的版本。所以如果使用MinGW进行构建,那就只能从源码开始构建了。
但是如果你愿意用MSVC的话,那就可以跳过编译的步骤(当然也可以不跳过),直接使用二进制文件,进行后面的软件设计:
2.1 使用cmake
打开 cmake-gui.exe
。
选择目录、选择编译器。通常应该能自动选上MinGW,如果没有选上的话,可能MinGW路径没有加入环境变量:
输入 world
,打开 BUILD_opencv_world
的开关,这控制着将所有有关OpenCV的函数全部输出到一个文件中。
如果你不需要这一点,也可以不选。
中途可能报错,但是没有关系,OpenCV的主要函数功能应该都是可以编译通过的:
2.2 使用mingw
在build目录下打开cmd,运行下面两行。其中 -j8
表示启用8线程并行编译,也可以不加:
mingw32-make -j8
mingw32-make install
第一条命令会运行很长很长时间。
第二条命令会创建一个名为 install
的文件夹,目录结构大概是这个样子:
这个文件夹路径要记住,后面要用。
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+12−9.3)=0.633
拿程序验证一下,编写 dist.bat
文件,其中 ^
是转义的意思,可以方便将多行代码写到一行内:
@echo off
set 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
和绘图计算结果验证正确。