原文作者 :?Satya Mallick 譯者 :?aleen42
原文??https://aleen42.gitbooks.io/personalwiki/content/translation/opencv_vs_matlab/opencv_vs_matlab.html
?https://blog.csdn.net/lhbbzh/article/details/52049478
?
我們經常會為自己的技能選擇合適工具而感到疑惑。雖然,工具能夠幫助你鍛煉技能,但它們并不能使你成為一位能者(Craftsman)。一位真正的能者,在他們的口袋中往往會擁有許多不同的工具。另外,他們還能明智地挑選一個合適的工具去完成自己的工作。因此,能者并不與工具產生掛鉤,而是自身的技能。
有時,我會覺得那些所謂的編程語言很可笑。因為,參與大戰的人總糾結于哪門語言是最好的。然而事實上,作為編程人員的我們,理應是懂得為自己的工作,去挑選一門合適的語言。例如,你想快速開發一個 Web 應用程序的話,你可以嘗試使用基于 Rails 或 Django 的 Ruby 去進行開發。而若你想為一個嵌入式設備開發高性能的代碼,你則可以嘗試一下 C 語言。
在計算機視覺領域方面,我們同樣會遇到相似的選擇問題。到底一個計算機視覺工程師 / 編程人員需要學習哪一個工具呢 —— 使用 C++ 的 OpenCV?使用 Python 的 OpenCV?還是 MATLAB 呢?當然我們應該慶幸,現在還能有若干個工具供我們選擇。因為在十多年前,計算機視覺領域并不存在任何一個優質的代碼庫。在那時,如果你想學習該領域,就必須得拿起一本書并開始為自己的小型代碼庫編寫一些關于計算機視覺算法的代碼。所以值得慶幸的是,如今事情已然變得非常美好。
倘若你是一位入門者,那么我建議的是,走一條阻礙最少的道路并選擇一個你熟悉的工具。假如你本來是一位 Python 開發者,那么就選擇使用 Python 的 OpenCV;C++ 的則選擇使用 C++ 的 OpenCV;MATLAB 同理。因為,在未來數月中,你將不再以一位初學者來學習。當然,你可能會想使用一種新的技能,鉆研一個新項目,或在該領域尋找一份新工作。但是,懂得如何作出選擇往往需要代價。因此,這就是我的建議。
用于計算機視覺的 MATLAB
直至最近,計算機視覺領域才真正擺脫了處于嬰兒期的研究。過去在該領域研究的人,往往是來自學術界或研究性實驗室,而他們所選擇的工具往往是 MATLAB 語言。所以,相比起 MATLAB 及其社區供應點,OpenCV 在很長的一段時間內總顯得有點蒼白無力。直到在過去的7年里,潮流才產生了轉向。這里,我列舉了一些關于使用 MATLAB 的優點:
為何使用 MATALAB:優點
強大的矩陣庫?:在計算機視覺中,我們不僅會把一張圖片看作是一個多維矩陣,而且,我們還會在不同的算法中使用到大量的線性代數計算。而 MATLAB 的線性代數程序正是非常的強大和快速(當使用正確的時候)。一旦我們需要解決算法中一個巨大的稀疏線性系統計算時,在 MATLAB 往往只是一行代碼的事情 —— 像 X = A \ b 這樣。在過去,我們總以為 C++ 的實現比 MATLAB 要快上起碼三倍的速度。然而,事實并非如此。在我們第一個 C++ 所實現的版本中,我們發現,性能意外地比 MATLAB 所實現的要低。為了追上 MATLAB 程序的性能,我們足足花費了數天時間去進行研究。因此,在 MATLAB 中,像反斜桿(\)這樣的一個單一操作符,有時會是一個強大算法的集合。該集合正是 MATLAB 提供給你的最佳選擇。 工具箱?:不管你需要解決怎樣的問題,MATLAB 總會為你提供有一個工具箱。該工具箱包括有一個?視頻處理?箱、一個?計算機視覺?箱以及一個?統計及機器學習箱。這些箱在開發過程中,會為我們提供有大量不同而有效的算法實現。所提供的方法中,我們往往也會看到有清晰而明顯的接口。其實,許多的計算機視覺問題都可經常當作是與優化相關的問題。當你嘗試在一定的限制下,去最大化或最小化部分優化目標的時候,你會發現, MATLAB 所提供的?優化工具箱?中會提供有大量通過精妙實現的優化算法。 可視化及調試工具?:使用 MATLAB 其中一個最大的樂趣,就是可以在同一個集成環境中書寫代碼、可視化結果并進行調試。該環境使得你格外高效。 可結合 OpenCV 使用?:你可通過使用?MATLAB 的 OpenCV 接口?去連接 OpenCV。 優雅的文檔:就算是 OpenCV 的忠實支持者也承認 OpenCV 的文檔過于糟糕。相比之下,MATLAB 在自身的集成開發環境(IDE)中就提供有大量優雅的文檔和例子以供閱讀。
// MATLABimshow(im);// OpenCVimshow("myWindow", im); 大部分時間,我們都需要展示一張圖片。由于上帝的緣由,我們只需要以“圖片 1”的名字去調用它,而不是像 OpenCV 那樣強迫我一次又一次地輸入窗體的名字(“myWindow”)。
大型的研究社區?:像我剛說的那樣,MATLAB 是一個學術界中非常受歡迎的工具,以致于最新的研究往往會以 MATLAB 代碼的形式分享出來。因此,想處于技術尖端的你理應需要能讀懂 MATLAB 代碼。
為何不使用 MATALAB:缺點
成本巨大?:MATLAB 語言本身是極其可怕地昂貴。起初開始,我們需要一個基礎版的 MATLAB(2,150 美元)以及一個用于計算機視覺的工具箱(1,350美元)。此外,該計算機視覺工具箱還需要一個圖像處理工具箱(1,00美元),并添加有優化(1,350美元)和機器學習工具箱(1,000美元)。總共,加起來是6,850美元。好的,買了之后,你把你的程序建立起來并向把它發布出去。那么你就必須要買一個 MATLAB 編譯器(4,250美元)。你想要用于兩個不同的操作系統?那么就要多花4,250美元。因此,除非你通過你的大學以折扣價購買,或者你的公司擁有軟件的許可,不然 MATLAB 對于你來說并沒有多大的意義。 學習路線曲折?:由于,MATLAB 是一個矩陣引擎。因此,我們需要遵循一種 MATLAB 的方式去書寫代碼。該種方式不同于像 C++ 或 Python 這樣的一般編程語言。而且,如果你不按照 MATLAB 的方式去寫,那么,代碼的執行速度將會非常得慢。 運行時較慢?:一個典型的 MATLAB 程序,其運行速度會比 C++ 的程序慢數倍。雖然,內置的 MATLAB 程序會很快,但你所寫的代碼往往會很慢。因此,人們往往會把計算密集型部分寫成 C,并通過使用?mex?集成在 MATLAB 的代碼中。
用于計算機視覺的 OpenCV(C++)
OpenCV 是我用于開發計算機視覺程序的主要工具。雖然,我也有經常使用 MATLAB 來建立原型,但除了一個原因之外,產品版本基本都是基于 OpenCV。讓我們來看看 OpenCV 的優缺點:
為何使用 OpenCV(C++):優點
免費!?:OpenCV 庫的絕大部分是免費的 —— 猶如免費的啤酒和免費的講話!你完全可以在你的商業軟件程序中免費使用 OpenCV,并查看到源碼。如果發現了問題,你也可以根據自己的需要進行修復。當然,使用 OpenCV 的你,也并不需要開源你的項目。 大量經過優化的代碼庫?:在 OpenCV 中可用的算法集合,使得庫中的其他東西如同相形見絀。此外,該庫還通過了性能上的優化。有了 OpenCV 3,你還可以通過透明 API 接口(Transparent API)?,輕易地調用到機器上 OpenCL 的兼容性設備(如 GPU)。最后,OpenCV 中許多的算法,都有著統一計算設備架構(CUDA,Compute Unified Device Architecture)的實現。 平臺及設備?:你可以在你的桌面軟件中顯性地使用 OpenCV,也可以在后端的 web 應用程序中使用。由于該庫一直專注于性能,因此也成為了許多嵌入式視覺程序和移動設備應用的首選視覺庫。 大型的社區?:這里有著一個大型的社區(47,000人或以上),是專門提供給那些使用或維護 OpenCV 的開發者所使用。此外,該庫的下載次數高達9百萬次。OpenCV 社區并不像由研究人員組成的 MATLAB 社區那樣。它是由來自各行各業的人聚集起來而形成的。此外,OpenCV 的開發也曾受到過像 Intel、AMD 和 Google 這樣的公司所資助。所以不用說,這博客也是 OpenCV 社區的一部分,主要用于開發人員互相幫助。
為何不使用 OpenCV(C++):缺點
對于入門者來說困難?:如果你在 C++ 方面沒有編程的經驗,那么使用 OpenCV(C++)將會令你畏懼。因此,使用 Python 對于你來說會更好。 薄弱的文檔?:OpenCV 的文檔確實令人詬病。由于,文檔有時并沒有解釋清楚參數的含義以及影響,因此,你不得不去詳細地從紙面上理解一個算法。而且,文檔很少會貼出代碼的例子,以致于理解變得更加得困難。盡管貼出的代碼有用,但是其也并非很好地被記錄在文檔中。所以,人們已經開始義務地加入并完善該問題。 小型的機器學習庫?:一個計算機視覺引擎時常需要大量的機器學習程序。然而,相比于 OpenCV(Python),OpenCV(C++)只含有一個小型的機器學習算法子集。 可視化和調試?:在任何一個 C++ 的開發環境中,我們都難以進行調試和可視化。尤其是對于那些在忙亂中產生的新算法來說,我們更能體會到這點。所以,我有時候會把執行的數據直接存儲到硬盤中。然后,使用 MATLAB 來分析。
用于計算機視覺的 OpenCV(Python)
我認為 OpenCV 綁定有 Python 接口,對其普及作出了不少的貢獻。OpenCV(Python)對于學習計算機視覺來說,也是一個不錯的選擇。此外,我們還可以把它運用到現實世界中大范圍的應用程序當中。讓我們來看看它的優缺點:
為何使用 OpenCV(Python):優點
易于使用?:如果你是一位 Python 開發者,那么,使用 OpenCV(Python)的過程將會非常簡單。而且,Python 是一門易于學習的語言(尤其是與 C++ 對比),所以我們理應把其當作為第一門語言來學習編程。 Python 成為了科學計算的一門開發語言?:在幾年前,MATLAB 曾被稱作是科學計算的語言。但如今,有了 OpenCV、?numpy?、?scipy?、?scikit-learn?以及?matplotlib?,Python 在計算機視覺領域和機器學習領域,提供了一個學習和實驗的強大環境。 可視化及調試?:當使用了 OpenCV(Python),你會感覺到猶如進入了一個由 Python 書寫的庫堆當中。使用?matplotlib?去進行結果可視化這方法,幾乎可與 MATLAB 媲美。此外,雖然我還發現在 Python 環境下比 C++ 更容易去調試代碼,但這仍然無法跟 MATLAB 相比。 可用于構件 web 后端?:Python 同樣是一種多被用于建立網站的語言。像?Django、?Web2py?和?Flask?這樣的框架能使你快速地組件起 web 應用程序。所以,結合這些框架,我們使用 OpenCV(Python)會更加地容易。比如說,閱讀一下該篇教程。其講述如何在10分鐘內將 OpenCV 代碼轉換成一個 web api接口。
為何不使用 OpenCV(Python):缺點
薄弱的文檔?:就像剛才所說,盡管 OpenCV(C++)的文檔并不那么的完善,但是, OpenCV(Python)比其更為糟糕。一位新手使用起來往往會陷入如何去使用特定函數的問題當中。舉個例子來說,在我寫該篇文章的時候,我幾乎很難找到關于?cv2.Subdiv2D?的 python 文檔。而且,你會發現你很難找到更多關于 OpenCV(Python)的教程。 缺乏技術支持?:每當支持 OpenCV 的公司(Intel、AMD、NVidia等),討論到 OpenCV 的 C++ 版本時,他們自己都會產生一些內部斗爭。因為,他們希望你去使用 OpenCV 并購買他們自家生產的硬件(CPU / GPU 等)來執行算法。然而,OpenCV(Python)如諺語所說的紅發小孩那樣,并沒有引起這些公司太大的關注。舉個例子,我到現在還不清楚 OpenCV(Python)是否支持?透明 API 接口?。 運行時較慢?:相比起 C++,你在 Python 中的程序一般會運行地更慢。因為,在 C++ 里,你可以通過添加一個額外的力量去使用 GPU(使用 CUDA 或 OpenCL)。這比起 Python 的實現來說,要快上十倍速度。 OpenCV 是使用 C/C++ 編寫的?:作為一個開源庫,其好處之一就是能根據你自身需求進行修改。如果你想要修改 OpenCV,你就必須得修改 OpenCV 的 C/C++ 源文件。
總結
作為一名工程師和能者,我們需要明白如何使用正確的工具去做正確的事情。在這個過程中,最終你會逐漸掌握所有的這些工具。作為我的一個經驗法則,我會使用 MATLAB / OpenCV(Python)來編寫新的算法,而產品的完成則使用 OpenCV(C++)。
來源:https://www.cnblogs.com/python-frog/p/9058648.html
總結
以上是生活随笔 為你收集整理的【转载】OpenCV(C++ 与 Python 的比较)与 MATLAB 的比较 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。