clion是一个jetbrains提供的c++开发环境,和idea,pycharm等开发工具类似,界面有很多相似的地方。
clion内置了一个mingw的编译环境,自带了gcc,g++等命令,安装完clion之后,我们新建项目,它会使用内置的mingw环境。
这样,我们就不用额外安装mingw环境了。
后面为了使用opencv, 我们需要通过源码编译符合自己本机的opencv库。
需要安装cmake,这个带gui。我本机的版本是:3.14。
另一个就是需要下载windows下的opencv-4.5.5-vc14_vc15.exe,这个可执行程序解压之后,有源码和自带的opencv依赖库,依赖库,通过visual studio来搭建opencv的环境没有任何问题,但是通过clion来搭建,就各种报错。所以还是需要通过它的源码来编译安装一次。
本机可能还需要python环境,我这里安装的python3.10是可以的,没有必要使用python2版本。
前面的准备工作做好了,就可以进行编译了。
我们运行opencv-4.5.5-vc14_vc15.exe ,它可以加压出源码sources和build版本的opencv。
我们需要使用sources源码。mingw_build目录是我们新建的,用来存放opencv编译后的结果。打开cmake-gui,选择源码,构建目录,点击Configure按钮,设置生成器类型MinGW Makefiles,点击Finish开始配置:
配置过程中,可能会因为下载opencv_video_io_ffmpeg.dll和opencv_video_io_ffmpeg_64.dll失败而报错,我们根mingw_build/CMakeDownloadLog.txt 中提示的githubusercontent地址手动下载这两个文件到sources/3rdparty/ffmpeg目录下:
configure没有报错,提示done之后,就可以generate。
前面安装了clion,自带了mingw编译环境,这里为了后续执行命令方便,可以把mingw可执行程序目录加入环境变量Path中:
D:\Program Files\JetBrains\CLion 2023.1.2\bin\mingw\bin
最后还需要在命令行下执行编译命令。命令行下进入mingw_build目录,然后执行mingw32-make -j4编译,后面执行mingw32-make install安装。
mingw32-make install之后,mingw_build目录下会生成一个install目录,这里就是编译好的opencv库。
为了避免opencv程序运行是缺少动态链接库,我们把install\x64\mingw\bin目录也加入环境变量的Path中。
E:\opencv\mingw_build\install\x64\mingw\bin
在clion中新建项目,指定存储目录,会生成一个CMakeList.txt,我们根据自己编译的opencv环境来进行如下设置:
cmake_minimum_required(VERSION 3.25)
project(opencvtutorial)
set(CMAKE_CXX_STANDARD 17)
set(OpenCV_DIR E:/opencv/mingw_build/install)
find_package(OpenCV 4 REQUIRED)
include_directories(E:/opencv/mingw_build/install/include)
add_executable(opencvtutorial main.cpp)
target_link_libraries(opencvtutorial ${OpenCV_LIBS})
这里OpenCV_LIBS设置的环境变量为:
E:\opencv\mingw_build\install\x64\mingw\lib
就是编译安装之后的install\x64\mingw\lib目录。
CMakeList.txt主要添加包含目录,就是程序中引入的opencv相关头文件,不会报找不到问题,设置库目录,就是把opencv相关的lib依赖加入项目中,避免编译报错。
编写代码:
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/dnn/dnn.hpp>
using namespace std;
using namespace cv;
dnn::Net net;
int main() {
cout << CV_VERSION << endl;
string onnxfile = "E:\\workspace\\python\\aitutorial\\test.onnx";
net = dnn::readNetFromONNX(onnxfile);
if (!net.empty()) {
float value = 1024;
Mat inputBlob = Mat(1, 1, CV_32F, Scalar(value));
net.setInput(inputBlob, "input");
Mat output = net.forward("output");
cout << "input value : " << value << endl;
cout << "output : " << output.at<float>(0, 0) << endl;
}
waitKey(0);
return 0;
}
运行打印结果如下:
我通过直接下载的opencv-4.5.5-vc14_vc15.exe运行生成的opencv/build结果,可以通过visual studio配置并成功运行opencv示例,但是在clion这里怎么都不行,所以就通过mingw环境编译了一次opencv,很幸运,最后成功了,看来不同的工具对应的环境还是差别很大的。