OpenCV從2到3的過渡 爲opencv添加contrib庫

與版本2.4相比,OpenCV 3.0引入了許多新算法和功能。有些模塊已被重寫,有些已經重組。儘管2.4中的大多數算法仍然存在,但接口可能不一樣。本節描述了通常性的最顯着變化,過渡操做的全部細節和示例都在本文檔的下一部分中。html

一、貢獻存儲庫

 https://github.com/opencv/opencv_contribgit

這是一個適用於全部新算法,實驗算法和非免費算法的地方。與主存儲庫相比,它沒有獲得支持團隊的太多關注,但社區努力使其保持良好狀態。(即OpenCV的附加庫,人臉識別等一些附加的功能可能須要用到這個庫)github

要使用contrib存儲庫構建OpenCV ,請將如下選項添加到cmake命令:算法

-DOPENCV_EXTRA_MODULES_PATH=<path-to-opencv_contrib>/modules

或者參考個人博客爲opencv添加contrib庫機器學習

 

二、頭文件佈局

  在2.4中,全部頭文件都位於相應的模塊子文件夾(opencv2 / <module> / <module> .hpp)中,在3.0中有頂級模塊頭文件,其中包含大部分模塊功能:opencv2 / <module> .hpp和全部 C語言風格的API定義已移至單獨的標頭(例如opencv2 / core / core_c.h)。ide

三、算法接口

  通用算法使用模式已更改:如今必須在包裝在智能指針cv :: Ptr中的堆上建立。版本2.4容許直接或經過智能指針進行堆棧和堆分配。函數

  已經從cv :: Algorithm類中刪除了getset方法以及CV_INIT_ALGORITHM宏。在3.0中,全部屬性都已轉換爲getProperty / setProperty純虛擬方法對。所以,它是不是可以建立和使用CV ::算法經過名稱實例(使用通用的算法::建立(字符串)方法),應該顯式調用相應的函數方法。oop

