opencv的编译安装实在过于折磨人,较长的编译时间、一堆莫名其妙的报错、难以访问的资源和网上杂乱不全的解决办法足以劝退一名想要尝试的小白,本人在历经无数次编译失败后尝试使用已编译的库进行链接并在成功后进行总结,希望能帮助到同样被折磨的人。
文件和软件准备
首先不同于网上的各种教程,本教程无需下载过多的文件和软件,也完全不用配置环境变量!
没错,不用你单独下载cmake,mingw,opencv源代码或者exe,你只需要有一个Clion和一份编译过的opencv库。
编译过的opencv库可以从这个网站下载:
这是本篇文章唯一需要你下载的东西!
在readme文件中你可以自己选择要下载的版本,然后下载压缩包并解压到你想要的目录中。
解压
这里我以4.5.5版本举例,解压到如下路径
解压完成后尝试用clion配置
添加环境变量(可选)
为了便于代码中相对路径的使用,这里比较建议在系统环境变量中添加这一项:
你的解压文件夹\\OpenCV-MinGW-Build-OpenCV-4.5.5-x64\\x64\\mingw\\bin
我这里的例子就是D:\\runtime_third_part_library\\OpenCV-MinGW-Build-OpenCV-4.5.5-x64\\x64\\mingw\\bin
当然不添加也可以,不过后面就会多一步将这个文件夹加入clion调试的工作目录(working directory)来使代码能链接到库文件
简单编写CMakeLists
新建一个项目opencv_test,编辑cmakelists
cmake_minimum_required(VERSION 3.25)
project(opencv_test)
# 设置寻找opencv的路径,需要替换成你自己的对应路径
set(OpenCV_DIR D:\\runtime_third_part_library\\OpenCV-MinGW-Build-OpenCV-4.5.5-x64\\x64\\mingw\\lib)
set(CMAKE_CXX_STANDARD 17)
add_executable(opencv_test main.cpp)
# OpenCV_INCLUDE_DIRS 是预定义变量,代表OpenCV库的头文件路径,直接复制即可
include_directories(${OpenCV_INCLUDE_DIRS})
# OpenCV_LIBS 是预定义变量,代表OpenCV库的lib库文件,不一定要指定opencv的版本
find_package(OpenCV 4.5.5 REQUIRED)
# 链接编译过的库
target_link_libraries(opencv_test ${OpenCV_LIBS})
测试代码
完成上一步后编写测试代码(如果添加了环境变量这里可以直接通过,如果没添加的话会debug模式报-1的错误码,后续还有一步)
#include <iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
Mat src;// 初始化一个操作对象
src = imread("E:\\Pictures\\code_highlight_tool.png");// 自己找一张图片,路径不能有中文
if (!src.data)// 判断图片是否加载进来
{
cout << "不能加载图片" << endl;
return -1;
}
namedWindow("loaded img", WINDOW_AUTOSIZE);
imshow("loaded img", src); // ""内命名一致,才能显示在一个窗口
waitKey(0);
return 0;
}
debug运行报错退出码-1
最后一步(前面添加了环境变量并且成功测试的就可以退出了)
此时参考另一篇文章:CLion中使用OpenCV的坑记录帖
旧版ui可以进入这里,新版ui请自行探索(因为我没用过新版ui)
将里面的Working directory一项改为你解压的opencv文件夹下的x64\mingw\bin目录(前面添加到环境变量的路径)
完成后尝试运行
成功运行!
注意事项!
如果你是使用working directory而不是添加环境变量的方式使代码链接到opencv的库文件,那么你的代码中只能使用绝对路径而不能使用相对路径,因为你的项目启动路径是设置的working directory,会导致找不到文件。因此我还是更加建议使用环境变量的方式。