OpenCV 計算機視覺庫

2021-09-30 08:13:48 字數 2300 閱讀 9120

opencv是乙個由因特爾公司支援的開源機器視覺庫,關於它的介紹,網上隨便一搜就車載斗量。這裡我不談視覺庫的主要內容,而是將這段時間來對它的使用心得作個簡單介紹,以啟發打算用這個庫的朋友的思路,與大家一起來分享。

在學校的時候,雖然是影象處理研究方向,但真正具體的應用到影象的很多東西,還是在參加工作以後的事。以前在處理影象的時候,我們從不擔心速度的問題,以為計算機硬體發展到今天,無所不能的了,雙核乃至四核的處理速度簡直要趕上宇宙飛船了。但用在機器視覺上,那又是另外一碼事。通常而言,機器視覺要求對影象的處理速度都是以毫秒為單位,具體而言是幾點幾個毫秒,硬體再硬,如果演算法不好,速度就永遠提不上去,所以速度還是至關重要的東西,並不是所謂由硬體技術就決定了的。

速度是乙個方面,精度又是另乙個重要方面了。視覺中對精度的要求,通常是以亞畫素標準來衡量的。所以對影象處理的演算法,不是一般的演算法來解決,往往都得使用子像元演算法,這樣才能達到亞畫素標準。通常我們對一幅影象的畫素座標都是用整數計算,但在機器視覺中普遍採用亞畫素標準,都是浮點數來計算的。但有的雖然寫出來的是浮點數,未必就是用的子像元演算法,它的結果根本就不是亞畫素。視覺中精度的要求,也是要求極高,一般以微公尺為計量單位,像幾點幾個微公尺,而只有使用子像元演算法才能真正達到這個要求。

總的說來,目前國內還沒有乙個真正意義上的成功的機器視覺開發包,國內的機器視覺方面的大公司基本上還是以**國外的軟體為主。一方面固然是國內的起步晚,但我覺得更多原因還是國內在這方面沒有下功夫去做一些基礎性的研究工作,總是靠**別人的東西來實現乙個視覺系統的開發。而opencv就是乙個在機器視覺方面基礎工作做得最好的。

總的說來,opencv提供的函式庫涉及的方面很廣,影象處理功能強大,但它僅僅是供研究的乙個基礎的東西,並不是一計膏藥,往哪一貼哪就好使。我們只有在借助它提供的一些基礎功能上進行深入研究,才能開發出屬於自己的產品來。

opencv作為乙個開源的函式庫,為我們提供了很多方便,看它的源**,確實有很多值得學習的獨到地方。但作為開源的,侷限也就在此。它的很多東西並不是最優的,如果真要那樣,直接就可以拿來在商業上運用了。所以,我們只有不斷的對它進行改造,才能更貼近我們的應用,這裡結合我在使用的幾處加以說明。

首先是影象的定位。opencv也提供了乙個影象匹配的函式,這個函式還是寫的不錯的,但要直接用到商業上就不行了。因為它的處理速度很慢,精度也不是亞畫素的,而且沒有旋轉。它僅僅是乙個單純的灰度定位。要怎麼用好這個函式呢,在使用這個函式的時候,我還是下了很多功夫的,對此做了一些改進,讓它真正的實現了商業價值。如今我用opencv編寫的定位軟體,其速度和精度絲毫不比國外的那些名牌軟體差多少,像halcon和sapera這樣的軟體巨頭,我用opencv做出來的定位效果,比如一幅解析度為1280*1024的影象,它們的速度是幾個毫秒,而我做出來的多3至4個毫秒,精度也差不多,但由於opencv本身不是亞畫素的侷限所在,所以精度通常在乙個畫素左右。

再說幾何定位,halcon是採用基於幾何形狀的演算法來進行定位的,可以說做得非常的好,好就好在它的模版影象形狀可以任意選取,任意旋轉。而sapera的基於邊緣輪廓的定位還要上乙個層次,關於它的演算法,目前還沒有人了解,至今還是個謎。在很多機器影象定位上,幾何定位效果更好,更準確。灰度定位在一些影象區域直方圖相近似的情況下,往往很難找準目標區域。而幾何定位,根據區域的幾何特徵來做出判斷,不單準確,而且執行起來效率更高。目前我用opencv做的幾何定位總體上說效果還不錯,但精度還趕不上,在影象邊緣的離合上還不那樣準確,不過在後續的研究中,還是會趕上的。

一般而言,對於影象的目標區域都是有形狀的,但在實際運用中,我遇到乙個客戶只要求定位直線的,由於直線不屬於乙個有形狀的區域,它的特徵很難描述,所以看似最簡單的卻最難辦。opencv採用hough變換來檢測直線和圓,效果也並不好。因為hough變換的實質也就是兩種不同空間的對映,它在雜訊大的影象中,檢測出來的結果千奇百怪。所以要準確的找到邊,必然對影象做好預處理,讓處理後的邊緣很明顯表現出來,再進行hough檢測就容易多了。

在機器視覺中,blob分析是要經常遇見的,opencv也有blob跟蹤的例項,但我沒去認真用過,而是自己做了個演算法採用它也實現了,且效果也不錯。我在做乙個啤酒瓶磨具號碼檢測的專案裡,就呼叫了自己設計的blob分析演算法,效果都還不錯。

在具體使用中,往往要用到我們自己定義的影象型別,於是又把opencv裡的iplimage結構進行了改造,然後定義了屬於自己的影象類,可以隨意讀取,這樣方便了很多。其實opencv裡面對檔案的操作寫得相當好,非常方便。

總的來說,opencv是乙個非常不錯的開源專案,有很多東西需要我們去學習。但它的源**,要讀明白也非易事。因為它涉及到大量的巨集定義,很多函式語句都是些巨集定義在裡面,還互相巢狀,看起來相當的困難。而且本人接觸它的時間也不過兩三個月,所以理解得也不透徹。還得一邊用、一邊學,在實踐中摸索和消化。在此只為提示乙個思路而言,其中演算法不便言明,否則老闆看見,定然要批評了。商場如戰場,一切都要做好保密工作,哈哈!

(一)OpenCV 開源計算機視覺庫介紹

opencv是乙個用於影象處理 分析 機器視覺方面的開源函式庫.無論你是做科學研究,還是商業應用,opencv都可以作為你理想的工具庫,因為,對於這兩者,它完全是免費的。該庫採用c及c 語言編寫,可以在windows,linux,mac osx系統上面執行。該庫的所有 都經過優化,計算效率很高,因為...

計算機視覺 opencv人臉識別

import cv2 步驟1 載入影象 gray cv2.cvtcolor img cv2.color bgr2gray 將影象轉換成灰度模式 opencv載入影象的方式是bgr cv2.imshow test gray cv2.waitkey 0 為什麼不直接在載入影象的時候指定灰度影象?而是要轉...

計算機視覺OpenCV傅利葉變換

傅利葉變換的作用 高頻 變化劇烈的灰度分量。例如邊界。低頻 變化緩慢的灰度分量,例如大海。低通濾波器 只保留低頻,會使得影象模糊 高通濾波器 只保留高頻,會使得影象細節增強 cv2.dft img,cv2.dft complex output 進行傅利葉變化 引數說明 img表示輸入的,cv2.df...