【轉載】OpenCV(C++ 與 Python 的比較)與 MATLAB 的比較

咱們常常會爲本身的技能選擇合適工具而感到疑惑。雖然,工具可以幫助你鍛鍊技能,但它們並不能使你成爲一位能者(Craftsman)。一位真正的能者,在他們的口袋中每每會擁有許多不一樣的工具。另外,他們還能明智地挑選一個合適的工具去完成本身的工做。所以,能者並不與工具產生掛鉤,而是自身的技能。html

有時,我會以爲那些所謂的編程語言很好笑。由於,參與大戰的人總糾結於哪門語言是最好的。然而事實上,做爲編程人員的咱們,理應是懂得爲本身的工做,去挑選一門合適的語言。例如,你想快速開發一個 Web 應用程序的話,你能夠嘗試使用基於 Rails 或 Django 的 Ruby 去進行開發。而若你想爲一個嵌入式設備開發高性能的代碼,你則能夠嘗試一下 C 語言。python

在計算機視覺領域方面,咱們一樣會遇到類似的選擇問題。到底一個計算機視覺工程師 / 編程人員須要學習哪個工具呢 —— 使用 C++ 的 OpenCV?使用 Python 的 OpenCV?仍是 MATLAB 呢?固然咱們應該慶幸,如今還能有若干個工具供咱們選擇。由於在十多年前,計算機視覺領域並不存在任何一個優質的代碼庫。在那時,若是你想學習該領域,就必須得拿起一本書並開始爲本身的小型代碼庫編寫一些關於計算機視覺算法的代碼。因此值得慶幸的是,現在事情已然變得很是美好。git

假若你是一位入門者,那麼我建議的是,走一條阻礙最少的道路並選擇一個你熟悉的工具。假如你原本是一位 Python 開發者,那麼就選擇使用 Python 的 OpenCV;C++ 的則選擇使用 C++ 的 OpenCV;MATLAB 同理。由於,在將來數月中,你將再也不以一位初學者來學習。固然,你可能會想使用一種新的技能,鑽研一個新項目,或在該領域尋找一份新工做。可是,懂得如何做出選擇每每須要代價。所以,這就是個人建議。github

用於計算機視覺的 MATLAB

直至最近,計算機視覺領域才真正擺脫了處於嬰兒期的研究。過去在該領域研究的人,每每是來自學術界或研究性實驗室,而他們所選擇的工具每每是 MATLAB 語言。因此,相比起 MATLAB 及其社區供應點,OpenCV 在很長的一段時間內總顯得有點蒼白無力。直到在過去的7年裏,潮流才產生了轉向。這裏,我列舉了一些關於使用 MATLAB 的優勢:web

爲什麼使用 MATALAB:優勢

  1. 強大的矩陣庫 :在計算機視覺中,咱們不只會把一張圖片看做是一個多維矩陣,並且,咱們還會在不一樣的算法中使用到大量的線性代數計算。而 MATLAB 的線性代數程序正是很是的強大和快速(當使用正確的時候)。一旦咱們須要解決算法中一個巨大的稀疏線性系統計算時,在 MATLAB 每每只是一行代碼的事情 —— 像 X = A \ b 這樣。在過去,咱們總覺得 C++ 的實現比 MATLAB 要快上起碼三倍的速度。然而,事實並不是如此。在咱們第一個 C++ 所實現的版本中,咱們發現,性能意外地比 MATLAB 所實現的要低。爲了追上 MATLAB 程序的性能,咱們足足花費了數天時間去進行研究。所以,在 MATLAB 中,像反斜杆(\)這樣的一個單一操做符,有時會是一個強大算法的集合。該集合正是 MATLAB 提供給你的最佳選擇。
  2. 工具箱 :無論你須要解決怎樣的問題,MATLAB 總會爲你提供有一個工具箱。該工具箱包括有一個 視頻處理 箱、一個 計算機視覺 箱以及一個 統計及機器學習箱。這些箱在開發過程當中,會爲咱們提供有大量不一樣而有效的算法實現。所提供的方法中,咱們每每也會看到有清晰而明顯的接口。其實,許多的計算機視覺問題均可常常看成是與優化相關的問題。當你嘗試在必定的限制下,去最大化或最小化部分優化目標的時候,你會發現, MATLAB 所提供的 優化工具箱 中會提供有大量經過精妙實現的優化算法。
  3. 可視化及調試工具 :使用 MATLAB 其中一個最大的樂趣,就是能夠在同一個集成環境中書寫代碼、可視化結果並進行調試。該環境使得你格外高效。
  4. 可結合 OpenCV 使用 :你可經過使用 MATLAB 的 OpenCV 接口 去鏈接 OpenCV。
  5. 優雅的文檔:就算是 OpenCV 的忠實支持者也認可 OpenCV 的文檔過於糟糕。相比之下,MATLAB 在自身的集成開發環境(IDE)中就提供有大量優雅的文檔和例子以供閱讀。算法

    // MATLAB
     imshow(im); // OpenCV imshow("myWindow", im);

    大部分時間,咱們都須要展現一張圖片。因爲上帝的原因,咱們只須要以「圖片 1」的名字去調用它,而不是像 OpenCV 那樣強迫我一次又一次地輸入窗體的名字(「myWindow」)。sql

  6. 大型的研究社區 :像我剛說的那樣,MATLAB 是一個學術界中很是受歡迎的工具,以至於最新的研究每每會以 MATLAB 代碼的形式分享出來。所以,想處於技術尖端的你理應須要能讀懂 MATLAB 代碼。

