OpenCV
編譯
基本流程:
$ git clone https://github.com/opencv/opencv
$ git clone https://github.com/opencv/opencv_contrib
$ cd opencv/
$ mkdir build/
$ cd build/
# 自行更改要開啟的設定
$ cmake -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules/ \
-D CPU_BASELINE=SSE3 \
-D WITH_GSTREAMER=ON \
-D WITH_FFMPEG=ON \
-D WITH_OPENGL=ON \
-D WITH_OPENCL=ON \
-D WITH_CUDA=OFF \
-D CMAKE_BUILD_TYPE=Release \
../
# 編好後可以在 lib/python3/ 內找到給 Python 3 的 Shared Library
更多編譯調整:
# for x86_64
# CPU_BASELINE 為最小需求,一定要有才可以跑
# CPU_DISPATCH 則是額外支援,根據執行平台選擇
$ cmake -D CMAKE_CXX_COMPILER=$CXX -D CMAKE_CC_COMPILER=$CC \
-D PYTHON_DEFAULT_EXECUTABLE=/usr/bin/python3 \
-D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules/ \
-D CPU_BASELINE=AVX2 \
-D WITH_GSTREAMER=OFF \
-D WITH_FFMPEG=ON \
-D WITH_OPENGL=OFF \
-D WITH_OPENCL=ON \
-D WITH_CUDA=OFF \
-D WITH_TBB=OFF \
-D WITH_V4L=ON \
-D WITH_XINE=OFF \
-D WITH_GTK=OFF \
-D WITH_QT=OFF \
-D WITH_OPENMP=ON \
-D BUILD_WITH_DEBUG_INFO=OFF \
-D BUILD_TESTS=OFF \
-D BUILD_PERF_TESTS=OFF \
-D BUILD_EXAMPLES=OFF \
-D INSTALL_C_EXAMPLES=OFF \
-D INSTALL_PYTHON_EXAMPLES=OFF \
-D CMAKE_BUILD_TYPE=Release \
-D CMAKE_INSTALL_PREFIX=/usr \
-D CMAKE_SKIP_RPATH=ON \
-D BUILD_opencv_python2=OFF \
-D BUILD_opencv_python3=ON \
-D BUILD_opencv_dnn=OFF \
-D BUILD_opencv_dnn_modern=OFF \
../
針對 ARM 平台:
# for ARM
$ cmake -D CMAKE_CXX_COMPILER=$CXX -D CMAKE_CC_COMPILER=$CC \
-D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules/ \
-D CPU_BASELINE=NEON \
-D WITH_GSTREAMER=OFF \
-D WITH_FFMPEG=ON \
-D WITH_OPENGL=OFF \
-D WITH_OPENCL=ON \
-D WITH_CUDA=OFF \
-D WITH_TBB=OFF \
-D WITH_V4L=ON \
-D WITH_XINE=OFF \
-D WITH_GTK=OFF \
-D WITH_QT=OFF \
-D BUILD_WITH_DEBUG_INFO=OFF \
-D BUILD_TESTS=OFF \
-D BUILD_PERF_TESTS=OFF \
-D BUILD_EXAMPLES=OFF \
-D INSTALL_C_EXAMPLES=OFF \
-D INSTALL_PYTHON_EXAMPLES=OFF \
-D CMAKE_BUILD_TYPE=Release \
-D CMAKE_INSTALL_PREFIX=/usr \
-D CMAKE_SKIP_RPATH=ON \
-D BUILD_opencv_dnn=OFF \
-D BUILD_opencv_dnn_modern=OFF \
../
靜態編譯(OpenCV 本身靜態編譯,一些外部相依 libraries 可能還是動態連結,需要更多調整):
# x86_64 Static Build
# 重點是 "-D BUILD_SHARED_LIBS=OFF"
$ cmake -D CMAKE_CXX_COMPILER=$CXX -D CMAKE_CC_COMPILER=$CC \
-D PYTHON_DEFAULT_EXECUTABLE=/usr/bin/python3 \
-D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules/ \
-D BUILD_SHARED_LIBS=OFF \
-D CPU_BASELINE=AVX2 \
-D WITH_GSTREAMER=OFF \
-D WITH_FFMPEG=ON \
-D WITH_OPENGL=OFF \
-D WITH_OPENCL=ON \
-D WITH_CUDA=OFF \
-D WITH_TBB=OFF \
-D WITH_V4L=ON \
-D WITH_XINE=OFF \
-D WITH_GTK=OFF \
-D WITH_QT=OFF \
-D WITH_OPENMP=ON \
-D BUILD_WITH_DEBUG_INFO=OFF \
-D BUILD_TESTS=OFF \
-D BUILD_PERF_TESTS=OFF \
-D BUILD_EXAMPLES=OFF \
-D INSTALL_C_EXAMPLES=OFF \
-D INSTALL_PYTHON_EXAMPLES=OFF \
-D CMAKE_BUILD_TYPE=Release \
-D CMAKE_INSTALL_PREFIX=/usr \
-D CMAKE_SKIP_RPATH=ON \
-D BUILD_opencv_python2=OFF \
-D BUILD_opencv_python3=ON \
-D BUILD_opencv_dnn=OFF \
-D BUILD_opencv_dnn_modern=OFF \
../
# ARM Static Build
# 重點是 "-D BUILD_SHARED_LIBS=OFF"
$ cmake -D CMAKE_CXX_COMPILER=$CXX -D CMAKE_CC_COMPILER=$CC \
-D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules/ \
-D PYTHON_DEFAULT_EXECUTABLE=/usr/bin/python3 \
-D PYTHON3_NUMPY_INCLUDE_DIRS=/usr/include/numpy/ \
-D BUILD_SHARED_LIBS=OFF \
-D CPU_BASELINE=NEON \
-D WITH_GSTREAMER=OFF \
-D WITH_FFMPEG=ON \
-D WITH_OPENGL=OFF \
-D WITH_OPENCL=ON \
-D WITH_CUDA=OFF \
-D WITH_TBB=OFF \
-D WITH_V4L=ON \
-D WITH_XINE=OFF \
-D WITH_GTK=OFF \
-D WITH_QT=OFF \
-D BUILD_WITH_DEBUG_INFO=OFF \
-D BUILD_TESTS=OFF \
-D BUILD_PERF_TESTS=OFF \
-D BUILD_EXAMPLES=OFF \
-D INSTALL_C_EXAMPLES=OFF \
-D INSTALL_PYTHON_EXAMPLES=OFF \
-D CMAKE_BUILD_TYPE=Release \
-D CMAKE_INSTALL_PREFIX=/usr \
-D CMAKE_SKIP_RPATH=ON \
-D BUILD_opencv_python2=OFF \
-D BUILD_opencv_python3=ON \
-D BUILD_opencv_dnn=OFF \
-D BUILD_opencv_dnn_modern=OFF \
../
Python Wheel 打包:
# 使用 opencv-python
$ git clone https://github.com/skvark/opencv-python
$ cd opencv-python
$ rm -rf opencv
$ ln -sf /path/to/your/opencv/code opencv
$ python3 find_version.py # will generate cv_version.py
$ cat cv_version.py # e.g. opencv_version = "3.3.1"
$ cp /path/to/your/prebuilt/cv2.blabla.so cv2/
$ python3 setup.py bdist_wheel
$ ls dist/*.whl
Transparent API (TAPI)
Transparent API 是 OpenCV 3 加入的一層抽象化, 方便為現有演算法做出各平台的特製。
參考:
Morphological Transformations
在進行圖像處理時, 適當套用一些 Morphological Transformations 可以改善後續處理的結果, 例如在做物件追蹤時,先比較圖像,抽出有變動的部份(Background Subtraction), 接著做一些 Morphological Transformations, 再找出輪廓(findContours), 最後丟給物件追蹤(Object Tracking), 中間的圖像處理就可以對後續追蹤有不少的影響。
常用範例:
Erosion:變細
Dilation:變粗
Opening:去除外圍雜訊
Closing:補足內在漏洞
White Tophat
Black Tophat
Skeletonize
Convex Hull
參考:
Misc
OpenCV 的 VideoCapture
、 VideoWrite
可以直接放入 GStreamer Pipeline 來用