用C++和python開發opencv程序比較?

用C++和python開發opencv程序有什麼區別?大家做個比較吧!

——————————以下由劉鏟鏟提問——————————

用C++和python開發opencv,

1.哪個更容易上手?

2.代碼運行的效率差距大嗎?

3.兩個語言對應的openCV的庫有不同嗎?

4.對於非程序員的研究人員,想要開發一個視覺產品,選用哪個比較好?


我的畢業設計就是用OpenCV 2寫的,前期使用C++寫了個Demo,最後的成品是用Python 2寫的。

兩者主要的區別在於介面和效率。

實際上Python和C++的OpenCV介面幾乎一樣,不同的是用C++的話,矩陣用的是cv::Mat,Python裡面用的是numpy.array,用法和介面都不一樣,但文檔豐富,使用也非常方便,原理也相似。

效率方面,Python的介面實際上只是一層Binding,最終還是調用libopencv_*.so裡面的函數,所以在OpenCV這一層效率與C++是完全一致的。唯一不同的就是它的numpy.array和cv::Mat。Numpy底層也是使用C Extension的方法寫,但相比C++版的OpenCV介面,Python的介面需要把Numpy的數據轉化成OpenCV的C介面可接受的輸入。

實測Python寫的程序會慢,但具體慢多少並沒有測試數據可支撐。

用Python寫實際上也不會比C++開發快多少,因為介面都是一樣的,我建議不如直接用C++寫。

我後面選Python實際上只是想試一下Python介面而已。


1.一個尿性,庫本身的差別並不大。

2.因為都是調的庫,差別仍舊不大。說用numpy.array的,並不是唯一選擇,實際上仍然有Mat類,你也可以直接使用,並不一定要用numpy.array。坦白說,從效率來看,因為numpy有numba神器,有可能比cv.Mat更快。然而限制所在在於GIL以及非庫運算中的速度限制。例如你非要寫幾個for循環而不願意用array/Mat的相關函數算符,慢一點也是沒辦法的。由於GIL的存在,OpenCV在py上跑單個進程就被控在單核里了,多線程基本上沒啥用,提高效率往往要多進程,手法嫻熟可能效率差距不大,太生僻有可能寫出慢十幾倍多玩意來。

3. 庫其實是一樣的PyOpenCV只是一層封裝而已。

4. Python寫著快但是其實坑很多。如果你說的「產品」是生產環境下工作的,而你自身對python的了解又不夠深入,那麼選擇C++會更好。如果你很了解python了,或者說主要做快速成型驗證想法之類的活兒,Python有著寫起來省時省力的優勢,畢竟動態類型提供的方便足夠多,熟悉的話不會踩坑/不在意踩坑的話自然是怎麼方便怎麼來。


簡單說兩句,選python還是C++,考慮下面幾個問題

1. 性能壓力在哪裡?python的GIL使得多線程不能多核並行,必須用多進程,而且天生python要比c++慢一些。因此如果是cpu密集型,建議用C++,如果是IO密集型,python沒有那麼大的劣勢。

2. 開發成本高還是運行成本高,一個開發人員一個月多少錢,一個伺服器一個月多少錢,通常來說前者越來越貴而後者反之,權衡下利弊,C++開發要比python慢,在性能都達標的情況下,如果節省的伺服器成本能抵過開發成本,用C++,反之用python。


1,差不多,基本調用參數都一樣,格式符合各自語言規範。

2,在我開發的程序中python比cpp明顯有差距,但是換到工作用的電腦上這個差距就看不錯來了,so,硬體配置好一些,用python做實時也是沒有問題的。外,感覺同樣的函數python就是比cpp慢一些,雖然上面說到python底層用的也是lib。

3,基本一樣。(python可能功能稍微差一點2.4.8版本有個函數沒在python中找到,但是也就那一個)

4,python比較簡單,開發可能快一點(主要是軟體的其他部分可能比較容易開發)。


如果C++比較熟悉就直接用C++開發吧, OpenCV的Mat已經很強大了,使用起來很方便,很多demo例子也只有C++版本的,copy/paste也方便。。。。。

python的用numpy的ndarray替換了Mat,雖然numpy也很強大,但是和原生的Mat使用方法上有些差別,使用起來有些怪怪的感覺(主要還是numpy不熟悉。。。)。

再次安利下VS下調試OpenCV的神器ImageWatch,有了它,代碼想怎麼寫就怎麼寫,矩陣有問題加個斷點就能看出來。


一般都是Python做實驗、調試什麼的,定型後就用C++寫了


我覺得PYTHON很好。主要的好處是它的支持庫太多了。對於開發原型產品,理解演算法是非常有幫助的。


推薦閱讀:

TAG:Python | C | OpenCV | 機器視覺 | 深度學習DeepLearning |