




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第3章機器視覺編程基礎3.1Python安裝及環境搭建 3.1.1安裝Python 3.1.2安裝PyCharmCommunity 3.1.3PyCharm初始化
3.1.4在Prompt中安裝OpenCV庫函數3.2Python編譯器3.3Python數據類型 3.3.1數值類型 3.3.2字符串類型 3.3.3布爾類型3.4變量與常量第3章機器視覺編程基礎3.5運算符 3.5.1運算符簡介 3.5.2字符串類型3.6選擇與循環 3.6.1if語句 3.6.2while循環 3.6.3for循環 3.6.4break和continue語句3.7列表與元組 3.7.1序列索引 3.7.2序列切片
第3章機器視覺編程基礎 3.7.3創建 3.7.4查詢 3.7.5修改 3.7.6刪除3.8Numpy數組 3.8.1Numpy.array 3.8.2創建Numpy數組 3.8.3Numpy數組切片3.9字典 3.9.1字典的創建 3.9.2字典的常規操作
第3章機器視覺編程基礎 3.9.3字典的遍歷3.10函數 3.10.1函數的定義與調用 3.10.2參數傳遞3.11面向對象的編程 3.11.1類與對象
3.11.2繼承與多態3.12Python調用MATLAB程序
3.1Pyhton安裝及環境搭建Anaconda官網
/products/individualPyCharm官網
/pycharm/download/#section=windowsPyCharm初始化
創建一個新的工程在Interpreter目錄中選擇CondaEnvironment,在Interpreter右側目錄中選擇Python.exe,此文件Python.exe在已安裝好的Anaconda目錄下,點擊OK完成配置安裝OpenCV庫
選擇Anaconda3下的AnacondaPrompt,在窗口中輸入pipinstall-i/simpleopencv-python==53.2Pyhton編譯器Python是一種跨平臺的計算機程序語言是我們進行項目開發而使用的一門計算機語言,通俗來說就是編寫代碼,編寫完代碼之后,我們就需要運行,這時我們需要運行Python代碼的運行環境和工具Anaconda是一個開源的Python發行版本,其包含了conda、Python等180多個科學包及其依賴項,Conda是一個開源的包、環境管理器,可以用于在同一個機器上安裝不同版本的軟件包及其依賴,并能夠在不同的環境之間切換PyCharm是一種常用的PythonIDE,該IDE提供了一些高級功能,以用于支持Django框架下的專業Web開發,界面編寫代碼和運行操作更加簡單3.2Pyhton編譯器我們使用以下四種方式來運行Python代碼,前提是已經下載好了Python解釋器,下載后配置好其系統環境變量,解釋器的作用就是將Python代碼解釋成機器可以識別并執行的語言1.在命令窗口中運行快捷鍵Win+R—>輸入cmd到命令窗口—>窗口內輸入python3.2Pyhton編譯器2.腳本方式運行新建一個A.txt腳本文件,寫完腳本之后,然后把名稱后綴命名為.py,到命令窗口找到相應的文件目錄,然后執行代碼pythonA.py3.2Pyhton編譯器3.使用Python自帶的IDLE編輯器IDLE是Python原生自帶的開發環境,是迷你版的IDE,與以上方式不同的是它帶有圖形界面,有簡單的編輯和調試功能,但是操作起來比較麻煩。使用方式Win+R—>輸入IDLE3.2Pyhton編譯器4.使用第三方Python的IDE編輯器使用第三方Python的IDE相對于Python自帶的IDLE而言,功能更加全面,界面更加美觀,操作起來更加容易。目前比較流行的有PyCharm、Vscode、Jupyter等,本文推薦廣泛使用的Pycharm3.3.1數值類型數值類型一般用來存儲程序中的數值。Python支持三種不同的數值類型,分別是整型(int)、浮點型(float)和復數型(complex)1.整型整型就是我們常說的整數,沒有小數點,但是可以有正負號。在Python中,可以對整型數據進行(+)、減(-)、乘(*)、除(/)和乘方(**)的操作另外,Python中還支持運算次序,可以在同一個表達式中使用多種運算,還可以使用括號來修改運算次序3.3.1數值類型2.浮點型Python將帶小數點的數字都稱為浮點數。大多數編程語言都使用這個術語,它可以用來表示一個實數,通常分為十進制小數形式(如5.32)和指數形式.指數形式的浮點數用字母e或者(E)來表示以10為底的小數,e之前為整數部分,之后為指數部分,而且兩部分必須同時存在3.復數型在科學計算中經常會遇到復數型的數據,鑒于此,Python提供了運算方便的復數類型。對于復數類型的數據,一般的形式是a+bj,其中a為實部,b為虛部,j為虛數單位
3.3.2字符串類型在Python中可以使用單引號、雙引號、三引號來定義字符串,使用單引號或者雙引號表示的字符串必須在同一行表示,而三引號表示的字符串可以多行表示,這種情況用于注釋:>>>str3="""helloPtyhon!""">>>print(str3)HelloPython!在Python中不可以對已經定義的字符串進行修改,只能重新定義字符串運行結果3.3.3布爾類型
布爾(bool)類型的數據用于描述邏輯運算的結果,只有真(True)和假(False)兩種值,在Python中一般用在程序中表示條件,滿足為True,不滿足為False3.4變量與常量計算機中的變量類似于一個存儲東西的盒子,在定義一個變量后,可以將程序中表達式所計算的值放入該盒子中,即將其保存到一個變量中。在程序運行過程中不能改變的數據對象稱為常量在Python中使用變量要遵循一定的規則,基本規則如下:(1)變量名只包含字母、數字和下劃線。變量名可以以字母或下劃線開頭,但不能以數字開頭。例如,可將變量命名為singal_2,但不能將其命名為2_singal。(2)變量名不包含空格,但可使用下劃線來分隔其中的單詞。例如,變量名open_cl可行,但變量名opencl會引發錯誤。(3)變量名應既簡短又具有描述性。(4)不要將Python關鍵字和函數名用作變量名。例如,break、i、for等關鍵字不能用作變量名3.5.1運算符簡介
Python中,如正負號運算符“+”和“-”接受一個操作數、可以將其稱為一元運算符。而接受兩個操作數的運算符可以稱為二元運算符,如“*”“/”等。如果在計算過程中包含多個運算符,其計算的順序需要根據運算符的結合順序和優先級而定。優先級高的先運算,同級的按照結合順序從左到右依次計算3.5.2運算符優先級按優先順序排列:運算符描述Or布爾“或”And布爾“與”Not布爾“非”in,notin成員測試is,isnot同一性測試<,<=,>,>=,!=,==比較|按位或^按位異或&按位與<<,>>移位+,-加法與減法*,/,%,//乘法,除法,取余,整數除法~x按位反轉**指數/冪3.6選擇與循環選擇結構(根據程序執行路線不同)循環結構也是類似,需要有循環的條件和循環所執行的程序(即循環體)單分支雙分支多分支3.6.1if語句
if語句的子句即if語句在條件成立時所要執行的程序,它將在語句的條件為True時執行。如果條件為False,那么將跳過子句。if單分支結構一般的格式為:if表達式(條件):語句塊(子句)單分支if語句執行過程3.6.1if語句if雙分支結構if子句后有時也可以跟else語句。只有if語句的條件為False時,else子句才會執行if語句同樣可以實現雙分支結構,其一般格式為:
if表達式(條件):語句塊1(1f子句)else;語句塊2(else子句)單分支if語句執行過程3.6.1if語句if多分支結構雖然只有if或else子句會被執行,但當希望有更多可能的子句中有一個被執行時,elif語句就派上用場了。elif語句是“否則如果”,總是跟在if或另一條elif語句后面。它提供了另一個條件,僅在前面的條件為False時才檢查該條件。3.6.1if語句
if語句也可以實現多分支結構,它的一般格式為:if表達式1(條件1):語句塊1elif表達式2(條件2):語句塊2elif表達式3(條件3):語句塊3……elif表達式m(條件m):語句塊m[else:語句塊n]多分支if語句執行過程3.6.2while循環
while循環結構是通過判斷循環條件是否成立來決定是否要繼續進行循環的一種循環結構,它可以先判斷循環的條件是否為True,若為True則繼續進行循環,若為False,則退出循環。while語句基本格式在Python中,while語句的一般格式為:while表達式(循環條件):語句塊 while循環語句執行過程3.6.2while循環while語句中的else語句在Python中可以在while語句之后使用else語句。在while。運向的循環體正常循環結束退出循環后會執行else語句的子句,但是當循環用break語句退出時,else語句的子句則不會被執行。3.6.3for循環當想要在程序中實現計數循環時,一般會采用for循環。在Python中,for循環是一個通用的序列迭代器,可以遍歷任何有序序列對象中的元素。for循環的格式for循環的一般格式為:for目標變量in序列對象:語句塊for循環首先將序列中的元素依次賦給目標變量,每賦值一次都要執行一次循環體的代碼。for循環執行結構3.6.3for循環range在for循環中的應用for循環經常和range聯用。range是Python3.x內部定義的一個迭代器對象,可以幫助for語句定義迭代對象的范圍。其基本格式為:range(start,stopl,[step])range的返回值從start開始,以step為步長,到stop結束,step為可選參數,默認為1。3.6.4break和continue語句break語句和continue語句都是循環控制語句,可以改變循環的執行路徑。break語句break語句多用于for、while循環的循環體,作用是提前結束循環,即跳出循環體。當多個循環嵌套時,break只是跳出最近的一層循環。continue語句continue語句類似于break語句,必須在for和while循環中使用。但是,與break語句不同的是,continue語句僅僅跳出本次循環,返回到循環條件判斷處,并且根據判斷條件來確定是否繼續執行循環。3.7列表和元組在數學里,序列也稱為數列,是指按照一定順序排列的一列數,在程序設計中,序列是一種常用的數據存儲方式Python中內置了5個常用的序列結構,分別是列表、元組、集合、字典和字符串在Python中,列表和元組這兩種序列可以存儲不同類型的元素。不同之處:列表的值是可以改變的,而元組的值是不可變的。3.7.1序列索引序列結構遵循序列索引。序列中的每一個元素都有一個編號,稱為索引。正數索引:從左往右計數,第一個索引值是0負數索引:從右向左計數,最后一個元素的索引值是-13.7.2序列切片切片操作是訪問序列中元素的另一種方法,它可以訪問一定范圍內的元素。通過切片操作可以生成一個新的序列。實現切片操作的語法格式如下:qiepian[start:end:step]參數說明:
qiepian:表示序列的名稱;
start:表示切片的開始位置(包括該位置),如果不指定,則默認為0;
end:表示切片的截止位置(不包括該位置),如果不指定,則默認為序列的長度;
step:表示切片的步長,如果省略,則默認為1,當省略該步長時,最后一個冒號也可以省略。3.7.3創建列表的創建方法一:列表的創建采用在方括號中用逗號分隔的定義方式,基本形式如下:
方法二:列表也可以通過list對象來創建,基本形式如下:list()#創建一個空列表list(iterable)#創建一個空列表,iterable為列舉對象元素3.7.3創建元組的創建采用括號中逗號分隔的定義方式,其中,圓括號可以省略。基本形式如下:
或者為:注意當元組中只有一個項目時,其后面的逗號可以省略,否則,Python解釋器會把(x1)當做x1元組也可以通過tuple對象來創建,基本形式如下:tuple()#創建一個空元組tuple(iterable)#創建一個空元組,iterable為列舉對象元素3.7.4查詢列表和元組都支持查詢(訪問)其中的元素。在Python中,序列的每一個元素被分配一個位置編號,稱為索引(index)。第一個元素的索引是0,序列中的元素都可以通過索引進行訪問。一般格式為:
序列名[索引]列表與元組的正向索引查詢:list_1=[1,2,3]print(list_1[1])tuple_1=((1,2,3))print(tuple_1[0])運行結果為:3.7.4查詢另外,Python序列還支持反向索引(負數索引)。這種索引方式可以從最后一個元素開始計數,即倒數第一個元素的索引是-1。這種方法可以在不知道序列長度的情況下訪問序列最后面的元素。列表與元組的反向索引查詢:list_1=[1,2,3]print(list_1[-1])tuple_1=((1,2,3))print(tuple_1[-2])運行結果為:運行結果為:3.7.5修改對于修改操作,由于元組的不可變性,元組的數據不可以被改變,除非將其改為列表類型。對于列表來說,要修改其中某一個值,可以采用索引的方式,這種操作也叫作賦值。
例如: list_1=[1,2,3] list_1[1]=9 print(list_1)
運行結果為:3.7.5修改append函數的作用是在列表末尾添加一個元素extend函數用于將一個列表添加到另一個列表的尾部由于元組的不可變性,我們不能改變元組的元素,但是可以將元組轉換為列表進行修改,例如:tuple_1=[1,2,3]list_1=list(tuple_1)#元祖轉列表list_1[1]=8tuple_1=tuple(list_1)#列表轉元祖print(tuple_1)運行結果為:3.7.5修改方法解釋說明s.append(x)把對象x追加到列表s的尾部s.clear()刪除所有元素s.copy()復制列表s.extend(t)把序列t附加到列表s的尾部s.insert(i,x)在下標i的位置插入對象xs.pop([i])返回并移除下標i位置的對象,省略i時為最后的對象s.remove(x)移除列表中第一個出現的xs.remove()列表反轉s.sort()列表排序,默認為升序列表對象的主要操作方法3.7.6刪除元素的刪除操作也只適用于列表,而不適用于元組,同樣,將元組轉換為列表就可以進行刪除操作。從列表中刪除元素很容易,可以使用del、clear、remove等操作del不僅可以刪除某個元素,還可以刪除對象clear會刪除列表中所有的元素remove(x)操作會將列表中出現的第一個x刪除3.8Numpy數組Numpy是Python編程語言的擴展,它增加了對大型多維數組和矩陣的支持,以及對這些數組進行操作的大型高級數學函數庫的支持。在Numpy中,數組的類型為ndarray(n維數組),所有元素必須具有相同的類型3.8.1Numpy.array在OpenCV中,很多PythonAPI是基于NumPy的,Numpy是Python的一種開源數值計算擴展,用來處理多維數組。例1:使用Numpy生成一個灰度圖像,其中的像素均為隨機數。importcv2ascvimportnumpyasnppicturegray=np.random.randint(0,256,size=[256,256],dtype=np.uint8)cv.imshow("picturegray",picturegray)cv.waitKey()cv.destroyAllWindows()3.8.1Numpy.array例2:使用Numpy生成一個彩色圖像,其中的像素均為隨機數。importcv2ascvimportnumpyasnppicturecolor=np.random.randint(0,256,size=[256,256,3],dtype=np.uint8)cv.imshow("picturecolor",picturecolor)cv.waitKey()cv.destroyAllWindows()3.8.2創建Numpy數組使用numpy中的函數構建數組使用arange()函數構建數組importnumpyasnpa1=np.arange(12) #產生0到11一維數組print(a1) #[01234567891011]print(a1.shape) #(12,)使用zeros()函數創建一個特定大小、全部填充為0的數組importnumpyasnpa2=np.zeros(9) #產生全是0的一維數組print(a2) #[000000000]print(a2.shape) #(9,)3.8.2創建Numpy數組2從Python列表中創建數組importnumpyasnplist1=[2,6,7,8,1]b1=np.array(list1)print(b1)#[2,6,7,8,1]print(b1.shape)#(5,)3.8.3Numpy數組切片在Python中,可以使用像m:n這樣的表達式來選擇一系列元素,選擇的是以m開頭并以n-1結尾的元素(注意不包括第n個元素)。切片m:n也可以更明確地寫為m:n:1,其中數字1表示應該選擇m和n之間的每個元素。要從m和n之間每兩個元素選擇一個,請使用m:n:2,p個元素,則使用m:n:p一維數組(冒號:),通過冒號分隔切片參數start:stop:step來進行切片操作。一個參數:a[i] 返回與該索引相對應的單個元素兩個參數:b=a[i:j] 表示復制a[i]到a[j-1],以生成新的list對象三個參數:b=a[i:j:s] 三個參數時,i、j、s為索引,通過冒號分隔切片參數start:stop:step來進行切片操作3.9.1字典的創建字典就是用大括號括起來的“關鍵字:值”對的集合體,每一個“關鍵字:值”對被稱為字典的一個元素。創建字典的一般格式為:字典名={[關鍵字1:值1[,關鍵字2:值2,……,關鍵字n:值n]]}其中,關鍵字與值之間用“:”分隔,元素與元素之間用逗號分隔。字典中關鍵字必須是唯一的,值可以不唯一。字典的元素是列表、元祖和字典另外,在Python中還有一種創建字典的方法,即dict函數法3.9.2字典的常規操作訪問在Python中可以通過關鍵字進行訪問,一般格式為:字典[關鍵字]例如:
運行結果為:dict_1={'name':'LiHua','score':95}print(dict_1['score'])3.9.2字典的常規操作更新在Python中更新字典的格式一般為:字典名[關鍵字]=值如果在字典中已經存在該關鍵字,則修改它;如果不存在,則向字典中添加一個這樣的新元素。
dict_2={'name':'LiHua','score':95}dict_2['score']=80 運行結果為:print(dict_2)dict_2['agr']=19print(dict_2)3.9.2字典的常規操作刪除在Python中刪除字典有很多種方法,這里介紹del和clear方法。del方法的一般格式如下:del字典名[關鍵字] #刪除關鍵字對應的元素del字典真名 #刪除整個字典字典的刪除如下所示:dict_3={'name':'LiHua','score':95,'age':19}deldict_3['score']print(dict_3)dict_3.clear()print(dict_3)運行結果為:3.9.2字典的常規操作方法說明d.copy()字典復制,返回d的副本d.clear()字典刪除,清空字典d.pop(key)從字典d中刪除關鍵字key并返回刪除的值d.popitem()刪除字典的“關鍵字:值”對,并返回關鍵字和值構成的元祖d.fromkeys()創建并返回一個新字典d.keys()返回一個包含字典所有關鍵字的列表d.values()返回一個包含字典所有值的列表d.items()返回一個包含字典所有“關鍵字:值”對的列表len()計算字典中所有“關鍵字:值”對的數目字典的其他操作方法3.9.3字典的遍歷對字典進行遍歷一般會使用for循環,但建議在訪問之前使用in或notin判斷字典的關鍵字是否存在。字典的遍歷操作如下所示。dict_4={'name':'LiHua','score':95,}forkeyindict_4.keys():print(key,dict_4[key]) forvalueindict_4.values(): print(value) foritemindict_4.items():print(item) 運行結果為:3.10.1函數的定義和調用函數是帶有名字的代碼塊,用于完成具體的任務在Python中,函數是一種運算或處理過程,即將一個程序段完成的運算或處理過程放在一個自定義函數中完成。這種操作首先要定義一個函數,然后可以根據實際需要多次調用它,而不用再次編寫,大大減少了工作量。函數的定義
Python函數定義的一般格式為:def函數名([形式參數]):
函數體3.10.1函數的定義和調用有了函數的定義,在之后的編程中,只要用到該函數都可以直接調用它。調用函數的一般格式為:函數名(實際參數表)如果定義的函數有形式參數,那么可以在調用函數時傳入實際參數,當然,如果沒有,可以不傳,只保留一個空括號。但需要注意的是,無論有沒有參數的傳遞,函數名后的括號都不可以省略。3.10.1函數的定義和調用例:根據海倫公式計算三角形的面積。importmathdefangle_area(a,b,c):#定義一個angle_area函數
p=(a+b+c)/2s=math.sqrt(p*(p-a)*(p-b)*(p-c))#利用海倫公式計算三角形面積
returnsarea_s=angle_area(3,4,5)#調用angle_area函數print("三角形面積為:",area_s)運行結果3.10.2參數傳遞在調用函數時,Python必須將函數調用中的每個實參都關聯到函數定義中的一個形參。因此,最簡單的關聯方式是基于實參的順序,這種關聯方式稱為位置實參位置實參演示defperson(name_n,sex_o):#定義一個person函數
print("Mynameis",name_n)print("Iama",sex_o)person('LiHua','man')#調用函數程序運行結果在函數中,可根據需要使用任意數量的位置實參,Python將按順序將函數調用中的實參關聯到函數定義中相應的形參3.10.2參數傳遞關鍵字參數是傳遞給函數的名稱。由于直接在實參中將名稱和值關聯起來,因此向函數傳遞實參時不會混淆。使用關鍵字參數時無須考慮函數調用中的實參順序,而且關鍵字參數還清楚地指出了函數調用中各個值的用途。在Python中,關鍵字參數的形式為:
形參名=實參值關鍵字參數演示defperson(name_n,sex_o):#定義一個person函數
print("Mynameis",name_n)print("Iama",sex_o)person(name_n='LiHua',sex_o='man')#調用函數程序運行結果3.10.2參數傳遞編寫函數時,可以為每個形參指定默認值。在調用函數中為形參提供了實參時將使用指定的實參值;否則將使用形參的默認值。因此,為形參指定默認值后,可在函數調用中省略相應的實參。在Python中,默認值參數的形式為:
形參名=默認值默認值參數演示defperson(name_n,sex_o='man'): #定義一個person函數
print("Mynameis",name_n)print("Iama",sex_o)person(name_n='LiHong',sex_o='woman') #調用函數,修改第二個參數person(name_n='LiHua') #采用默認參數程序運行結果3.11.1類與對象類是一種廣義的數據,這種數據類型的元素既包含數據,也包含操作數據的函數類的創建在Python中,可以通過class關鍵字來創建類。類的格式一般如下:claas類名:
類體類一般由類頭和類體兩部分組成。類頭由關鍵字class開頭,后面緊跟著類名,類體包括所有細節,向右縮進對齊3.11.1類與對象例
創建Dog類classDog():def_init_(self,name,age):#初始化Dog類
=nameself.age=agedefsit(self):#定義類方法
print(.title()+"isnowsitting.")defroll_over(self):#定義類方法
print(.title()+"rolledover!"根據Dog類創建的每個實例都將存儲名字和年齡,我們賦予每只小狗蹲下(sit())和打滾(roll_over())的能力。類中的函數稱為方法,之前或今后學習的方法都適用于它。_init_())是一個特殊的方法,每當根據Dog類創建新實例時,Python都會自動運行該方法3.11.1類與對象類的使用(實例化)進行Dog類的實例化:my_dog=Dog('wangcai',6)print("Mydog'snameis"+my_.title())print("Mydogis"+str(my_dog.age)+"yearsold.")程序運行結果:
(Dog類實例化顯示結果)3.11.1類與對象屬性和方法的訪問句點表示法訪問屬性:my_my_dog.age訪問Dog類中定義的name和age屬性訪問方法:my_dog=Dog('wangcai',6)my_dog.sit()my_dog.roll_over()訪問Dog類中定義的sit()和roll.over()方法3.11.2繼承與多態繼承如果要編寫的類是另一個現成類的特殊版本,則可使用繼承的方法。一個類繼承另一個類時,它將自動獲得另一個類的所有屬性和方法。原有的類稱為父類,新創建的類稱為子類。子類除了繼承父類的屬性和方法之外,同時也有自己的屬性和方法在Python中定義繼承的一般格式為:Class子類名(父類名) 類體3.11.2繼承與多態多態多態是指不同的對象收到同一種消息時產生不同的行為。在Python中,消息是指函數的調用,不同的行為是指執行不同的函數在例3-21的程序中中,Animal類和兩個子類中都有talk()方法,雖然同名,但是在每個類中調用的函數是不一樣的。當調用該方法時,所得結果取決于不同的對象,同樣的信息在不同的對象下所得的結果不同,這就是多態的體現。3.12Python調用MATLAB程序Python調用MATLAB函數首先要找到MATLABR2017b中python所在的安裝路徑,如D:\ProgramFiles\MATLAB\R2017b\extern\engines\python,打開文件夾setup.py是python調用MATLAB所需要的文件。3.12Python調用MATLAB程序MATLAB提供了一套python接口,即MATLABAPIforPython,需要我們自行安裝,在命令行中輸入下列命令cd:D:\ProgramFiles\MATLAB\R2017b\extern\engines\pythonpythonsetup.pyinstall3.12Python調用MATLAB程序打開MATLAB中的build目錄,將目錄中的matlab文件夾復制到D:\ProgramFiles\Python\Anaconda3\Lib文件夾下。在python中加載matlab.engine和matlab啟動Matlab引擎3.12Python調用MATLAB程序Python調用MATLAB的.m文件如調用matlab代碼add.m,MATLAB端的代碼如下:a=1.0;b=2.0;c=a+b將add.m拷貝到python項目文件下。python調用add.m,python端代碼如下:importmatlabimportmatlab.engine #importnumpyasnpeng=matlab.engine.start_matlab()eng.add(nargout=0)執行結果為:3思考與練習3-1簡述Python和PyCharm安裝的具體步驟。3-2Python具有哪幾類編譯器,各有何特點?3-3使用Numpy生成一個灰度圖像,其中的像素均為隨機數。3-4使用Numpy生成一個彩色圖像,其中的像素均為隨機數。3-5編程實現使用arange()函數構建數組的程序。3-6簡述在Python中,Numpy數組切面的特點及引用規則。3-7舉例說明Python調用Matlab程序的步驟。第4章機器視覺測量系統4.1工業相機4.2鏡頭 4.2.1鏡頭結構 4.2.2現場 4.2.3光學倍率和數值孔徑 4.2.4景深 4.2.5曝光量和光圈數 4.2.6分辨率 4.2.7鏡頭選擇4.3光源 4.3.1光源的基本性能參數 4.3.2常見可用光源4.4圖像采集卡4.5數據通信接口
第4章機器視覺測量系統機器視覺測量系統包含工業相機、光源照明系統與圖像處理軟件、圖像采集系統、數據通信接口。除具備上述硬件系統后,工業相機成像后,需要進行攝像機標定,包括坐標系間的變換關系,工業相機成像模型。一個典型的工業機器視覺系統包括:光源、鏡頭(定焦鏡頭、變倍鏡頭、遠心鏡頭、顯微鏡頭)、相機(包括CCD相機和COMS相機)、圖像處理單元(或圖像捕獲卡)、圖像處理軟件、監視器、通訊/輸入輸出單元等。第4章機器視覺測量系統工業機器視覺系統定焦鏡頭
光源鏡頭圖像處理單元相機圖像處理軟件監視器通訊/輸入輸出單元變倍鏡頭
遠心鏡頭
顯微鏡頭
CCD相機
COMS相機
4.1
工業相機工業相機是視覺系統的關鍵部件,其性能直接影響到識別精度和定位抓取的精度。選用工業相機要考慮到工件托盤的特征、工件的輪廓特征以及光線等條件。工業相機又稱工業攝像頭、工業攝像頭、工業照相機等。根據所使用的的芯片類型分為工業CCD相機和工業CMOS相機;根據信號種類分為工業模擬相機和工業數字相機;其中數字相機又分為:GigE千兆網、USB2.0、USB3.0、CameraLink、1394A和1394B等多種接口。4.1
工業相機CCD相機
COMS相機
根據使用的芯片不同:根據信號種類:工業數字相機
工業模擬相機
GigE千兆網USB2.0 USB3.0 CameraLink
1934A
1934B
4.2
鏡頭鏡頭相當于人眼的晶狀體,如果沒有晶狀體,人眼看不到任何物體;如果沒有鏡頭,攝像機所輸出的圖像就是白茫茫的一片,沒有清晰的圖像輸出。當人眼的睫狀體無法按需要調整晶狀體凸度時,將出現人們常說的近視(或遠視)眼,眼前的景物就變得模糊不清;攝像機與鏡頭的配合也有類似現象,當圖像變得不清楚時,可以調整攝像機的像方焦點,改變攝像機芯片與鏡頭基準面的距離(相當于調整人眼晶狀體的凸度),可以將模糊的圖像變得清晰。由此我們知道,光學鏡頭的主要作用是將景物的光學圖像聚焦在圖像傳感器的光敏陣列上。視覺系統處理的所有圖像信息均通過鏡頭得到,鏡頭的質量直接影響視覺系統的整體性能4.2
鏡頭分類依據類型說明工作波長紫外鏡頭同一光學系統對不同波長的光其折射率不同,這導致同一點發出的不同波長的光成像時不能會聚成一點,從而產生色差。常用鏡頭的消色差設計只針對可見光范圍,而應用于其他波段的鏡頭則需要進行專門的消色差設計可見光鏡頭近紅外鏡頭紅外鏡頭變焦與否定焦鏡頭(按焦距長短分)魚眼鏡頭焦距長短劃分不是以焦距的絕對值為首要標準,而是以像角的大小為主要區分依據,所以當靶面的大小不等時,其標準鏡頭的焦距大小也不同短焦鏡頭標準鏡頭長焦鏡頭變焦鏡頭手動變焦變焦鏡頭最長和最短焦距值之比稱為變焦倍率電動變焦4.2
鏡頭視場大小廣角鏡頭視角90°以上,觀察范圍較大,短焦距提供寬角度視場,魚眼鏡頭是一種焦距約6~16mm的短焦距超廣角攝影鏡頭標準鏡頭視角50°左右,使用范圍較廣長焦(遠攝)鏡頭視角20°以內,焦距幾十或上百毫米,長焦距提供高倍放大變焦鏡頭鏡頭焦距連續可變,焦距可以從廣角變到長焦工作距離望遠鏡頭物距很大普通攝影鏡頭物距適中顯微鏡頭物距很小分類依據類型說明4.2
鏡頭接口類型C型鏡頭基準面至焦平面距離為17.526mm,C型鏡頭與CS型攝像機配合使用需在二者之間增加一個5mm的C/CS轉接環CS型鏡頭基準面至焦平面距離為12.5mmF型F接口鏡頭是尼康鏡頭的接口標準,又稱尼康口,是通用型接口,一般適用于焦距大于25mm的鏡頭、以及靶面大于1英寸的攝像機V型V接口鏡頭是施耐德鏡頭主要使用的標準,一般也用于攝像機靶面較大或特殊用途的鏡頭特殊用途鏡頭顯微鏡頭一般用于光學倍率大于10:1的系統,但由于目前CCD像元尺寸已經做到3μm以內,所以光學倍率大于2:1時也會選用顯微鏡頭微距鏡頭一般是指光學倍率為2:1~1:4范圍內特殊設計的鏡頭。當圖像質量要求不高時,一般可采用在鏡頭和攝像機之間增加近攝接圈的方式或在鏡頭前增加近拍鏡的方式達到放大成像的效果遠心鏡頭主要為糾正傳統鏡頭視差而特殊設計的鏡頭,可以在一定的物距范圍內,使得拍攝到的圖像其放大倍率不隨物距的變化而變化分類依據類型說明4.2
鏡頭按照有效像場的大小進行分類
鏡頭類型有效像場尺寸(1英寸=25.4mm)電視攝像鏡頭1/4英寸攝像鏡頭3.2mm×2.4mm(對角線4mm)1/3英寸攝像鏡頭4.8mm×3.6mm(對角線6mm)1/2英寸攝像鏡頭6.4mm×4.8mm(對角線8mm)2/3英寸指像鏡頭8.8mm×6.6mm(對角線11mm)1英寸攝像鏡頭12.8mm×9.6mm(對角線16mm)電影攝影鏡頭35mm電影攝影鏡頭21.95mm×16mm(對角線27.16mm)16mm電影攝影鏡頭10.05mm×7.42mm(對角線12.49mm)照相鏡頭135型攝影鏡頭36mm×24mm127型攝影鏡頭40mm×40mm120型攝影健頭80mm×60mm中型攝影鏡頭82mm×56mm大型攝影鏡頭240mm×180mm4.2
鏡頭由于系統中所用攝像機的靶面尺寸有各種型號,所以在選擇鏡頭時須注意鏡頭的有效像場應該大于或等于攝像機的靶面尺寸,否則成像的邊角部分會模糊甚至沒有影像。下面介紹鏡頭的結構、相關參數及鏡頭選擇方法,以便在實際應用中獲取最優的系統性能。4.2.1
鏡頭結構鏡頭由多個透鏡、可變(亮度)光圈和對焦環組成,有些鏡頭有固定調節系統。使用時通過觀察顯示圖像的明亮程度及清晰度來調整可變光圈和焦點4.2.2
視場視場(FOV)是指系統能夠觀察到的物體的物理尺寸范圍,也就是CCD芯片上所成圖像最大時對應的物體的大小。它與工作距離dw,焦距f、CCD芯片尺寸sc有關。在不使用近攝環的情況下,四個參數之間的關系可用以下比例表達式表示
光學成像示意圖4.2.3
光學倍率和數值孔徑光學倍率是指成像大小與物體尺寸的比值,可以表示為
式中: NA——物方數值孔徑 NA'——像方數值孔徑物方孔徑角和折射率分別為u和n,像方孔徑角和折射率分別為u'和n’,則物方和像方的數值孔徑分別表示為
數值孔徑示意圖
4.2.4
景深拍攝有限距離的景物時,可在像面上成清晰圖像的物距范圍叫做景深按理想光學系統的特性及透鏡公式計算: (4-5)對于從透鏡中心至圖像平面的距離,只有一個距離等于z的空間平面與之共軛,該平面稱為對準平面。嚴格來講,除對準平面上的點能成點像外,其他空間點在圖像平面上只能為一個彌散斑。當彌散斑小于一定限度時,仍可認為是一個點,這是由成像裝置的空間分辨率所決定的,于是小于成像裝置分辨率的一定量的離焦可以忽略。
4.2.4
景深
4.2.4
景深物點處于離焦位置時,成像在圖像平面上的是一個圓形的彌散斑。如果圓斑的直徑小于成像裝置的分辨率,離焦量可以忽略。假設圓斑直徑為b’,入射光瞳直徑為D,焦距為f,透鏡中心距圖像平面的長度為。如果圖像平面向透鏡方向移動到一個新的距離,那么模糊程度為: (4-6)根據相似三角形,b’/2與之比等于d/2與之比。由式(4-5)能分別解出對應于z和z1情況下的
和
,并且將這些表達式代入式(4-6)得到與物距相關的模糊量: (4-7)
4.2.4
景深假設b等于可以接受的彌散圓的最大直徑,由式(4-7)計算出能成清晰像的最近平面(即近景平面)的距離: (4-8)為了計算遠景平面的距離,讓 (4-9)式中,是對應于最大模糊量情況下的圖像平面遠離透鏡方向移動到一個新的距離。同理可以得到: (4-10)進一步求解式(4-10)得到遠景平面距離
4.2.4
景深上面的公式給出了這條與近景平面位置與焦距f、入射光瞳直徑D、最大可接受的像糊量b’、對準平面位置z之間的關系。
,稱為超焦距(hyperfocaldistance),此時,遠景平面位置和景深為無窮遠。遠景與近景平面位置之差表示為景深:由上式可知,景深與孔徑光闌(光圈),焦距,鏡頭與物體間距離有直接的關系。焦距越短,景深越大;鏡頭離物體的距離越遠,景深越大;光圈越小,景深越大。光圈增大,通光量增加,景深減小,于是在光圈與景深之間需要有一個折中或平衡。而小光圈和良好的光線使聚焦更簡單。
4.2.5
曝光量和光圈數攝像機收集到的光景,即曝光量(exposure),依賴于到達像面上的光強(圖像輻照度,imageirradiance)與曝光持續時間(快門速度,shutterspeed)的乘積 功率乘以時間所得結果為能量,當圖像輻照度的單位為W/m2時,曝光量的單位為J/m2。光圈數,或稱F數(F-number,f#),它與焦距f,入射光瞳直徑D之間的關系為指定物鏡以F數為單位,因為對于相同F數的不同物鏡來說,圖像強度(恒定快門速度下的曝光量)是一樣的。換句話說,F數表征單位入射光瞳直徑下不同焦距透鏡的接受光強的能力。
4.2.5
曝光量和光圈數F數是以
為公比的等比級數,因為兩倍入瞳面積(aperturearea)等于入瞳直徑增加
倍,F數的常用值為1.4、2、2.8、4、5.6、8、11、16、22等。每一擋F數的變化改變1.4倍入瞳直徑,提高2倍到達像面的光強。最小F數是衡量鏡頭質量好壞的重要參數之一。例如,電影攝影機用的鏡頭,最小F數可達0.85。F數越小,表示它能在光線較暗的情況曝光或用較短的時間曝光,可以進行高速攝影。攝影光學系統采用調節光圈大小的方法來調節F數,光圈越小,F數越大,景深也越大,但由于像面的照度變小,需要相應增加曝光時間,才能使感光底片得到相同的曝光量,定量關系是:曝光時間與F數的平方成正比。4.2.6
分辨率從波動光學的角度看,當光通過光學系統中的光闌等限制光波傳播的光學元件時要發生衍射,因而物點的像并不是一個幾何點,而是以像點為中心具有一定大小的斑,稱為愛里斑(Airydisk)。如果兩個物點相距很遠,它們各自形成的愛里斑就比較遠,它們的像就容易區分開;如果兩個物點相距很近,對應的愛里斑重疊太多,就不能清楚地分辨出兩個物點的像,所以光的衍射限制了光學成像系統的分辨能力瑞利(Raylcigh)判據:當一個愛里斑的邊緣正好與另一個愛里斑的中心重合時,這兩個愛里斑剛好能被區分開,如圖4-6所示。瑞利判據也是一條經驗判據,它是根據正常人眼的分辨能力提出的,正常人眼可以分辨出光強差20%的差別,當一個愛里斑邊緣與另一個愛里斑中心重疊時,兩個愛里斑中心的光強是兩中心連線中點處光強的1.2(1.0/0.7351.2)倍。剛好被人眼區分開。用光學術語來說,瑞利判據定義了像中的圓形分辨單元,因為兩個點光源可以被分辨的條件是它們不落在同一個分辨單元里。4.2.6
分辨率根據以上描述,瑞利距離可以表示為
圖4-6瑞利判據示意圖當衍射斑中心距離大于或等于時可以分辨,小于時不能分辨。4.2.6
分辨率如果使用最小分辨角來描述,則瑞利判據可以表示為
。也就是說,兩個愛里斑中心對圓孔中心的張角,正好等于愛里斑半徑對圓孔中心的張角。光學系統的分辨率定義為的倒數,即
(4-17)式(4-17)表明,增大透鏡的直徑或減小入射光的波長都可以提高系統的光學分辨率。在天文望遠鏡中,為了提高分辨率和增加光通量,總是使用直徑很大的透鏡作為物鏡。例如,加那列望遠鏡通光孔徑達10.4m。而在顯微鏡中,為了提高分辨率,可用紫外光照射,在電子顯微鏡(electronmicorscope)中,電子物質波的波長很短(0.001~0.1nm),因此電子顯微鏡的分辨率可比一般光學顯微鏡提高數千倍。4.2.6
分辨率式(4-17)決定了視場中心的分辨率,視場邊緣由于成像光束的孔徑角比軸上點小,分辨率有所降低。實際的成像物鏡總有一定的剩余像差,其分辨率要比理想分辨率低得多,而視場邊緣受軸外像差和光束漸暈的影響,要低得更多。有人認為瑞利判據過于寬松,于是又提出另外兩個判據,即道斯(Dawes)判據和斯派羅(Sparrow)判據。根據道斯判據,人眼剛好能分辨兩個衍射斑的最小中心距為
根據斯派羅判據,兩衍射斑之間的最小中心距為
4.2.6
分辨率通過單獨分析單個透鏡分辨率以及后面章節中的光電成像器件和圖像采樣等,將它們綜合起來確定整個數字成像系統的像素間距。無論物體中包含有多高的頻率,超過成像系統MTF的截止頻率的那些信息并不能提供給數字化設備。而這個頻率也不會超出初始成像透鏡或反射鏡的光學傳遞函數(OTF)的截止頻率
這樣,如果我們令折疊頻率(采樣頻率的一半)等于OTF的截止頻率,就可以避免混疊。恰當進行插值,就能根據采樣點無誤差地重構圖像。令折疊頻率等于圖像中出現的最高頻率,稱為按Nyquist標準采樣。按此準則像素間距對攝像機而言為
。如果按照瑞利距離,像素間距應為
,該數值比Nyquist標準給出的大22%。4.2.7
鏡頭選擇光學鏡頭是視覺測量系統的關鍵設備,在選擇鏡頭時需要考慮多方面的因素。(1)鏡頭的成像尺寸應大于或等于攝像機芯片尺寸。(2)考慮環境照度的變化。(3)選用合適的鏡頭焦距。(4)成像過程中需要改變放大倍率,采用變焦鏡頭,否則采用定焦鏡頭,并根據被測目標的狀態應優先選用定焦鏡頭。(5)接口類型互相匹配。(6)特殊要求優先考慮。結合實際應用特點,可能會有特殊要求。4.3光源光源照明系統是影響機器視覺系統檢測質量的重要因素,其直接影響輸入數據的質量和應用效果。需要具有以下特點或要求:(1) 盡可能突出物體的特征;(2) 增強目標區域與背景區域的對比度,能夠有效的分割圖像;(3) 光譜要求:光源光譜功率分布的峰值波長應與光電成像器件的靈敏波長一致;(4) 強度要求:光強會影響攝像機的曝光,光線不足對比度變低,需要加大放大倍數,這樣噪聲也會相應放大,也可能使鏡頭的光圈加大,于是景深將減小。反過來,光強過高會浪費能量,并產生熱量;(5) 均勻性要求:在所有的機器視覺應用中,都會要求均勻的光照,因為所有的光源隨著距離的增加和照射角度的偏離,其照射強度減小,所以在對大面積物體照射時,會帶來較大的問題,有時只能做到視場的中心位置保持均勻;(6) 成像質量要求:物體位置變化不影響成像質量,測量過程中在一定范圍內移動物體時,照明效果不受影響。4.3.1光源的基本性能參數輻射效率和發光效率在給定的波長范圍內,某一光源所發出的輻射通量與產生該輻射通量所需要的功率P之比,成為該光源的輻射效率在可見光范圍內,某一光源的發光效率為光通量與功率P之比
和分別表示測量系統的光譜范圍,實際應用中,采用輻射效率高的光源以節省能源。4.3.1光源的基本性能參數光譜功率分布光源輸出的功率與光譜有關,即與光的波長有關,稱為光譜的功率分布。四種典型的光譜功率分布如圖4-7所示。圖4-7(a)為線光源,如低壓汞燈光譜的功率分布;圖4-7(b)為帶狀光源,如高壓汞燈光譜;圖4-7(c)為連續光譜光譜,如白熾燈、鹵素燈光譜;圖4-7(d)為復合光譜,它由連續光譜與線狀、帶狀光譜組合而成,熒光燈光譜。4.3.1光源的基本性能參數光譜功率分布圖4-7四種典型的光譜功率分布(a)線狀光源(b)帶狀光源(c)連續光源(d)復合光源4.3.1光源的基本性能參數光源的顏色光源的顏色包含鈉色表和顯色性。一般用眼睛直接觀察光源時所看到的顏色稱為光源的色表,如高壓鈉燈的色表呈黃色,熒光燈的色表呈白色等。當用這種光源照射物體時,物體呈現的顏色(即物體反射光在人眼內產生的顏色感覺)與該物體在完全輻射體照射下所呈現的顏色的一致性,稱為該光源的顯色性。4.3.2常用可見光源任何發出光輻射的物體都可以叫做光輻射源。這里所指的光輻射包括紫外光、可見光洪紅外光的輻射。通常把能夠發出可見光的物體叫做光源,而把能夠發出非可見光的物體叫做輻射源。按照光輻射來源的不同,通常將光源分成兩大類:自然光源和人工光源。自然光源主要包括太陽、恒星等,這些光源對地面輻射通常不穩定且無法控制,在視覺測量中很少使用,并且作為雜散光予以消除或抑制,因而視覺測量系統中大量使用人工光源。按照工作原理不同,人工光源大致分為熱輻射光源、氣體放電光源、發光二極管和激光光源。4.3.2常用可見光源
自然光源:太陽、恒星…… 按照光輻射來源不同
人工光源(按照工作原理不同)
熱輻射光源氣體放電光源發光二極管激光光源4.4圖像采集卡計算機通過圖像采集卡(imagecapturecard)接收來自圖像傳感器的模擬信號,對其進行采樣、量化成數字信號,然后壓縮編碼成數字視頻序列。一般圖像采集卡采用幀內壓縮的算法把數字化的視頻存儲成AVI文件,高檔的圖像采集卡直接把采集到的數字視頻數據實時壓縮成MPEG-1格式的文件4.4圖像采集卡圖像采集卡模擬圖像采集卡與數字圖像采集卡彩色圖像采集卡與黑白圖像采集卡面掃描圖像采集卡與線掃描圖像采集卡圖像采集卡的分類4.4圖像采集卡圖像采集卡的技術參數(1)圖像傳輸格式。圖像采集卡需要支持系統中攝像機所采用的輸出信號格式大多數攝像機采用RS422或EIA(LVDS)作為輸出信號格式。在數字攝像機中廣泛應用IEEE1394,USB2.0,USB3.0,GigE,5GigE和CameraLink幾種圖像傳輸形式。(2)圖像格式(像素格式)①黑白圖像。通常情況下,圖像灰度等級可分為256級,即以8位表示。
在對圖像灰度有更高的要求時,可用10位、12位等來表示。②彩色圖像。彩色圖像可由RGB(YUV)3種色彩組合而成,根據其亮度
級別的不同有8-8-8,10-10-10等格式。4.4圖像采集卡圖像采集卡的技術參數(3)傳輸通道數。當攝像機以較高速率拍攝高分辦率的圖像時,會產生很高的輸出速率,一般需要多
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030中國特許餐飲業行業發展趨勢分析與未來投資戰略咨詢研究報告
- 2025至2030中國片狀石墨市場消費格局與未來營銷渠道分析報告
- 畜牧產業規模化經營投資協議
- 市場推廣與品牌合作協議細節條款
- 專業網站建設及搜索引擎優化合同
- 20以內的不退位減法質量測試習題
- 小學三年級數學兩位數乘一位數計算同步檢測習題
- 三年級數學三位數除以一位數競賽試題口算題帶答案
- 雙旦活動引流活動方案
- 客戶關系管理外包服務合同
- 語文學科核心素養
- 做賬實操-數據處理和存儲服務業的賬務處理
- 礦產資源儲量報告編制和評審中常見問題及其處理意見
- 2024年清理道路塌方協議書模板
- 河南省鄭州市管城回族區2023-2024學年五年級下學期期末數學試卷
- GB 44495-2024汽車整車信息安全技術要求
- 人教版五年級3《長方體和正方體》 單元整體作業設計
- 2024年廣東省中考物理試卷(含答案逐題解析)
- DB43-T 2745-2023 地理標志產品 汨羅粽子
- 乒乓球體育課教案
- NB-T47003.1-2022常壓容器第1部分:鋼制焊接常壓容器
評論
0/150
提交評論