![]() |
OpenCV 4.12.0
開源計算機視覺
|
上一個教程: 為 OpenCV 編寫文件
下一個教程: 從其他 Doxygen 專案交叉引用 OpenCV
| 原始作者 | 馬克西姆·沙布寧 |
| 相容性 | OpenCV >= 3.0 |
本文件旨在幫助希望將其程式碼遷移到 OpenCV 3.0 的軟體開發人員。
與 2.4 版本相比,OpenCV 3.0 引入了許多新演算法和功能。一些模組已被重寫,一些已被重組。儘管 2.4 中的大多數演算法仍然存在,但介面可能有所不同。
本節概述了最顯著的變更,所有詳細資訊和遷移操作示例將在文件的下一部分中介紹。
https://github.com/opencv/opencv_contrib
這裡是所有新的、實驗性的和非免費演算法的存放地。與主倉庫相比,它沒有得到支援團隊那麼多的關注,但社群會努力維護它。
要使用 contrib 倉庫構建 OpenCV,請將以下選項新增到您的 cmake 命令中
在 2.4 版本中,所有標頭檔案都位於相應的模組子資料夾中(opencv2/<module>/<module>.hpp),而在 3.0 版本中,存在包含大部分模組功能的頂級模組標頭檔案:opencv2/<module>.hpp,並且所有 C 風格的 API 定義已移至單獨的標頭檔案(例如 opencv2/core/core_c.h)。
通用演算法使用模式已更改:現在必須在堆上建立並封裝在智慧指標 cv::Ptr 中。2.4 版本允許棧分配和堆分配,無論是直接分配還是透過智慧指標。
get 和 set 方法以及 CV_INIT_ALGORITHM 宏已從 cv::Algorithm 類中移除。在 3.0 版本中,所有屬性都已轉換為 getProperty/setProperty 純虛方法對。因此,無法透過名稱(使用通用 Algorithm::create(String) 方法)建立和使用 cv::Algorithm 例項,而應顯式呼叫相應的工廠方法。
本節將透過示例描述具體操作。
OpenCV 最新 2.4.11 版本中的一些更改允許您為遷移準備當前程式碼庫
注意: OpenCV 3.0 中已進行了旨在簡化遷移的更改,因此以下說明並非必需,但建議遵循。
initModule_<moduleName>() 呼叫由於此模組已被重寫,因此您的軟體需要進行一些適配工作。所有演算法都位於獨立的 ml 名稱空間中,以及它們的基類 StatModel。獨立的 SomeAlgoParams 類已被替換為相應的 getProperty/setProperty 方法集。
下表說明了 2.4 和 3.0 機器學習類之間的對應關係。
| 2.4 | 3.0 |
|---|---|
| CvStatModel | cv::ml::StatModel |
| CvNormalBayesClassifier | cv::ml::NormalBayesClassifier |
| CvKNearest | cv::ml::KNearest |
| CvSVM | cv::ml::SVM |
| CvDTree | cv::ml::DTrees |
| CvBoost | cv::ml::Boost |
| CvGBTrees | 未實現 |
| CvRTrees | cv::ml::RTrees |
| CvERTrees | 未實現 |
| EM | cv::ml::EM |
| CvANN_MLP | cv::ml::ANN_MLP |
| 未實現 | cv::ml::LogisticRegression |
| CvMLData | cv::ml::TrainData |
儘管 3.0 中重寫的 ml 演算法允許您從 xml/yml 檔案載入舊的訓練模型,但預測過程中可能會出現偏差。
以下來自 points_classifier.cpp 示例的程式碼片段說明了模型訓練過程中的差異
一些演算法(FREAK、BRIEF、SIFT、SURF)已移至 opencv_contrib 倉庫中的 xfeatures2d 模組,位於 xfeatures2d 名稱空間下。它們的介面也已更改(繼承自 cv::Feature2D 基類)。
xfeatures2d 模組類列表
需要以下步驟
opencv2/xfeatures2d.h 標頭檔案xfeatures2doperator() 呼叫替換為 detect、compute 或 detectAndCompute現在,一些類使用 Feature2D 基類提供的通用方法 detect、compute 或 detectAndCompute,而不是自定義的 operator()
以下程式碼片段說明了差異(來自 video_homography.cpp 示例)
所有專門的 ocl 實現都已隱藏在通用 C++ 演算法介面之後。現在,函式執行路徑可以在執行時動態選擇:CPU 或 OpenCL;這種機制也稱為“透明 API”。
新類 cv::UMat 旨在以便捷的方式隱藏與 OpenCL 裝置的資料交換。
以下示例說明了 API 修改(摘自 OpenCV 網站)
CUDA 模組已移至 opencv_contrib 倉庫。
文件已轉換為 Doxygen 格式。您可以在 OpenCV 參考文件的 教程 部分找到更新的文件編寫指南(為 OpenCV 編寫文件)。
在某些情況下,可以同時支援 OpenCV 的兩個版本。
要在應用程式原始碼中檢查庫的主版本,應使用以下方法
透過在構建系統中檢查庫版本,可以在應用程式中連結不同的模組或啟用/停用某些功能。標準 cmake 或 pkg-config 變數可用於此目的
OpenCV_VERSION 將包含完整版本號,例如 "2.4.11" 或 "3.0.0"OpenCV_VERSION_MAJOR 將只包含主版本號:2 或 3Version示例