0x00 - 應用目的
筆者使用OpenCV
主要目的是暫時完成圖像的配準與融合苞七,所以主要用到OpenCV
中SURF
忆肾、SIFT
芜辕、ORB
等工具,搭建時主要遇到的問題:
-
OpenCV
3.0+依賴拆分函數(shù)遷移問題 -
CMake
使用流程不熟悉 -
Python
引入OpenCV
不完整
0x01 - Python 默認安裝
使用Python
時習慣使用pip
對需要的包進行安裝簸喂,所以在初次配置OpenCV
時直接執(zhí)行了下述命令:
pip install opencv-python
安裝完成后可以正常引入cv2
并完成圖像讀取顯示毙死,但無法使用特征提取函數(shù)燎潮,使用時報錯:
AttributeErrorTraceback (most recent call last)
<ipython-input-5-a409304a8e5d> in <module>()
----> 2 surf = cv2.xfeatures2d.SURF_create(300)
AttributeError: 'module' object has no attribute 'xfeatures2d'
產(chǎn)生該錯誤原因是OpenCV 3.0+
中將部分功能分離成了一個新的庫:opencv-contrib
喻鳄,SURF
和SIFT
屬于擴展庫中的功能,而默認庫中則只包含了表現(xiàn)更好的ORB
确封。
0x02 - OpenCV Contrib 安裝
按照廣大網(wǎng)友指示應先卸載opencv-python
后重新安裝opencv-contrib-python
除呵,即
pip uninstall opencv-python
pip install opencv-contrib-python # Permission denied 的話可以加上 --user
不知道大家嘗試結(jié)果如何,反正我是失敗了:依然無法使用SURF_create
0x03 - CMake 重新編譯
除pip
安裝依賴形式添加OpenCV
外爪喘,直接從OpenCV官網(wǎng)上下載源碼也可以完成依賴添加:
- 下載已編譯好的源碼并解壓(官網(wǎng)提供exe運行本質(zhì)也是解壓)
- 在
解壓目錄/opencv/build/python/2.7/x64
下可以找到cv2.pyd
文件 - 將
cv2.pyd
拷貝至$PYTHON_HOME/Lib/site-packages
目錄下即可
當然這樣拷貝出的和pip
安裝的區(qū)別不大颜曾,以同樣方法將bin
和lib
添加進VS
工程也會出現(xiàn)無法找到nonfree
和legacy
的問題,想要解決只能使用CMake
重新編譯OpenCV
(C++
的話順路還能加上Nonfree
)秉剑。
0x04 - 重新編譯OpenCV
準備工具:
- OpenCV + OpenCV Contrib(此處使用Git-master-2018/9/19)
- CMake 3.12.2
- Virtual Studio 2013
編譯流程:
- 打開
CMake/bin/cmake-gui.exe
泛豪,選擇源文件路徑及輸出路徑(可新建) - 執(zhí)行左下方
Configure
,選擇對應版本編譯工具(此處選擇了Virtual Studio 12 2013 Win64) - 重復執(zhí)行
Configure
直到結(jié)束后沒有被標記為紅色的選項 - 搜索
PATH
侦鹏,在OPENCV_EXTRA_MODULES_PATH
項中填入opencv-contrib
的modules
路徑
(如需Nonfree支持可搜索OPENCV_ENABLE_NONFREE選項并勾選) - 重復執(zhí)行
Configure
直到結(jié)束后沒有被標記為紅色的選項 - 執(zhí)行左下方
Generate
- 完成
CMake
部分編譯
此時的輸出路徑中是沒有我們需要的依賴文件的诡曙!無法配置路徑或者拷貝cv2.pyd
并不是編譯失敗...我們還需要進入VS2013
中進行正式的編譯:
- 打開輸出路徑中的
OpenCV.sln
,設(shè)置ALL_BUILD
為啟動項(默認) - 選擇對應版本(如 Release x64)
- 編譯生成解決方案(或直接運行)
在VS2013
中完成編譯后才可以重新配置路徑或拷貝cv2.pyd
略水,配置完成后重新運行腳本价卤,功能順利實現(xiàn)。
0xFF - About ORB
ORB: Oriented FAST and Rotated BRIEF, An efficient alternative to SIFT and SURF and NOT PATENTED.
ORB is basically a fusion of FAST keypoint detector and BRIEF descriptor with many modifications to enhance the performance. First it use FAST to find keypoints, then apply Harris corner measure to find top N points among them. It also use pyramid to produce multiscale-features. But one problem is that, FAST doesn’t compute the orientation. So what about rotation invariance? Authors came up with following modification. [Get all theory here]
ORB in OpenCV :
import numpy as np
import cv2
from matplotlib import pyplot as plt
img = cv2.imread('simple.jpg',0)
# Initiate STAR detector
orb = cv2.ORB()
# find the keypoints with ORB
kp = orb.detect(img,None)
# compute the descriptors with ORB
kp, des = orb.compute(img, kp)
# draw only keypoints location,not size and orientation
img2 = cv2.drawKeypoints(img,kp,color=(0,255,0), flags=0)
plt.imshow(img2),plt.show()
Additional Resources:
Ethan Rublee, Vincent Rabaud, Kurt Konolige, Gary R. Bradski: ORB: An efficient alternative to SIFT or SURF. ICCV 2011: 2564-2571.
我們的822渊涝,我們的青春
歡迎所有熱愛知識熱愛生活的朋友和822實驗室一起成長慎璧,吃喝玩樂,享受知識跨释。