查看Ubuntu上面已经安装的opencv的版本
pkg-config --modversion opencv
源码编译
- 源码下载, 注意其中的
batch
, 选择一致。
git clone https://github.com/opencv/opencv.git
# 下面的仓库为第三方库,可以根据需要选择
git clone https://github.com/opencv/opencv_contrib.git
openEuler上源码安装
- 安装依赖
sudo dnf install eigen3
sudo dnf install cmake g++
比较简单的编译选项
mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D INSTALL_PYTHON_EXAMPLES=OFF \
-D INSTALL_C_EXAMPLES=OFF \
-D OPENCV_ENABLE_NONFREE=ON \
-D BUILD_NEW_PYTHON_SUPPORT=ON \
-D OPENCV_GENERATE_PKGCONFIG=ON \
-D OPENCV_PC_FILE_NAME=opencv4.pc \
-D WITH_TBB=ON \
-D ENABLE_FAST_MATH=1 \
-D CUDA_FAST_MATH=1 \
-D WITH_CUBLAS=1 \
-D WITH_CUDA=ON \
-D BUILD_opencv_cudacodec=OFF \
-D WITH_CUDNN=OFF \
-D OPENCV_DNN_CUDA=OFF \
-D CUDA_ARCH_BIN=7.5 \
-D WITH_V4L=ON \
-D WITH_QT=OFF \
-D WITH_OPENGL=ON \
-D WITH_QT=OFF \
-D WITH_GSTREAMER=OFF \
-D WITH_FFMPEG=OFF \
-D WITH_OPENCL=ON \
-D OPENCV_ENABLE_NONFREE=ON \
-D ENABLE_PRECOMPILED_HEADERS=YES \
-D EIGEN_INCLUDE_PATH=/usr/include/eigen3 \
-D BUILD_EXAMPLES=OFF ..
cmake --build ./ -j
#安装的路径为指定的 CMAKE_INSTALL_PREFIX=/usr/local 路径
cmake --install ./
# 在aarch 64 上面指定相关的编译选项
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D INSTALL_PYTHON_EXAMPLES=OFF \
-D INSTALL_C_EXAMPLES=OFF \
-D OPENCV_ENABLE_NONFREE=ON \
-D BUILD_NEW_PYTHON_SUPPORT=OFF \
-D OPENCV_GENERATE_PKGCONFIG=ON \
-D OPENCV_PC_FILE_NAME=opencv4.pc \
-D WITH_TBB=OFF \
-D ENABLE_FAST_MATH=1 \
-D CUDA_FAST_MATH=1 \
-D WITH_CUBLAS=OFF \
-D WITH_CUDA=OFF \
-D BUILD_opencv_cudacodec=OFF \
-D WITH_CUDNN=OFF \
-D OPENCV_DNN_CUDA=OFF \
-D WITH_V4L=ON \
-D WITH_QT=OFF \
-D WITH_OPENGL=ON \
-D WITH_QT=OFF \
-D WITH_GSTREAMER=OFF \
-D WITH_FFMPEG=OFF \
-D WITH_OPENCL=ON \
-D ENABLE_PRECOMPILED_HEADERS=YES \
-D EIGEN_INCLUDE_PATH=/usr/include/eigen3 \
-D BUILD_EXAMPLES=OFF ..
关于其中的 -j 选项说明
关于-j选项的几点说明:
1. -j后跟的数字表示要使用的最大线程数。CMake会根据系统 cpu 核数和其他限制自动确定实际要使用的线程数。
2. 如果不指定-j,CMake会自动根据系统环境设置默认的线程数。通常等于cpu核数加一。
3. 指定的最大线程数-j值不代表CMake一定会使用指定数量的线程。它会根据项目设置、依赖关系等因素自动调节实际使用的线程数,但不会超过指定的最大值。
4. -j的值设置得太高不一定能提高构建速度,反而可能对I/O造成压力而降低效率。通常设置为cpu核数的1-2倍就可以达到较好的效果。
5. 在多核系统下,合理设置-j值可以充分利用cpu并行能力,提高构建速度。但在单核系统下,设置-j反而可能延长构建时间,推荐省略-j选项让CMake自动判断。
选定视频编解码框架编译到opencv中
安装gstreamer
sudo apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libgstreamer-plugins-bad1.0-dev gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-qt5 gstreamer1.0-pulseaudio
# 检查安装
pkg-config --cflags --libs gstreamer-1.0
安装ffmpeg
sudo apt install ffmpeg
sudo apt-get install libavcodec-dev libavformat-dev libavutil-dev libswscale-dev libavresample-dev
编译配置
cd opencv
mkdir buildcd build
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D OPENCV_GENERATE_PKGCONFIG=ON \
-D BUILD_EXAMPLES=OFF \
-D INSTALL_PYTHON_EXAMPLES=OFF \
-D INSTALL_C_EXAMPLES=OFF \
-D PYTHON_EXECUTABLE=$(which python2) \
-D BUILD_opencv_python2=OFF \
-D PYTHON3_EXECUTABLE=$(which python3) \
-D PYTHON3_INCLUDE_DIR=$(python3 -c "from distutils.sysconfig import get_python_inc; print(get_python_inc())") \
-D PYTHON3_PACKAGES_PATH=$(python3 -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())") \
-D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules/ \
-D WITH_GSTREAMER=ON \
-D WITH_FFMPEG=ON \
-D WITH_CUDA=ON \
..
查看已经安装的opencv库的编译选项
import cv2
print(cv2.getBuildInformation())
关于OpenGL的软件包的支持
sudo apt install mesa-utils
glxinfo | grep OpenGL
nvidia jetson 源码安装
- https://github.com/AastaNV/JEP/blob/master/script/install_opencv4.5.0_Jetson.sh
- DK nvidia jetson agx orin dk
- soft r36
- opencv 4.7 https://gitcode.net/opencv/opencv
- error
/home/orin/workspace/opencv/opencv-4.7.0/modules/dnn/src/layers/../cuda4dnn/primitives/region.hpp: In instantiation of ‘void cv::dnn::cuda4dnn::RegionOp<T>::forward(const std::vector<cv::Ptr<cv::dnn::dnn4_v20221220::BackendWrapper> >&, const std::vector<cv::Ptr<cv::dnn::dnn4_v20221220::BackendWrapper> >&, cv::dnn::cuda4dnn::csl::Workspace&) [with T = __half]’:
/home/orin/workspace/opencv/opencv-4.7.0/modules/dnn/src/layers/../cuda4dnn/primitives/region.hpp:94:14: required from here
/home/orin/workspace/opencv/opencv-4.7.0/modules/dnn/src/layers/../cuda4dnn/primitives/region.hpp:124:35: error: ambiguous overload for ‘operator>’ (operand types are ‘__half’ and ‘int’)
124 | if (nms_iou_threshold > 0) {
| ~~~~~~~~~~~~~~~~~~^~~
/home/orin/workspace/opencv/opencv-4.7.0/modules/dnn/src/layers/../cuda4dnn/primitives/region.hpp:124:35: note: candidate: ‘operator>(int, int)’ (built-in)
/home/orin/workspace/opencv/opencv-4.7.0/modules/dnn/src/layers/../cuda4dnn/primitives/region.hpp:124:35: note: candidate: ‘operator>(long long unsigned int, int)’ (built-in)
/home/orin/workspace/opencv/opencv-4.7.0/modules/dnn/src/layers/../cuda4dnn/primitives/region.hpp:124:35: note: candidate: ‘operator>(long long int, int)’ (built-in)
/home/orin/workspace/opencv/opencv-4.7.0/modules/dnn/src/layers/../cuda4dnn/primitives/region.hpp:124:35: note: candidate: ‘operator>(long unsigned int, int)’ (built-in)
/home/orin/workspace/opencv/opencv-4.7.0/modules/dnn/src/layers/../cuda4dnn/primitives/region.hpp:124:35: note: candidate: ‘operator>(long int, int)’ (built-in)
/home/orin/workspace/opencv/opencv-4.7.0/modules/dnn/src/layers/../cuda4dnn/primitives/region.hpp:124:35: note: candidate: ‘operator>(unsigned int, int)’ (built-in)
/home/orin/workspace/opencv/opencv-4.7.0/modules/dnn/src/layers/../cuda4dnn/primitives/region.hpp:124:35: note: candidate: ‘operator>(float, int)’ (built-in)
In file included from /usr/local/cuda/include/cuda_fp16.h:4070,
from /usr/local/cuda/include/cublas_api.h:77,
from /usr/local/cuda/include/cublas_v2.h:69,
from /home/orin/workspace/opencv/opencv-4.7.0/modules/dnn/src/layers/../cuda4dnn/csl/cublas.hpp:14,
from /home/orin/workspace/opencv/opencv-4.7.0/modules/dnn/src/layers/../op_cuda.hpp:1,
from /home/orin/workspace/opencv/opencv-4.7.0/modules/dnn/src/layers/region_layer.cpp:44:
/usr/local/cuda/include/cuda_fp16.hpp:720:42: note: candidate: ‘bool operator>(const __half&, const __half&)’
720 | __CUDA_HOSTDEVICE__ __forceinline__ bool operator> (const __half &lh, const __half &rh) { return __hgt(lh, rh); }
| ^~~~~~~~
In file included from /home/orin/workspace/opencv/opencv-4.7.0/modules/core/include/opencv2/core.hpp:5,
from /home/orin/workspace/opencv/opencv-4.7.0/modules/dnn/src/layers/../precomp.hpp:4,
from /home/orin/workspace/opencv/opencv-4.7.0/modules/dnn/src/layers/fully_connected_layer.cpp:43:
- follow https://github.com/opencv/opencv/pull/24104/files
cmake -B release -D WITH_CUDA=ON -D WITH_CUDNN=ON -D CUDA_ARCH_BIN="5.3,6.2,7.2,8.7" -D CUDA_ARCH_PTX="" -D OPENCV_GENERATE_PKGCONFIG=ON -D OPENCV_EXTRA_MODULES_PATH=../opencv_contrib-4.7/modules -D WITH_GSTREAMER=ON -D WITH_LIBV4L=ON -D BUILD_opencv_python2=ON -D BUILD_opencv_python3=OFF -D BUILD_TESTS=OFF -D BUILD_PERF_TESTS=OFF -D BUILD_EXAMPLES=OFF -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local
cmake --build release --parallel
sudo cmake --build release --target install
可以参考的编译脚本
- https://github.com/opencv/opencv/issues/22132