計算機視覺這種技術能夠將靜止圖像或視頻數據轉換爲一種決策或新的表示。全部這樣的轉換都是爲了完成某種特定的目的而進行的。程序員
輸入數據可能包含一些場景信息,例如「相機是搭載在一輛車上的」或者「雷達發現了一米以外有一個目標」。編程
一個新的表示,意思是將彩色圖像轉換爲黑白圖像,或者從一個圖像序列中消除相機運動所產生的影響。安全
由於咱們是被賦予了視覺的生物,因此很容易誤認爲「計算機視覺也是一種很簡單的任務」。計算機視覺究竟有多困難呢?機器學習
請說說你是如何從一張圖像中觀察到一輛車的。你最開始的直覺可能具備很強的誤導性。人類的大腦將視覺信號劃分爲許多通道,好讓不一樣的信息流輸入大腦。大腦已經被證實有一套注意力系統,在基於任務的方式上,經過圖像的重要部分檢驗其餘區域的估計。在視覺信息流中存在巨量的信息反饋,而且到如今咱們對此過程也知之甚少。函數
肌肉控制的感知器和其餘全部感官都存在着普遍的相互聯繫,這讓大腦可以利用人在世界上多年生活經驗所產生的交叉聯想,大腦中的反饋循環將反饋傳遞到每個處理過程,包括人體的感知器官(眼睛),經過虹膜從物理上控制光線的量來調節視網膜對物體表面的感知。工具
然而在機器視覺系統中,計算機會從相機或者硬盤接收柵格狀排列的數字,也就是說,最關鍵的是,機器視覺系統不存在一個預先創建的模式識別機制。沒有自動控制焦距和光圈,也不能將多年的經驗聯繫在一塊兒。大部分的視覺系統都還處於一個很是樸素原始的階段。性能
圖 1 展現了一輛汽車。在這張圖片中,咱們看到後視鏡位於駕駛室旁邊。可是對於計算機而言,看到的只是按照柵格狀排列的數字。學習
全部在柵格中給出的數字還有大量的噪聲,因此每一個數字只能給咱們提供少許的信息,可是這個數字柵格就是計算機所可以「看見」的所有了。咱們的任務變成將這個帶有噪聲的數字柵格轉換爲感知結果「後視鏡」。spa
圖 2 給出了爲何計算機視覺如此困難的另外一些解釋。設計
一個數學物理定解問題的解若是存在,惟一而且穩定的,則說明該問題是適定的(well-posed);若是不知足,則說明該問題是不適定的(ill-posed)。
實際上,這一問題,正如咱們以前所提出的,用「困難」已經不足以形容它了,它在不少狀況下根本不可能解決。
給定一個對於 3D 世界的二維(2D)觀測,就不存在一個惟一的方式來重建三維信號。即便數據是完美的,相同的二維圖像也可能表示一個無限的 3D 場景組合中的任一種狀況。
並且,前面也提到過,數據會被噪聲和畸變所污染。這樣的污染源於現實生活中的不少方面(天氣、光線、折射率和運動),還有傳感器中的電路噪聲以及其餘的一些電路系統影響,還有在採集以後對於圖像壓縮產生的影響。
在這一系列的影響之下,咱們又該如何推進事情的進展呢?
在經典的系統設計中,額外場景信息能夠幫助咱們從傳感器的層面改善獲取信息的質量。
考慮這樣一個例子,一個移動機器人須要在一棟建築中找到而且拿起一個訂書機。機器人就可能用到這樣的事實:桌子一般放在辦公室裏,而訂書機一般收納在桌子裏。這也一樣給出了一個關於尺寸的推斷:訂書機的大小必定能夠被桌子所收納。
更進一步,這還能夠幫助減小在訂書機不可能出現的地方錯誤識別訂書機的機率(好比天花板或者窗口)。機器人能夠安全忽略掉 200 英尺高的訂書機形狀的飛艇,由於飛艇沒有知足被放置在木製桌面上的先驗信息。
相對的,在諸如圖像檢索等任務中,數據集中全部的訂書機圖像都是來自真實的訂書機,這樣不合常理的尺寸以及一些奇形怪狀的造型都會在咱們進行圖片採集的時候隱式消除——由於攝影師只會去拍攝普通的正常尺寸的訂書機。
場景信息一樣能夠(尤爲是經過機器學習技術)進行建模。隱式的變量(好比尺寸、重力的方向等不容易被直接觀測到的)能夠從帶標記的數據集中發現關係並推測出來。
計算機視覺所面臨的下一個問題是噪聲,咱們通常使用統計的方法來對抗噪聲。
好比,咱們很難經過單獨的像素點和它的相鄰像素點判斷其是不是一個邊緣點,但若是觀察它在一個區域的統計規律,邊緣檢測就會變得更加簡單了。
一個真正的邊緣應該表現爲一個區域內一連串獨立的點,全部點的朝向都與其最接近的點保持一致。
基於攝像機的數據,計算機視覺準備作出的動做或決定是在特定的目的或者任務的場景環境中執行的。咱們也許想要移除噪聲或者修復被損壞的照片,這樣安全系統就能夠對試圖爬上欄杆等危險行爲發出警報,或者對於穿過某個遊樂場區域的人數進行統計。
而在大樓中漫遊的機器人的視覺軟件將會採起和安全系統徹底不一樣的策略,由於兩種策略處於不一樣的語境中。通常來講,視覺系統所處的環境約束越嚴格,咱們就越可以依賴這些約束來簡化問題,咱們最終的解決方案也越可靠。
OpenCV 的目標是爲計算機視覺須要解決的問題提供工具。在某些狀況下,函數庫中的高級功能能夠有效解決計算機視覺中的問題。即便遇到不可以一次性解決的問題,函數庫中的基礎組件也具備足夠的完備性來加強解決方案的性能,以應對任意的計算機視覺難題。
在後一種狀況下,也存在一些使用庫的可靠方法,全部的這些方法都是從儘可能多使用不一樣的組件庫開始。
一般,在開發了第一個粗糙的解決方案以後,就能夠發現解決方案存在哪些缺陷而且使用本身的代碼與聰明才智修復那些缺陷(更爲熟知的說法是「解決真正存在的問題,而不是你想象中的那些問題」)。
在此以後可使用粗糙的解決方案做爲一個評判標準,評價改善水平。從這一點出發,你能夠解決任意問題。
無論你是轉行也好,初學也罷,進階也可,若是你想學編程,進階程序員~
【值得關注】個人 編 程 學 習 交 流 俱 樂 部 !【點擊進入】
全棧程序員正在等你加入~