四、重寫了模塊

  • ml模塊已被重寫
  • highgui模塊已被拆分爲:imgcodecsvideoiohighgui自己
  • features2d模塊已重組(某些功能檢測器已移至opencv_contrib / xfeatures2d模塊)
  • 傳統的非自由的模塊已被刪除。一些算法已被移動到不一樣的位置,一些算法已被徹底重寫或刪除
  • CUDA API已更新(gpu模塊 - >幾個cuda模塊,命名空間gpu - >命名空間cuda
  • OpenCL API已經改變(ocl模塊已被刪除,單獨的ocl :: implementation - > Transparent API)
  • 其餘一些方法和類已被從新定位

五、機器學習模塊

因爲此模塊已被重寫,所以須要花費一些精力才能使您的軟件適應它。全部算法都與其基類StatModel一塊兒位於單獨的ml命名空間中單獨的SomeAlgoParams類已被一組相應的getProperty / setProperty方法替換佈局

下表說明了2.4和3.0機器學習類之間的對應關係。post

儘管3.0中重寫的ml算法容許您從xml / yml文件加載舊的訓練模型,但預測過程當中的誤差是可能的。

points_classifier.cpp示例中的如下代碼片斷說明了模型培訓過程當中的差別:

using namespace cv;
// ======== version 2.4 ========
Mat trainSamples, trainClasses;
prepare_train_data( trainSamples, trainClasses );
CvBoost  boost;
Mat var_types( 1, trainSamples.cols + 1, CV_8UC1, Scalar(CV_VAR_ORDERED) );
var_types.at<uchar>( trainSamples.cols ) = CV_VAR_CATEGORICAL;
CvBoostParams  params( CvBoost::DISCRETE, // boost_type
                       100, // weak_count
                       0.95, // weight_trim_rate
                       2, // max_depth
                       false, //use_surrogates
                       0 // priors
                     );
boost.train( trainSamples, CV_ROW_SAMPLE, trainClasses, Mat(), Mat(), var_types, Mat(), params );
// ======== version 3.0 ========
Ptr<Boost> boost = Boost::create();
boost->setBoostType(Boost::DISCRETE);
boost->setWeakCount(100);
boost->setWeightTrimRate(0.95);
boost->setMaxDepth(2);
boost->setUseSurrogates(false);
boost->setPriors(Mat());
boost->train(prepare_train_data()); // 'prepare_train_data' returns an instance of ml::TrainData class

六、功能檢測

一些算法(FREAK,BRIEF,SIFT,SURF)已移至opencv_contrib存儲庫,xfeatures2d模塊,xfeatures2d命名空間。它們的接口也已更改(從cv::Feature2D基類繼承)。

xfeatures2d模塊類列表

須要如下步驟:

  1. opencv_contrib添加到編譯過程
  2. 包括opencv2/xfeatures2d.h標題
  3. 使用命名空間 xfeatures2d
  4. 替換operator()呼叫detectcompute或者detectAndCompute若是須要

有些類如今使用通用方法detectcompute或者detectAndComputeFeature2D基類而不是自定義提供operator()

如下代碼片斷說明了差別(來自video_homography.cpp示例):

using namespace cv;
// ====== 2.4 =======
#include "opencv2/features2d/features2d.hpp"
BriefDescriptorExtractor brief(32);
GridAdaptedFeatureDetector detector(new FastFeatureDetector(10, true), DESIRED_FTRS, 4, 4);
// ...
detector.detect(gray, query_kpts); //Find interest points
brief.compute(gray, query_kpts, query_desc); //Compute brief descriptors at each keypoint location
// ====== 3.0 =======
#include "opencv2/features2d.hpp"
#include "opencv2/xfeatures2d.hpp"
using namespace cv::xfeatures2d;
Ptr<BriefDescriptorExtractor> brief = BriefDescriptorExtractor::create(32);
Ptr<FastFeatureDetector> detector = FastFeatureDetector::create(10, true);
// ...
detector->detect(gray, query_kpts); //Find interest points
brief->compute(gray, query_kpts, query_desc); //Compute brief descriptors at each keypoint location

七、OpenCL

全部專門的ocl實現都隱藏在通用C ++算法接口以後。如今能夠在運行時動態選擇函數執行路徑:CPU或OpenCL; 這種機制也稱爲「透明API」。

新類cv :: UMat旨在以方便的方式隱藏與OpenCL設備的數據交換。

如下示例說明了API修改(來自OpenCV站點):

  • OpenCL感知代碼OpenCV-2.x
// initialization
VideoCapture vcap(...);
ocl::OclCascadeClassifier fd("haar_ff.xml");
ocl::oclMat frame, frameGray;
Mat frameCpu;
vector<Rect> faces;
for(;;){
    // processing loop
    vcap >> frameCpu;
    frame = frameCpu;
    ocl::cvtColor(frame, frameGray, BGR2GRAY);
    ocl::equalizeHist(frameGray, frameGray);
    fd.detectMultiScale(frameGray, faces, ...);
    // draw rectangles …
    // show image …
}
  • OpenCL感知代碼OpenCV-3.x
// initialization
VideoCapture vcap(...);
CascadeClassifier fd("haar_ff.xml");
UMat frame, frameGray; // the only change from plain CPU version
vector<Rect> faces;
for(;;){
    // processing loop
    vcap >> frame;
    cvtColor(frame, frameGray, BGR2GRAY);
    equalizeHist(frameGray, frameGray);
    fd.detectMultiScale(frameGray, faces, ...);
    // draw rectangles …
    // show image …
}

八、cuda

cuda模塊已分紅幾個小塊:

gpu命名空間已被刪除,請改用cv :: cuda命名空間。許多類也已重命名,例如:

九、文檔格式

文檔已轉換爲Doxygen格式。您能夠在OpenCV參考文檔的教程部分(OpenCV的編寫文檔)中找到更新的文檔編寫指南

十、支持兩個版本

在某些狀況下,能夠支持兩種版本的OpenCV。

十一、源代碼版本檢測

要檢查應用程序源代碼中的庫主要版本,應使用如下方法:

#include "opencv2/core/version.hpp"
#if CV_MAJOR_VERSION == 2
// do opencv 2 code
#elif CV_MAJOR_VERSION == 3
// do opencv 3 code
#endif

注意不要使用CV_VERSION_MAJOR,它對2.4和3.x分支有不一樣的含義!

十二、編譯系統

經過檢查編譯系統中的庫版本,能夠連接不一樣的模塊或啓用/禁用應用程序中的某些功能。標準的cmake或pkg-config變量可用於此:

  • OpenCV_VERSION 對於cmake,將包含完整版本:例如「2.4.11」或「3.0.0」
  • OpenCV_VERSION_MAJOR 對於cmake,將僅包含主要版本號:2或3
  • pkg-config文件有標準字段 Version

例:

if(OpenCV_VERSION VERSION_LESS "3.0")
# use 2.4 modules
else()
# use 3.x modules
endif()
相關文章
相關標籤/搜索