爲什麼不使用 MATALAB:缺點

  1. 成本巨大 :MATLAB 語言自己是極其可怕地昂貴。起初開始,咱們須要一個基礎版的 MATLAB(2,150 美圓)以及一個用於計算機視覺的工具箱(1,350美圓)。此外,該計算機視覺工具箱還須要一個圖像處理工具箱(1,00美圓),並添加有優化(1,350美圓)和機器學習工具箱(1,000美圓)。總共,加起來是6,850美圓。好的,買了以後,你把你的程序創建起來並向把它發佈出去。那麼你就必需要買一個 MATLAB 編譯器(4,250美圓)。你想要用於兩個不一樣的操做系統?那麼就要多花4,250美圓。所以,除非你經過你的大學以折扣價購買,或者你的公司擁有軟件的許可,否則 MATLAB 對於你來講並無多大的意義。
  2. 學習路線曲折 :因爲,MATLAB 是一個矩陣引擎。所以,咱們須要遵循一種 MATLAB 的方式去書寫代碼。該種方式不一樣於像 C++ 或 Python 這樣的通常編程語言。並且,若是你不按照 MATLAB 的方式去寫,那麼,代碼的執行速度將會很是得慢。
  3. 運行時較慢 :一個典型的 MATLAB 程序,其運行速度會比 C++ 的程序慢數倍。雖然,內置的 MATLAB 程序會很快,但你所寫的代碼每每會很慢。所以,人們每每會把計算密集型部分寫成 C,並經過使用 mex 集成在 MATLAB 的代碼中。

用於計算機視覺的 OpenCV(C++)

OpenCV 是我用於開發計算機視覺程序的主要工具。雖然,我也有常用 MATLAB 來創建原型,但除了一個緣由以外,產品版本基本都是基於 OpenCV。讓咱們來看看 OpenCV 的優缺點:django

爲什麼使用 OpenCV(C++):優勢

  1. 免費! :OpenCV 庫的絕大部分是免費的 —— 猶如免費的啤酒和免費的講話!你徹底能夠在你的商業軟件程序中無償使用 OpenCV,並查看到源碼。若是發現了問題,你也能夠根據本身的須要進行修復。固然,使用 OpenCV 的你,也並不須要開源你的項目。
  2. 大量通過優化的代碼庫 :在 OpenCV 中可用的算法集合,使得庫中的其餘東西如同相形見絀。此外,該庫還經過了性能上的優化。有了 OpenCV 3,你還能夠經過透明 API 接口(Transparent API) ,輕易地調用到機器上 OpenCL 的兼容性設備(如 GPU)。最後,OpenCV 中許多的算法,都有着統一計算設備架構(CUDA,Compute Unified Device Architecture)的實現。
  3. 平臺及設備 :你能夠在你的桌面軟件中顯性地使用 OpenCV,也能夠在後端的 web 應用程序中使用。因爲該庫一直專一於性能,所以也成爲了許多嵌入式視覺程序和移動設備應用的首選視覺庫。
  4. 大型的社區 :這裏有着一個大型的社區(47,000人或以上),是專門提供給那些使用或維護 OpenCV 的開發者所使用。此外,該庫的下載次數高達9百萬次。OpenCV 社區並不像由研究人員組成的 MATLAB 社區那樣。它是由來自各行各業的人彙集起來而造成的。此外,OpenCV 的開發也曾受到過像 Intel、AMD 和 Google 這樣的公司所資助。因此不用說,這博客也是 OpenCV 社區的一部分,主要用於開發人員互相幫助。

