背景:
最近在看python的图像处理sift等算法:https://blog.youkuaiyun.com/zhangziju/article/details/79754652
在运行如下代码时出现如下错误:
import cv2
import numpy as np
imgname1='/Users/zhangyugu/Documents/gakki101_1.png'
imgname2='/Users/zhangyugu/Documents/gakki101_2.png'
sift = cv2.xfeatures2d.SIFT_create()
img1 = cv2.imread(imgname1)
gray1 = cv2.cvtColor(img1,cv2.COLOR_BGR2GRAY) #灰度处理图像
kp1,des1 = sift.detectAndCompute(img1,None) #desc 是描述子
img2 = cv2.imread(imgname2)
img2=img2[3:-3] #将两个图片处理成一样大小
#原来的文章地址中没有原始图片,笔者自己进行了截取,并在代码中进行了处理。
gray2 = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)
kp2,des2 = sift.detectAndCompute(img2,None)
hmerge = np.hstack((gray1,gray2)) #水平拼接
cv2.imshow("gray",hmerge)
cv2.waitKey(0)
#画出特征点,并显示为红色圆圈
img3=cv2.drawKeypoints(img1,kp1,img1,color=(255,0,255))
img4=cv2.drawKeypoints(img2,kp2,img2,color=(255,0,255))
hmerge=np.hstack((img3,img4)) #水平拼接
cv2.imshow("point",hmerge) #拼接显示为gray
cv2.waitKey(0)
#BFMatcher解决匹配
bf=cv2.BFMatcher()
matches = bf.knnMatch(des1,des2,k=2)
img5 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,matches,None,flags=2)
cv2.imshow("BFMatch",img5)
cv2.waitKey(0)
#调整ratio
good = []
for m,n in matches:
if m.distance < 0.75*n.distance:
good.append([m])
img6 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,good,None,flags=2)
cv2.imshow("BFMatchGood",img6)
cv2.waitKey(0)
cv2.destroyAllWindows()
sift = cv2.xfeatures2d.SIFT_create()
cv2.error: OpenCV(4.1.0) /Users/travis/build/skvark/opencv-python/opencv_contrib/modules/xfeatures2d/src/sift.cpp:1207: error: (-213:The function/feature is not implemented) This algorithm is patented and is excluded in this configuration; Set OPENCV_ENABLE_NONFREE CMake option and rebuild the library in function 'create'
意思是这个函数现在不免费了,但是仍然可以通过自己编译的方式加载进来
方法:
以下的环境是:mac python3.7
1 、当前目录为/Users/zhangyugu/Downloads/
git clone opencv https://github.com/opencv/opencv.git
git clone https://github.com/opencv/opencv_contrib.git
2、当前最新的分支是3.4
cd opencv_contrib
git checkout 3.4
cd ../opencv
git checkout 3.4
mkdir build
cd build
cmake ..
-DCMAKE_BUILD_TYPE=Release
-DCMAKE_INSTALL_PREFIX=/usr/local
-DOPENCV_EXTRA_MODULES_PATH=/Users/zhangyugu/Downloads/opencv_contrib/modules
-DOPENCV_ENABLE_NONFREE=true
-DBUILD_opencv_python3=ON
-DPYTHON3_EXECUTABLE=/Library/Frameworks/Python.framework/Versions/3.7/bin/python3
-DPYTHON_INCLUDE_DIR=/Library/Frameworks/Python.framework/Versions/3.7/include/python3.7m/
-DPYTHON_LIBRARY=/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/
-DPYTHON3_PACKAGES_PATH=/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/
-DPYTHON3_NUMPY_INCLUDE_DIRS=/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/numpy/core/include/
-DOPENCV_GENERATE_PKGCONFIG=ON
make
make install
3、笔者在这其中踩了很多坑,pip3自己安装的opencv_python以及opencv_contrib_python最后都卸载了,
从这个cmake的参数可以看出opencv编译的过程中就生成了python类库文件。
4、重新运行原python脚本,就没有报错了