前提・実現したいこと
pythonでSIFT特徴量抽出をしたい。
SIFTはopenCVの追加パッケージopencv_contribの中に配布されている。
今回の目的は、SIFTの中身を弄りたい、ということ。
つまり、C++で記述されているsift.cppを編集して、その編集したソースコードをビルドしてpythonから呼び出して使えるようにしたい。
発生している問題
sift.cppの中身を弄ったのに、出力結果が何も変わりません(編集ソースコードが反映されていない)。
基本的にはこのサイトに従ってソースコードからビルドを行いました。
手順5でソースコードのダウンロードを行います。
cd C:\tools git clone https://github.com/opencv/opencv.git git clone https://github.com/opencv/opencv_contrib.git
手順9でCMakeを実行します。
cd opencv rmdir /s /q build mkdir build cd build del CMakeCache.txt "C:\Program Files\Cmake\bin\cmake" -G "Visual Studio 15 2017 Win64" -T host=x64 ^ -DCMAKE_BUILD_TYPE=RELEASE ^ -DOPENCV_EXTRA_MODULES_PATH=C:\tools\opencv_contrib\modules ^ -DINSTALL_C_EXAMPLES=ON ^ -DWITH_PYTHON=ON ^ -DINSTALL_PYTHON_EXAMPLES=ON ^ -DBUILD_opencv_python3=ON ^ -DPYTHON3_EXECUTABLE=C:/ProgramData/Anaconda3/python.exe ^ -DPYTHON3_INCLUDE_DIR=C:/ProgramData/Anaconda3/include ^ -DPYTHON3_LIBRARY=C:/ProgramData/Anaconda3/libs/python36.lib ^ -DPYTHON3_NUMPY_INCLUDE_DIRS=C:/ProgramData/Anaconda3/lib/site-packages/numpy/core/include ^ -DBUILD_EXAMPLES=ON ^ -DOPENCV_ENABLE_NONFREE=ON ^ ..
私はこの手順9(CMakeの実行)の手前で、今回の目的であるsift.cppを編集しました。
その後は、手順11に従いソースコードからビルドしました。
"C:\Program Files\Cmake\bin\cmake" --build . --config RELEASE --target INSTALL
該当のソースコード
SIFT特徴量抽出プログラムとしては、こちらのよくあるpythonプログラムを用いたのですが、出力される画像は普通のsift.cppを用いたときと何の変化もありませんでした。
python
1import numpy as np 2import cv2 3img1 = cv2.imread('test3.png',0) 4img2 = cv2.imread('test3_rot.png',0) 5#特徴抽出機の生成 6detector = cv2.xfeatures2d.SIFT_create() 7#kpは特徴的な点の位置 destは特徴を現すベクトル 8kp1, des1 = detector.detectAndCompute(img1, None) 9kp2, des2 = detector.detectAndCompute(img2, None) 10#特徴点の比較機 11bf = cv2.BFMatcher() 12matches = bf.knnMatch(des1,des2, k=2) 13#割合試験を適用 14good = [] 15match_param = 0.6 16for m,n in matches: 17 if m.distance < match_param*n.distance: 18 good.append([m]) 19#cv2.drawMatchesKnnは適合している点を結ぶ画像を生成する 20img3 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,good, None,flags=2) 21cv2.imwrite("sift_result.png", img3)
問題点は?
結局のところ、何が問題なのか分かりません。
そもそも既存のOpenCVのソースコードをわざわざ編集してビルドする人は少ないと思うのですが、今回の発想自体は正しいのでしょうか?
正しいとしたら、どうして編集したコードは反映されないのでしょうか。
あなたの回答
tips
プレビュー