爲什麼不使用 OpenCV(C++):缺點

  1. 對於入門者來講困難 :若是你在 C++ 方面沒有編程的經驗,那麼使用 OpenCV(C++)將會令你畏懼。所以,使用 Python 對於你來講會更好。
  2. 薄弱的文檔 :OpenCV 的文檔確實使人詬病。因爲,文檔有時並無解釋清楚參數的含義以及影響,所以,你不得不去詳細地從紙面上理解一個算法。並且,文檔不多會貼出代碼的例子,以至於理解變得更加得困難。儘管貼出的代碼有用,可是其也並不是很好地被記錄在文檔中。因此,人們已經開始義務地加入並完善該問題。
  3. 小型的機器學習庫 :一個計算機視覺引擎時常須要大量的機器學習程序。然而,相比於 OpenCV(Python),OpenCV(C++)只含有一個小型的機器學習算法子集。
  4. 可視化和調試 :在任何一個 C++ 的開發環境中,咱們都難以進行調試和可視化。尤爲是對於那些在忙亂中產生的新算法來講,咱們更能體會到這點。因此,我有時候會把執行的數據直接存儲到硬盤中。而後,使用 MATLAB 來分析。

用於計算機視覺的 OpenCV(Python)

我認爲 OpenCV 綁定有 Python 接口,對其普及做出了很多的貢獻。OpenCV(Python)對於學習計算機視覺來講,也是一個不錯的選擇。此外,咱們還能夠把它運用到現實世界中大範圍的應用程序當中。讓咱們來看看它的優缺點:編程

爲什麼使用 OpenCV(Python):優勢

  1. 易於使用 :若是你是一位 Python 開發者,那麼,使用 OpenCV(Python)的過程將會很是簡單。並且,Python 是一門易於學習的語言(尤爲是與 C++ 對比),因此咱們理應把其看成爲第一門語言來學習編程。
  2. Python 成爲了科學計算的一門開發語言 :在幾年前,MATLAB 曾被稱做是科學計算的語言。但現在,有了 OpenCV、 numpy 、 scipy 、 scikit-learn 以及 matplotlib ,Python 在計算機視覺領域和機器學習領域,提供了一個學習和實驗的強大環境。
  3. 可視化及調試 :當使用了 OpenCV(Python),你會感受到猶如進入了一個由 Python 書寫的庫堆當中。使用 matplotlib 去進行結果可視化這方法,幾乎可與 MATLAB 媲美。此外,雖然我還發如今 Python 環境下比 C++ 更容易去調試代碼,但這仍然沒法跟 MATLAB 相比。
  4. 可用於構件 web 後端 :Python 一樣是一種多被用於創建網站的語言。像 Django、 Web2py 和 Flask 這樣的框架能使你快速地組件起 web 應用程序。因此,結合這些框架,咱們使用 OpenCV(Python)會更加地容易。好比說,閱讀一下該篇教程。其講述如何在10分鐘內將 OpenCV 代碼轉換成一個 web api接口。

爲什麼不使用 OpenCV(Python):缺點

  1. 薄弱的文檔 :就像剛纔所說,儘管 OpenCV(C++)的文檔並不那麼的完善,可是, OpenCV(Python)比其更爲糟糕。一位新手使用起來每每會陷入如何去使用特定函數的問題當中。舉個例子來講,在我寫該篇文章的時候,我幾乎很難找到關於 cv2.Subdiv2D 的 python 文檔。並且,你會發現你很難找到更多關於 OpenCV(Python)的教程。
  2. 缺少技術支持 :每當支持 OpenCV 的公司(Intel、AMD、NVidia等),討論到 OpenCV 的 C++ 版本時,他們本身都會產生一些內部鬥爭。由於,他們但願你去使用 OpenCV 併購買他們自家生產的硬件(CPU / GPU 等)來執行算法。然而,OpenCV(Python)如諺語所說的紅髮小孩那樣,並無引發這些公司太大的關注。舉個例子,我到如今還不清楚 OpenCV(Python)是否支持 透明 API 接口 。
  3. 運行時較慢 :相比起 C++,你在 Python 中的程序通常會運行地更慢。由於,在 C++ 裏,你能夠經過添加一個額外的力量去使用 GPU(使用 CUDA 或 OpenCL)。這比起 Python 的實現來講,要快上十倍速度。
  4. OpenCV 是使用 C/C++ 編寫的 :做爲一個開源庫,其好處之一就是能根據你自身需求進行修改。若是你想要修改 OpenCV,你就必須得修改 OpenCV 的 C/C++ 源文件。

總結

做爲一名工程師和能者,咱們須要明白如何使用正確的工具去作正確的事情。在這個過程當中,最終你會逐漸掌握全部的這些工具。做爲個人一個經驗法則,我會使用 MATLAB / OpenCV(Python)來編寫新的算法,而產品的完成則使用 OpenCV(C++)。flask

相關文章
相關標籤/搜索