网上,包括书上有很多人云亦云的源码编译方式,不能说不正确但是有很多弯弯绕绕(坑)。最近刚做完了一个识别项目的第一个版本,总结了一下.。为了写这篇文章,特意重新在自己电脑搭了一遍开发环境。 最权威的方式是官方文档介绍
以windows下开发为例子,我们编译一个opencv + contrib 满血lib。
编译
-
vs,c++环境。 -
cmake-gui,其实只要 cmake (version >=3.9.1) 装一个gui主要是方便以后做裁剪编译。 下载地址 安装时选择自动加入path路径,不然你要手动添加一下。 -
安装git ,版本大于等于2.14.1 主要是git bash,一般我是让idea自动安装的。
以上是主要的,次要的你可以还要安装python3(带二进制调试),jdk等。
- 给一个目录安装,建一个installOCV.sh的文件,写入
#!/bin/bash -e
myRepo=$(pwd)
CMAKE_GENERATOR_OPTIONS=-G"Visual Studio 17 2022"
if [ ! -d "$myRepo/opencv" ]; then
echo "cloning opencv"
git clone https://github.com/opencv/opencv.git
else
cd opencv
git pull --rebase
cd ..
fi
if [ ! -d "$myRepo/opencv_contrib" ]; then
echo "cloning opencv_contrib"
git clone https://github.com/opencv/opencv_contrib.git
else
cd opencv_contrib
git pull --rebase
cd ..
fi
RepoSource=opencv
mkdir -p build_opencv
pushd build_opencv
CMAKE_OPTIONS=(-DBUILD_PERF_TESTS:BOOL=OFF -DBUILD_TESTS:BOOL=OFF -DBUILD_DOCS:BOOL=OFF -DWITH_CUDA:BOOL=OFF -DBUILD_EXAMPLES:BOOL=OFF -DINSTALL_CREATE_DISTRIB=ON)
set -x
cmake "${CMAKE_GENERATOR_OPTIONS[@]}" "${CMAKE_OPTIONS[@]}" -DOPENCV_EXTRA_MODULES_PATH="$myRepo"/opencv_contrib/modules -DCMAKE_INSTALL_PREFIX="$myRepo/install/$RepoSource" "$myRepo/$RepoSource"
echo "************************* $Source_DIR -->debug"
cmake --build . --config debug
echo "************************* $Source_DIR -->release"
cmake --build . --config release
cmake --build . --target install --config release
cmake --build . --target install --config debug
popd
因为脚本有下载,所以最好在环境变量配置一下 key =http_proxy value=http://127.0.0.1:1080 key =https_proxy value=http://127.0.0.1:1080
- 双击执行sh
官网建议:Drink a coffee or two… opencv is ready : That’s all! 个人经验,2杯咖啡是不够,也有可能是我电脑不好! 完成后在目录下生成一个 install文件
使用
设置环境变量 XXXX\install\opencv\x64\vc17\bin XXXX\install\opencv\x64\vc17\lib 重启刷新环境变量 新建一个工程,CMakeLists.txt,类似这样
project(cnn)
set(OpenCV_DIR "XXXX/install/opencv")
find_package(OpenCV REQUIRED)
if(Opencv_FOUND)
message(STATUS "The Opecv lib is found!")
endif()
add_executable(cnn main.cpp pca.cpp pca.h)
target_link_libraries(cnn ${OpenCV_LIBS})
测试一下,我们引入人脸模块看会不会报错
#include <iostream>
#include "opencv2/opencv.hpp"
#include "opencv2/face.hpp"
using namespace std;
using namespace cv;
using namespace face;
int main() {
std::cout<< "loading" <<std::endl;
Mat foo = imread("IMG_2746.jpg");
imshow("foo",foo);
Ptr<BasicFaceRecognizer> model = EigenFaceRecognizer::create();
std::cout<< cv::getBuildInformation() <<std::endl;
waitKey(0);
return 0;
}
附android sdk的简单使用
最简单就是找好心人编译好打包好的aar,github应该有。
官方原版的,其实也是不要又是拷贝so,又是引入include的。 具体可以看官方OpenCV-android-sdk\sdk 目录下build.gradle上面的注释。 简单说就是sdk这个文件夹可以作为android 模块加入工程。然后,要用的时候在CMakeList中这样:
find_package(OpenCV 4.5 REQUIRED java)
跟上面一样的用法,因为gradle多了一种选择,可以把opencvDir设置在gradle里。
更简单就是我在用的,弄一个私人nexus,用什么导什么,新项目把自己的module组装一下。
至于,NDK 裁剪+编译,什么时候有空再讲!
|