OpenCV 3.0 Beta 版發布

OpenCV(官網)的 3.0 版終於推出 beta 版了!官方的消息是《OpenCV 3.0 Beta》,雖然這個版本還不是正式版,但是在經過之前 alpha 版的測試後,穩定性已經提升不少,應該算是比較可以拿來用了。

目前 3.0 版的文件是在:http://docs.opencv.org/master/,而如果想要下載的話,則可以在官方下載頁面(連結)取得最新的 pre-build 的檔案,或是從 GitHub 上下載原始碼(連結)。

而 OpenCV 3.0 和 2.x 比起來,到底有哪些不同呢?首先,基本上 OpenCV 3 可以視為是 OpenCV 2 的改善,但是 3.0 和 2.x 並不完全相容,主要的變化包括了:

  • OpenCV 3 建議的 header 檔 include 的形式為:#include "opencv2/core.hpp"
  • highgui 模組被拆成 imgcodecs、videoio 和 highgui 三個模組
  • 部分功能被移至 opencv_contrib、或甚至消失了
    • Face Recognition → opencv_contrib/face
    • SIFT, SURF, FREAK, Star feature detectors and descriptors 現在是 opencv_contrib/xfeatures2d 的一部分
    • text detector 現在是 opencv_contrib/text 的一部分
    • matlab bindings → opencv_contrib/matlab
    • motion templates & simple flow → opencv_contrib/optflow
  • ML 等高階演算法的介面都被調整過

上面的變更應該只能算是局部的紀錄,更完整的內容,可以參考官方的 change log 頁面(連結),或是 3.0 alpha 的公告(連結)。而如果按照預定計畫的話,聖誕節左右應該就會有正式版了~


在 Heresy 個人來看,他一個最重要的地方,是這個版本整合了 OpenCL,讓開發者可以更簡單地使用各種支援 OpenCL 的加速器(例如顯示卡)來做計算上的加速~以官方提供的數據,透過 OpenCL 來使用 Intel 的 IGP(Intel Iris Graphics、Intel Iris Pro Graphics)來做計算,可以提高 10%-230% 的效能~

根據官方的說法,他們是採用「Transparent API」(T-API、官方介紹)的形式,來實作 OpenCL 的整合的。這樣的好處是,只要去呼叫 cv::Canny(),就可以在 CPU 和 GPU 上運作,而不像 OpenCV 2.x 的時候一樣,需要特別改用 cv::ocl::Canny()cv::gpu::Canny() 來和 CPU 版的 cv::Canny() 做區格。

官方也針對 T-API 提供了一些範例(連結)。從範例裡面可以看到,大致上來說,影像的格式變成了 cv::UMat,然後只要透過 cv::ocl::setUseOpenCL(),就可以切換是否要使用 OpenCL 來做加速了。

下面就是一個極簡單的範例:

#include <iostream>

#include <opencv2/core.hpp>
#include "opencv2/core/ocl.hpp"
#include <opencv2/imgcodecs.hpp>
#include <opencv2/imgproc.hpp>

int main(int argc, char** argv)
{
    cv::ocl::setUseOpenCL(false);

    cv::UMat mImgSource, mImgResult;
    cv::imread(argv[1]).copyTo(mImgSource);

    cv::resize(mImgSource, mImgResult, mImgSource.size() / 2);

    cv::imwrite( argv[2], mImgResult );
}

像上面的例子就是讀取一張圖,把它的長寬都縮小成 1/2 後,再寫出來。如果把 cv::ocl::setUseOpenCL() 改成 true 的話,他就會變成是使用 OpenCL 來做縮小、進行加速了!

當然實際上還是有的地方可能會需要做些修改,不過和 2.x 的時代相比,至少是不需要獨立寫成兩個版本、而可以更簡單地進行切換了~而有興趣的話,個人覺得可以參考「Square Detector」這個範例來參考兩者的差異(一般版本T-API 版)。

而也由於 cv::Canny() 這類的函式現在可以同時在 CPU 和 GPU 上運作,所以本來的「ocl」模組也就被移除了。

另外,使用 CUDA 的「gpu」模組並沒有像 OpenCL 一樣被很徹底地整合,而是被改名為「cuda」、並且被細分成許多模組。官方提供 pre-build 的 binary 並沒有提供這些模組,如果有需要的話,需要下載原始碼來自己建置。


另外,在 PC 平台(x86 / x64)上,Intel 這次提供了免費的授權、讓 OpenCV 可以使用了 Intel Integrated Performance Primitives(IPP)的部分功能,來提供 AVX2 等指令集的最佳化。所以在有支援的裝置上,應該也可以取得相當程度的效能增進~

除此之外,OpenCV 3 也有針對 ARM 架構的 NEON 指令集(官網)做最佳化,所以理論上在 ARM 的處理器上使用 OpenCV 3 應該會有相當程度的效能增進。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。