如何學習C++圖像處理?
我目前即將從事機器視覺行業,大致可以理解為使用一系列圖像處理演算法來處理圖像,然後編寫成桌面軟體給客戶,以完成工業上的一些檢測、測量、識別、操縱之類的工作。
小公司通常使用成熟的商業圖像處理庫,例如德國的Halcon或者美國康耐視公司的VisionPro,這兩個庫我都用過,例如Halcon的程序是這樣的:read_image (Image, "C:/check.bmp")threshold (Image, Region, 0, 30)fill_up (Region, RegionFillUp)
opening_circle (RegionFillUp, RegionClosing1, 10.5)closing_rectangle1 (RegionClosing1, RegionClosing, 600, 600)difference (RegionClosing, RegionClosing1, RegionDifference)opening_rectangle1 (RegionDifference, RegionOpening, 10, 10)area_center (RegionOpening, Area, Row, Column)disp_message (3600, Area, "image", 1200, 1200, "black", "true")類似於MATLAB。但這些函數(運算元)具體的內部實現你是看不見的。但是這些商業圖像庫是要錢的,一套收費一兩萬。
我目前公司編程語言用C#,調用halcon和visionPro的C#介面,寫界面用winform和wpf。但是考慮到以後的長期職業發展,感覺簡單的項目脫離要錢的商業庫會更有競爭力一些。對於大公司來說,簡單的項目一般自己寫圖像處理演算法,我了解到時可以用OpenCV,現在OpenCV 3普遍採用了C++進行編寫,因此我想學習C++和OpenCV。1、所以我就想問問如何學習C++圖像處理?2、C++是用經典的《C++ Primer》嗎?這本書很厚,裡面的哪些章節需要重點學呢?OpenCV怎麼學比較好?3、還有Emgu CV是什麼?是C#版本的OpenCV嗎?那是不是可以不用學C++了呢?
我本人有一點C的基礎,然後熟悉C#(因為工作編寫桌面程序就是用C#),然後MATLAB圖像處理我學過一點,最近打算把岡薩雷斯的《數字圖像處理》仔細看一遍。希望有知友可以指點一下我學習的路線或者方法。非常感謝!
寫OpenCV並不用把C++ Primer看完,因為OpenCV的自有數據結構很棒,API也非常好用,寫好OpenCV並不需要對C++全面紮實的掌握。
在知識上,岡薩雷斯的教材也遠遠不夠用,遠遠不能涵蓋OpenCV 3.0時代的所有modules,而且官方文檔中部分內容寫得比市面上教材還要簡介明了,比如3D Reconstruction,SVM,RGBD processing。
盡量看OpenCV英文文檔,看不懂可以買本 @Vinjn張靜 的 http://www.amazon.cn/%E5%9B%BE%E4%B9%A6/dp/B00DO9TC6C看看。這是兩個問題,C++和圖像處理如何學習,一個是語言工具,一個是實際應用。
Halon也有C#的調用介面,VisonPro就更是C#的了。關鍵是公司用不用C#開發;如果不用,那就只有學習C++了。Emgu CV就是OpenCV的一個C#介面調用版本;
估計你們是視覺方案的集成商,你需要了解圖像處理的基本概念就能勝任了,建議的途徑如下:- 看一本圖像處理的入門書籍,比如你說的岡薩雷斯的;
- 應該會寫界面程序,需要學習你們公司指定的界面開發庫(Qt,MFC,WinForm,WPF之類的)
- 看你們公司用什麼庫,如果是Halon,就看Halcon的手冊和常式,如果是OpenCV就看User Guide,和各個模塊的例子;如果是自己寫代碼,那就學好C++,聽你們的技術老大安排工作吧。
更新—20171123—感恩節---
start
最近半年主要是用tensorflow ,有一定的學習成本,但是在RNN尤其的靈活。
end
首先opencv是一個很好開源庫,幾乎每天寫的代碼都離不開opencv,不管是深度學習的caffe,tensoflow,反正只要和圖像沾邊的opencv是一個必不可少的開源庫。opencv 演算法可以分為兩大類,圖像演算法如feature2d等,機器學習演算法ml。
學習opencv可以看數字圖像處理那本書,把裡邊的圖像演算法用opencv實現一遍。關於機器學習就有很多資料了如李航的統計學習方法, 周志華的機器學習。其實很多演算法opencv都封裝好了,我們需要了解的就是演算法的原理。
另外推薦專欄:【OpenCV】入門教程 並且博主針對opencv3出了一本書——
OpenCV3編程入門。基本上了解這些應該就算入門了,剩下的就需要工程驅動,針對實際問題提出具體的解決方案了。
如果是針對圖像方面的如classification,detection 等任務,用深度學習會更方便,更簡單。我常用的caffe(tf了解一點),直接使用caffe的c++介面,再加wpf就可以做到了完成的桌面程序了。C#/java 調用c++是一件很常見的事情,畢竟在圖像方面c/c++具有效率上的優勢。
少年,我曾經跟你一樣幻想自己做出牛逼的演算法來賣,事實上是,1.一些關鍵演算法難度遠遠超過你想像,就算你知道原理,優化也是大問題,更別說不公開原理的了,優化的技巧太重要了花樣太多。簡單的試試自己寫blob分析,和題目中說的庫對比下,難的就試試幾種匹配演算法,看精度和效率差距有多大。如果你做一台設備,其它演算法都可以自己寫,就匹配定位繞不開,你怎麼辦? 2.市場不需要,大家都用盜版了,而且比較可靠,誰還要你寫底層?就我所看到的,幾十個人以上的公司,設備是通用產品的才有可能用正版,其它小公司一律盜版,代理商自己都用盜版,還有啥好說的? 需要底層演算法的是那些嵌入式的,或者產品量巨大的,或者計算機視覺類的難度較大的或比較新奇的。3.國內有這樣的演算法庫,然並卵,投入大量人力資金卻競爭不過國外的,既不好用賣的有不比國外便宜。 4.大部分人出了學校都是用庫做應用了
本人目前正在從事C#圖像處理的相關工作,對於題主的問題來說說自己的看法。由於我也是剛從事沒多久,正處於學習階段,所以有不對的地方還請指正。1,關於學習C++,個人覺得看書的效率太低,看視頻和博客效率會高一點,書可以用來作為字典,必要的時候翻開看看就行。視頻比較推薦的是傳智播客的教學視頻,以就業培養為主,實戰性較強。個別聽不懂的可以上csdn,上面大神多,說的也清楚。
2,圖像處理,那本厚書還是作為參考書,有些演算法看不懂時可以去那本書上看看原理,幫助理解。注意,理解演算法和寫演算法是完全不同的,那些演算法就算理解了想要用C實現沒有深厚的編程能力和數學基礎是不行的,就算寫出來,效果也不會很好(PS:天賦異稟的除外),鑒於題主是做開發,相信不會有時間讓你去開發演算法的。而此時Opencv就給了我們一個很好的選擇,它是開源的演算法,而且經過無數大神的優化迭代,現在已經是非常成熟的庫了,為什麼不用。關於OpenCV的學習,之前已有答友給我了參考書,現在還有OpenCV 3.0題主可以對照來看。
3,EMGU,簡單的說就是.net平台下的openCV庫,它封裝了OpenCV的函數使得在函數調用方面更加簡單(雖然暫時沒感覺到),和OpenCV函數之間有一些對應的關係,如果需要,以後我可以把那個對照帖子的鏈接貼出來。因為目前我是剛開學習.net平台下的圖像處理,所以很多問題自己也不是特別清楚,希望可以和感興趣的小夥伴一起學習,共同進步!純手機打,夜深了,明天還得上班,錯別字語句什麼的也來不及檢查了,晚安!編程語言是什麼?只是工具而已!只是工具而已!只是工具而已!大致的過一篇,能寫些簡單的測試程序就可以了。真正的敵人是什麼?數學、演算法!
本質上,你只要會把圖像讀進來,後面就不用太考慮什麼語言了。c c+ matlab隨便你。
既然樓主會matlab,也可以考慮用python啊。python的numpy scipy和matlab的矩陣使用差不多,最重要的是,他們和opencv結合很緊密。opencv庫有c++的版本,有python版本,都是官方的。
c++的話看看prime裡面的模板使用方法就好了,其餘和prime沒啥關係吧。
我學習opencv是從工程入手的。先嘗試幾個比較大眾的工程,比如車牌識別,人臉卡通化,人臉識別等等。仔細看代碼。我當時只有基本的c++知識和stl模板的初步使用經驗。我學過c++圖像處理,可惜我智商低,數學也不好,所以無法給你什麼建議,不過前面有位哥們說的對,就圖像處理來說,c++語言反而是較簡單的部分,感覺數學比較重要
恩,有c的基礎就足夠了。
opencv的演算法大多是用C語言配合一些c++的類封裝和標準庫寫成的,你如果去讀某個演算法的實現,會發現從代碼風格到實現細節全是c流派的。不用看完c++primer,其實只要看一點點就行了。
c++特性里所有對性能有降低的部分,opencv裡面全部都沒用過。opencv怎麼學?不用學,網上邊查reference,邊用就行了,這玩意兒還要學嗎?要學的是對圖像處理演算法的理解,多看看圖像處理和計算機視覺的書以及相關論文,並自己動手實現。另外opencv上所有的演算法都是經典論文的忠實還原版,還不一定是最新最好的,所以我本人對opencv從不過度迷信或依賴,你也不要有。個人拙見 圖像處理開發者必讀
作為一個圖像與計算機視覺的開發者,總結了一下作為圖像處理開發工程師應該知道或者掌握的圖像處理知識點。跟大家分享一下,以備大家學習方便。
圖像像素操作
- 幾何運算-加減乘除
- 邏輯運算-與或非取反
- 像素讀寫
- 通道混合與調整
- 對比度與亮度調整
圖像幾何變換
- 插值(zoom in或out)
- 旋轉(rotate)
- 透視變換
- 錯切變換
- 翻轉
像素統計
- 計算均值與方差
- 計算直方圖
- 計算最大最小
- 計算像素內方差
色彩空間
- RGB
- HSL
- YUV
- YCrCb
- 色彩空間轉換
- 灰度轉換
- 調整飽和度與亮度
- 主色彩提取與分析
卷積圖像處理
-空間域卷積
-頻率域卷積
-FFT空域到時域轉換
-模糊
-邊緣提取
-去噪
-增強
-直方圖均衡化
-直方圖反向投影
形態學處理
-腐蝕
-膨脹
-開閉操作
-形態學梯度
-頂帽
-黑帽
-內梯度與外梯度
-分水嶺分割
圖像分割
-K-Means
-Mean-Sift
-分水嶺
-Fuzzy-C Means
-GMM
-Graphic Cut
-區域生長
特徵提取
-SIFT
-SURF
-LBP
-HOG
-Haars
-Blob
-DOG或者LOG
-金字塔
-Haars Corner
-Shi-Tomasi Corner
-Hessian
二值圖像
-全局閾值二值化
-局部閾值二值化
-輪廓提取
-區域測量
-幾何矩特性
-連通區域計算
-泛洪填充
-霍夫變換
-距離變換
-分水嶺分割
-鏈式編碼
-骨架提取
-歐拉數計算
對象識別與匹配
- 直方圖匹配
- 相關性匹配
- 模板匹配
- KNN
- SVM
以上都是作為圖像處理工程師需要掌握的常用知識圖譜,其實還有很多,OpenCV基礎與擴展模塊中包含了更多知識點,每年國際上都會新的研究成果與演算法出現。總之一句話,需要不斷的更新自己的知識,拓寬視野。
乾貨分享【OpenCV學堂】公眾號: CVSCHOOL
+OpenCV學習群 376281510 進群暗號:OpenCV
作為翻譯過Halcon官方手冊的苦逼,我表示你可以用C#、VB、C等等,目前就看java似乎不支持。所有語言實際上都有能力處理圖像問題,只不過圖像處理涉及比較麻煩的底層操作,而單純C不好做界面,其他語言效率上不及C++,加上國內科班教學都用C++或matlab,所以才有C++圖像處理這一說法。
opencv大法確實好,但學好的確不易,個人角度如果是在職階段請作為業餘慢慢來,職場推薦商業庫,短平快還是很重要的,自己搞演算法個人戰勝團隊的概率太小了。
大學畢業設計搞的圖像處理,不想活了。記得當時老師,也不怎麼都懂,白瞎我那麼努力了,雖然寫的渣。
java C++ IOS Android Matlab 中只要涉及到圖像處理的都搞過。我但目前工作需要都是java+opencv。或者Android+opencv,要麼IOS+opencv。總的來說學習opencv是必要的
// 1、所以我就想問問如何學習C++圖像處理?推薦從Python入手,然後用C++的vector代替list,用cv::Mat代替numpy.Array。C的思路和C++挺不一樣的,不推薦(我是C轉C++,項目代碼已經完全重寫了)。C#只是大學學著玩了下,不了解,不過如果和Java差不多的話,也不方便。另外推薦Eigen,肯定用的上。// 2、C++是用經典的《C++ Primer》嗎?這本書很厚,裡面的哪些章節需要重點學呢?OpenCV怎麼學比較好?用著學比較好。寫個小程序把將要使用的功能測試一下比什麼都強,大部頭看了也記不住// 3、還有Emgu CV是什麼?是C#版本的OpenCV嗎?那是不是可以不用學C++了呢?
上面大家也說了,可以在用的時候針對性的學習,opencv提供給你了API,剩下的就是調用這些封裝好的庫,實現自己的應用。我之前寫過一些利用裡面特徵點提取演算法和匹配演算法,實現的相似圖片查找vonzhou/opencv · GitHub,OpenCV的文檔還是比較全面的,不懂的多看,還有一些經典的論文。
推薦閱讀: