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 應該會有相當程度的效能增進。

對「OpenCV 3.0 Beta 版發布」的想法

  1. 請問一下!
    最近openCV釋出了新的版本 3.0RC1
    然後我要把它和Dev C++ 作環境變數路徑更改的時候一直失敗TAT
    請問能教教我該怎辦嗎?我已經試三天了…

    • Heresy 沒有使用 Dev C++、再加上你也沒有給錯誤的訊息,基本上不可能知道問題在哪裡。
      不過基本上,C++ 函式庫的設定方法都是一樣的。

  2. 請問一下
    只要有使用到 opencv的功能
    前面就需要加cv::嗎?@@!!
    假設我要讀[0,0]這顆像素
    (舊版) int g = img.at(0,0)[0];
    請問要怎麼改成新版的呢?@@

    • 前面的「cv::」是 C++ namespace 的設計,基本上設計得比較好的 C++ 函式庫都會有定義自己的 namespace。如果懶得打的話,就是自己加上 using namespace 來簡化。
      這部分在 OpenCV 2 也是一樣的。

      另外,cv::Mat 的操作在 3.x 和 2.x 基本上是沒有分別的。

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.