1. 程式人生 > >OpenCV3.4.X中Nonfree模組的使用-SURF為例

OpenCV3.4.X中Nonfree模組的使用-SURF為例

作者使用OpenCV3.4.3+VS2015+CMake3.8.2編譯了包含opencv3.4.3以及opencv_contrib的完整的OpenCV庫,因而能夠使用tracking、saliency等非穩定模組。

在後續工作中又需要利用SURF進行實驗,程式碼如下:

Ptr<SURF> surf = SURF::create(100);

但是執行時直接報錯,控制檯提示如下(Debug模式下):

【這裡是坑,可跳到最後看如何解決】這裡的意思大概是說,SURF屬於收費模組,在CMake編譯時要指定:OPENCV_ENABLE_NONFREE,於是作者重新設定CMake編譯選項生成VS工程,並完整編譯OpenCV庫:

但是編譯完成後,更新Opencv庫,執行之前的程式碼時發現仍然報相同的錯誤。

【解決】最後作者想到根據異常資訊來定位問題,根據之前的異常提示:輸出異常的位置是Surf.cpp的1016行,開啟原始檔如下:

#include "precomp.hpp"
#include "surf.hpp"

namespace cv
{
namespace xfeatures2d
{

#ifdef OPENCV_ENABLE_NONFREE

//...

Ptr<SURF> SURF::create(double _threshold, int _nOctaves, int _nOctaveLayers, bool _extended, bool _upright)
{
    return makePtr<SURF_Impl>(_threshold, _nOctaves, _nOctaveLayers, _extended, _upright);
}

#else // ! #ifdef OPENCV_ENABLE_NONFREE
Ptr<SURF> SURF::create(double, int, int, bool, bool)
{
    CV_Error(Error::StsNotImplemented,
        "This algorithm is patented and is excluded in this configuration; "
        "Set OPENCV_ENABLE_NONFREE CMake option and rebuild the library");
}
#endif

}
}

仔細一看,如果在編譯時如果定義了OPENCV_ENABLE_NONFEE那麼久出書異常提示:SURF不能使用,反之正常編譯。所以問題出在這裡:1)不清楚哪裡定了的OPENCV_ENABLE_NONFREE,因為作者在利用CMake編譯勾選或者不勾選OPENCV_ENABLE_NONFREE時現象一樣;2)定義了ENABLE_NONFREE,反而無法使用,不能理解。

但是,顯然這還比較好解決的,稍微改下Surf.cpp程式碼去掉條件編譯指定,如下:

#include "precomp.hpp"
#include "surf.hpp"

namespace cv
{
namespace xfeatures2d
{

//#ifdef OPENCV_ENABLE_NONFREE

//...

//#else // ! #ifdef OPENCV_ENABLE_NONFREE
//Ptr<SURF> SURF::create(double, int, int, bool, bool)
//{
//    CV_Error(Error::StsNotImplemented,
//        "This algorithm is patented and is excluded in this configuration; "
//        "Set OPENCV_ENABLE_NONFREE CMake option and rebuild the library");
//}
//#endif

}
}

然後,也不需要完全重新編譯整個OpenCV工程,僅需要編譯xfeatures2d專案即可。最後將生成的新的dll和lib覆蓋原來的,測試可以SURF就可以正常使用了。