工業(yè)機器視覺技術(shù)及應(yīng)用課件:C# 軟件及Halcon、OpenCV_第1頁
工業(yè)機器視覺技術(shù)及應(yīng)用課件:C# 軟件及Halcon、OpenCV_第2頁
工業(yè)機器視覺技術(shù)及應(yīng)用課件:C# 軟件及Halcon、OpenCV_第3頁
工業(yè)機器視覺技術(shù)及應(yīng)用課件:C# 軟件及Halcon、OpenCV_第4頁
工業(yè)機器視覺技術(shù)及應(yīng)用課件:C# 軟件及Halcon、OpenCV_第5頁
已閱讀5頁,還剩268頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

C#軟件及Halcon、OpenCV5.1C++和C#語言概述5.2Halcon簡介5.3OpenCV

5.1

C++?和C#?語言概述

1.C++?語言概述世界上第一種計算機高級語言是誕生于1954年的FORTRAN語言。1970年,美國電話電報公司(AT&T)Bell實驗室的D.Ritchie和K.Thompson共同發(fā)明了C語言,研制C語言的初衷是用于編寫UNIX系統(tǒng)程序。1979年,Bell實驗室的BjameSgoustrup開始將C語言改良為帶類的C的開發(fā)工作,1983年被正式命名為C++?語言。

運行C++?語言程序需要編譯程序和鏈接程序兩步。編譯程序是編譯器將C++?語句轉(zhuǎn)換成機器碼(也稱為目標(biāo)碼)。鏈接程序是鏈接器將編譯獲得的機器碼與C++?庫中的代碼進行合并。

C++?語言的程序?qū)儆诰幾g型程序。運行C++?語言的程序需要兩步:第一步是編譯程序。編譯器將C++?語句轉(zhuǎn)換成機器碼;第二步是鏈接程序。鏈接器將編譯獲得機器碼與C++?庫中的代碼進行合并。

C++?語言被公認為功能最強大的程序之一,它具有以下特點:

1)支持數(shù)據(jù)封裝和數(shù)據(jù)隱藏

在C++?語言中,類是支持數(shù)據(jù)封裝的工具,對象是數(shù)據(jù)封裝的實現(xiàn)。C++?語言通過建立用戶定義類支持數(shù)據(jù)封裝和數(shù)據(jù)隱藏。在面向?qū)ο蟮某绦蛟O(shè)計中,將數(shù)據(jù)和對該數(shù)據(jù)進行合法操作的函數(shù)封裝在一起作為一個類。對象為具有一個給定類的變量。每個給定類的對象包含這個類所規(guī)定的若干私有成員、公有成員及保護成員。類一旦建立,就可看成完全封裝的實體,而作為一個整體單元使用。

2)支持繼承和重用

在C++?語言中現(xiàn)有類的基礎(chǔ)上可以聲明新類型,即支持繼承和重用。通過繼承和重用,可以更有效地組織程序結(jié)構(gòu),明確類間的關(guān)系,并且充分利用已有的類來完成更復(fù)雜、深入的開發(fā)。新定義的類為子類,成為派生類,可以從父類繼承所有非私有的屬性和方法,作為自己的成員。由于存在繼承性,因此這些對象共享許多相似的特征。

3)支持多態(tài)性

采用多態(tài)性為每個類指定表現(xiàn)行為。多態(tài)性形成由父類及其子類組成的一個樹型結(jié)構(gòu)。在樹中的子類可以接收一個或多個具有相同名字的消息。當(dāng)消息被樹中一個類的一個對象接收時,這個對象動態(tài)地決定給予子類對象的消息的某種用法。

2.C#?語言概述

C#?語言(讀為CSharp)是微軟公司發(fā)布的一種面向?qū)ο蟮?、運行于.NETFramework之上的高級程序設(shè)計語言[31],其是由C語言和C++?語言衍生出來的面向?qū)ο蟮木幊陶Z言,具有安全、穩(wěn)定、簡單、優(yōu)雅等特點。在繼承C語言和C++?語言強大功能的同時,去掉了一些復(fù)雜特性(如沒有宏、不允許多重繼承)。C#?語言綜合了VB簡單的可視化操作和C++?語言的高運行效率,因其強大的操作能力、優(yōu)雅的語法風(fēng)格、創(chuàng)新的語言特性和便捷的面向組件編程的支持,成為.NET開發(fā)的首選語言。

C#?語言程序需要.NET運行庫作為基礎(chǔ),而.NET運行庫作為Windows的一部分,在一些版本較舊的Windows平臺上不能運行。C#?語言能夠使用的組件或庫只有?.NET運行庫等有限的選擇,沒有豐富的第三方軟件庫支持。

相比而言,C++?語言的設(shè)計目標(biāo)是低級的、與平臺無關(guān)的面向?qū)ο蟮木幊?,C#?語言則是一種高級的面向組件的編程語言。C#?語言不再處理細微的控制,而是讓架構(gòu)來處理這些重要的問題。兩者各有優(yōu)勢,可根據(jù)需求合理選擇。

5.2.1

Halcon基礎(chǔ)

Halcon是德國MVtec公司開發(fā)的一套完善的、標(biāo)準的機器視覺算法包,擁有廣泛的機器視覺集成開發(fā)環(huán)境[32]。其應(yīng)用范圍廣泛,只要用得到圖像處理的地方,就可以用Halcon強大的計算分析來完成工作,涵蓋醫(yī)學(xué)、遙感探測、監(jiān)控,再到工業(yè)上的各類自動化檢測,如宇宙航空和太空旅行、汽車零件制造、制陶業(yè)、電子元件和設(shè)備、玻璃制造和生產(chǎn)、身體健康和生命科學(xué)、精密工程和光學(xué)、保安監(jiān)控及通訊等。

5.2Halcon簡介

1.Halcon的特點

Halcon具有如下特點:

(1)功能模塊豐富:Halcon由一千多個各自獨立的函數(shù),以及底層的數(shù)據(jù)管理核心構(gòu)成,包含了各類濾波、數(shù)學(xué)轉(zhuǎn)換、形態(tài)學(xué)計算分析、校正、分類辨識、形狀搜尋等計算功能。

(2)

Halcon與硬件獨立:Halcon支持絕大部分圖像采集卡,為百余種工業(yè)相機和圖像采集卡提供接口,包括GenlCam,GigE和TEEE

1394,從而確保了硬件的獨立性。

(3)支持多種操作系統(tǒng)和編程語言:Halcon支持Windows操作系統(tǒng)、Linux系統(tǒng)和MacOSX系統(tǒng),Halcon整個函數(shù)庫可以用C、C++、C#、VisualBasic和Delphi等多種普通編程語言訪問。

(4)資源需求?。菏褂肏alcon設(shè)計人機接口時沒有特別的限制,可以完全使用開發(fā)環(huán)境下的程序語言架構(gòu)自己的接口,對執(zhí)行作業(yè)機器的資源要求不高。

(5)易于開發(fā):為了提高開發(fā)視覺系統(tǒng)的效率,Halcon包含了一套交互式的程序設(shè)計接口HDevelop,可以用Halcon程序代碼直接編寫、修改、執(zhí)行程序,并且可以查看計算過程中的所有變量。設(shè)計完成后,可以直接輸出C、C++、COM、VB語言等程序代碼,并嵌入到程序中。

(6)緊跟前沿:Halcon提供了極為突出的新技術(shù),如三維表面比較,即將一個三維物體的表面形狀測量結(jié)果與預(yù)期形狀進行比較。Halcon提供的所有三維技術(shù)(如多目立體視覺),都可用于表面重構(gòu),支持直接通過現(xiàn)成的三維硬件掃描儀進行三維重構(gòu)。另外,Halcon現(xiàn)在還支持許多三維目標(biāo)處理的方法,如點云的計算和三角測量、形狀和體積特征計算、點云分割等。自動算子并行處理技術(shù)是Halcon的一個獨特性能。

2.Halcon的語法結(jié)構(gòu)特點

Halcon可與C#、C++?語言實現(xiàn)交互的模式有:

(1)算子模式:以C#?為例,默認導(dǎo)出為算子型的語法結(jié)構(gòu),而非面向?qū)ο蟮?;在此模式下,全部函?shù)聲明為全局類型,數(shù)據(jù)類型只需要用Hobject、HTuple兩種類型進行聲明。

(2)面向?qū)ο竽J剑阂悦嫦驅(qū)ο蟮姆绞街貙懘a。

3.Halcon的數(shù)據(jù)類型

Halcon支持的數(shù)據(jù)類型有控制變量、圖形、數(shù)組及句柄。數(shù)組可以用一個變量傳遞多個對象,可以由重載后的函數(shù)來處理。不同類型數(shù)組的下標(biāo)起始值有所差異,圖形數(shù)組的下標(biāo)從1開始,控制變量數(shù)組下標(biāo)從0開始。句柄不能是常量,可用來描述窗體、文件等。在Halcon的參數(shù)中,參數(shù)包括圖形參數(shù)和控制系數(shù)。

1)圖形參數(shù)Iconic

圖形參數(shù)Iconic主要包括Image、Regions和XLD三個參數(shù)。

(1)

Image。

在Halcon中,Image?=?Channel?+?Domain,像素點存放在Channel矩陣中,根據(jù)ROI來描述Image。

(2)

Regions。

Regions以行列坐標(biāo)形式儲存,并有廣泛的應(yīng)用。其特點是高效,可利用同態(tài)算子,如用閾值對圖像分割結(jié)果。

(3)?XLD。

圖像均用像素點保存,而像素點是整型的、不連續(xù)的,Halcon做了拓展,定義了亞像素(Subpixel)描述幾何輪廓的對象:XLD(ExtendedLineDescription),主要用在亞像素測量的背景下,可用于提取邊緣、構(gòu)建輪廓等應(yīng)用,另外,在模板匹配、圖形校準等多方面有重要的應(yīng)用。

2)控制參數(shù)Control

控制參數(shù)Control包括string、integer、real和handle四個參數(shù)。

String類型變量由單引號括起來,此外還有一些特殊字符;Boolean型變量包括true(1)、false(0)。

4.Halcon的基本語句

1)賦值語句

賦值語句是Halcon中最基礎(chǔ)的語句,其中Assign算子為賦值語句,對數(shù)據(jù)賦值,如Assign(Input,Result)。

Input為輸入?yún)?shù);Result為賦值結(jié)果。Assign的使用如圖5-1所示。

圖5-1算子窗口

運行結(jié)果如圖5-2所示。

圖5-2程序編輯器輸出結(jié)果

2)運算符

Halcon包含了基本的算術(shù)運算、位運算、字符串操作、比較操作符、邏輯操作符及數(shù)學(xué)函數(shù)等。

算術(shù)運算有加(?+?)、減(?-?)、乘(?*?)、除(?/?)、取余(%)、取負(?-?)。

位運算有左移(lsh(i,i))、右移(rsh(i,i))、位與(ibandi)、位或(ibori)、位異或(ibxori)、取反(bnoti)。

邏輯運算符用于連接布爾型表達式,有非(not)、與(and)、或(or)、異或(xor)。

3)數(shù)學(xué)函數(shù)

與其他編程語言一樣,Halcon提供了大量的常用數(shù)學(xué)函數(shù),常用的有三角函數(shù)、雙曲線函數(shù)、指數(shù)函數(shù)(exp)、對數(shù)函數(shù)(log、log10)、冪函數(shù)(pow、ldexp)。三角函數(shù)有正弦(sin)、余弦(cos)、正切(tan)、反正弦(asin)、反余弦(acos)、反正切(atan、atan2)、雙曲正弦(sinh)、雙曲余弦(cosh)、雙曲正切(tanh)。

同時,Halcon還提供了統(tǒng)計類函數(shù)、轉(zhuǎn)換類函數(shù)及其他函數(shù),如表5-1、5-2和5-3所示。

4)數(shù)組

數(shù)組是Halcon常用的變量,常用數(shù)組操作有創(chuàng)建數(shù)組、添加數(shù)組元素、連接數(shù)組、刪除數(shù)組元素等。

(1)創(chuàng)建數(shù)組。利用Halcon算子創(chuàng)建數(shù)組常用的方法有兩種。

第一種方法是創(chuàng)建指定長度且元素相同的數(shù)組,并利用tuple_gen_const算子初始化。

tuple_gen_const(Length,Const,

Newtuple)

其中,Length為數(shù)組的長度;Const為初始化的常數(shù);Newtuple為所產(chǎn)生數(shù)組的命名。

例5.1創(chuàng)建一個長度為10,元素為6的數(shù)組Newtuple。

tuple_gen_const(10,

6,

Newtuple)

運行結(jié)果為:

Newtuple[6,

6,

6,

6,

6,

6,

6,

6,

6,

6]

第二種方法是創(chuàng)建不同元素的數(shù)組,需要借助循環(huán)語句對數(shù)組中的每一個元素賦值。

例5.2創(chuàng)建10個不同元素的數(shù)組。

(2)添加數(shù)組元素。在實際應(yīng)用中,經(jīng)常向數(shù)組中添加元素。通過Tuple_insert算子實現(xiàn)數(shù)組元素的添加,其形式如下:

Tuple_insert(Tuple,Index,InsertTuple,Extended)//編輯形式

例5.3

初始化數(shù)組OriginalTuple:

OriginalTuple:=[0,1,2,3,4,5]

向數(shù)組OriginalTuple的第3個位置插入字符x(索引從0開始):

tuple_insert(OriginalTuple,3,'x',InsertSingleValueA)

向數(shù)組OriginalTuple的第3個位置插入字符x:

InsertSingleValueB:=insert(OriginalTuple,3,'x')

向數(shù)組OriginalTuple的第1個位置插入字符y,z:

tuple_insert(OriginalTuple,1,['y','z'],InsertedMultipleValuesA)

向數(shù)組OriginalTuple的第1個位置插入字符x:

InsertedMultipleValuesB:=insert(OriginalTuple,1,['y','z'])

向數(shù)組OriginalTuple的第6個位置插入字符x,y,z:

tuple_insert(OriginalTuple,6,['x','y','z'],AppendedA)

向數(shù)組OriginalTuple的第6個位置插入字符x,y,z:

AppendedB:=insert(OriginalTuple,6,['x','y','z'])

數(shù)組常用操作有連接、計算長度、提取元素、刪除元素等操作,如表5-4所示。

5.Halcon結(jié)構(gòu)語句

Halcon結(jié)構(gòu)語句有順序結(jié)構(gòu)語句、循環(huán)結(jié)構(gòu)語句和分支結(jié)構(gòu)語句。

(1)順序結(jié)構(gòu)語句。Halcon程序是以順序結(jié)構(gòu)語句為主,即先執(zhí)行第一條語句,接著是第二條、第三條……一直到最后一條語句,這稱為順序結(jié)構(gòu)語句。

(2)循環(huán)結(jié)構(gòu)語句。循環(huán)結(jié)構(gòu)語句用于執(zhí)行重復(fù)的語言,循環(huán)結(jié)構(gòu)語句有三種形式:

①for...endfor;本語句條件不滿足,循環(huán)體不執(zhí)行;滿足條件才執(zhí)行。

②while...endwhile;本語句條件不滿足,循環(huán)體不執(zhí)行;滿足條件才執(zhí)行。

③repeat...until;本語句的循環(huán)體至少被執(zhí)行一次,直到滿足條件時退出。

(3)分支結(jié)構(gòu)語句。分支結(jié)構(gòu)語句根據(jù)給定的條件判斷,以決定執(zhí)行哪個分支程序段。分支結(jié)構(gòu)語句有:

①if...endif;根據(jù)條件是否成立,決定是否執(zhí)行代碼,用于兩分支結(jié)構(gòu)中。

②if...else...endif;根據(jù)條件是否成立,決定是否執(zhí)行代碼,用于兩分支結(jié)構(gòu)中。

③if...elseif...else...endif;本語句主要用于多分支結(jié)構(gòu)中。

此外,還有一些關(guān)鍵詞可用來控制語句執(zhí)行順序,改變程序結(jié)構(gòu)順序,常用的有break(終止程序循環(huán)而執(zhí)行循環(huán)后的語句)、continue(跳出循環(huán)體中剩余的語句,而強制執(zhí)行下一次循環(huán))、return(返回)、exit(終止Halcon程序并退出)、stop(終止后面的循環(huán))。

5.2.2

Halcon算子

從狹義上講,算子是一個函數(shù)空間到另一個函數(shù)空間的映射。從廣義上講,算子是指對任何函數(shù)進行某項操作。

Halcon提供了大量便于操作的算子,常見的算子有分類算子、控制算子、Develop算子、文件操作算子、濾波算子、圖形算子、圖像算子、線算子、匹配算子、3D匹配算子、Morphology算子、光字符識別算子、對象算子、區(qū)域算子、分割算子、系統(tǒng)算子、工具算子、數(shù)組算子、圖形變量算子等幾十類算子。

5.3OpenCV

5.3.1OpenCV的特點

1999年,Intel研究中心開發(fā)的OpenCV公布,是一個基于BSD(BerklySoftwareDistribution)許可的開源發(fā)行的跨平臺計算機視覺庫[33]。在Intel工作的OpenCV團隊發(fā)現(xiàn)許多頂尖大學(xué)中的研究組擁有內(nèi)部使用的開放計算機視覺庫,以方便學(xué)生間互相傳播學(xué)習(xí),幫助新生從高的起點開始計算機視覺研究,從而使得學(xué)者不用從底層寫基本函數(shù),而在某些基礎(chǔ)上繼續(xù)開始研究。

與Halcon最大的區(qū)別在于,OpenCV是開源的計算機視覺庫,采用C/C++?語言編寫,可運行在Linux/Windows/Mac等操作系統(tǒng)上,還提供了Python、Ruby、MATLAB以及其他語言的接口。OpenCV?的設(shè)計目標(biāo)是構(gòu)建一個簡單易用的計算機視覺框架,以幫助開發(fā)人員更便捷地設(shè)計更復(fù)雜的計算機視覺相關(guān)應(yīng)用程序。OpenCV包含的函數(shù)有500多個,覆蓋了計算機視覺的許多應(yīng)用領(lǐng)域。

5.3.2OpenCV的構(gòu)架

OpenCV的構(gòu)架包括基本結(jié)構(gòu)、數(shù)組操作、動態(tài)結(jié)構(gòu)、繪圖函數(shù)、數(shù)據(jù)保存和運行時類型信息、錯誤處理和系統(tǒng)函數(shù)、圖像處理、結(jié)構(gòu)分析、運動分析、模式識別、相機標(biāo)定和三維重建等模塊。

1.基本結(jié)構(gòu)

(1)二維坐標(biāo)系下點的表示方法:

(2)二維坐標(biāo)下點的表示方法(類型為浮點型):

(3)三維坐標(biāo)下點的表示方法(類型為浮點型):

(4)矩形框大小的表示方法(以像素為精度):

(5)以亞像素精度標(biāo)量矩形框大小的表示方法:

(6)矩形框的偏移和大小的表示方法:

(7)可存放在1-,2-,3-,4-TUPLE類型的捆綁數(shù)據(jù)的表示方法:

(8)迭代算法的終止準則的表示方法:

(9)多通道矩陣的表示方法:

(10)多維、多通道密集數(shù)組的表示方法:

(11)多維、多通道稀疏數(shù)組的表示方法:

(12)

IPL圖像頭的表示方法:

IPL是ImageProcessingLibrary簡寫。IplImage是OpenCV中CxCore部分基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu),用來表示圖像。

(13)不確定數(shù)組的表示方法:

typedefvoidCvArr;

CvArr*?僅僅是被用于函數(shù)的參數(shù),用于指示函數(shù)接收的數(shù)組類型可以不止一個,如IplImage*、CvMat*、CvSeq*。最終的數(shù)組類型是在運行時通過分析數(shù)組頭的前4個字節(jié)判斷的。

2.?dāng)?shù)組操作

常用的數(shù)組操作有初始化、獲取元素和數(shù)組子集、拷貝和添加、變換和置換、算術(shù)/邏輯/比較、統(tǒng)計、線性代數(shù)、數(shù)學(xué)函數(shù)、隨機數(shù)生成、離散變換等。

1)初始化

(1)創(chuàng)建頭并分配數(shù)據(jù):

IplImage*cvCreateImage(CvSizesize,intdepth,intchannels);

(2)分配及初始化,且返回IpIImage結(jié)構(gòu):

IplImage*cvCreateImageHeader(CvSizesize,intdepth,intchannels);

(3)釋放頭:

voidcvReleaseImageHeader(IplImage**image);

(4)釋放頭和圖像數(shù)據(jù):

voidcvReleaseImage(IplImage**image);

(5)初始化被用圖分配的圖像頭:

IplImage*cvInitImageHeader(IplImage*image,CvSizesize,intdepth,intchannels,intorigin=0,intalign=4);

(6)制作圖像的完整拷貝:

IplImage*cvCloneImage(constIplImage*image);

(7)基于給定的值設(shè)置感興趣通道:

voidcvSetImageCOI(IplImage*image,intcoi);

(8)返回感興趣通道:

intcvGetImageCOI(constIplImage*image);

(9)基于給定的矩形設(shè)置感興趣區(qū)域:

voidcvSetImageROI(IplImage*image,CvRectrect);

(10)釋放圖像的ROI(感興趣區(qū)域,RegionofInteresting):

voidcvResetImageROI(IplImage*image);

(11)返回圖像的ROI坐標(biāo):

CvRectcvGetImageROI(constIplImage*image);

(12)創(chuàng)建矩陣:

CvMat*cvCreateMat(introws,intcols,inttype);

(13)創(chuàng)建新的矩陣頭:

CvMat*cvCreateMatHeader(introws,intcols,inttype);

(14)刪除矩陣:

voidcvReleaseMat(CvMat**mat);

(15)初始化矩陣頭:

CvMat*cvInitMatHeader(CvMat*mat,introws,intcols,inttype,Void*data=NULL,intstep=CV_AUTOSTEP);

(16)初始化矩陣頭:

CvMatcvMat(introws,intcols,inttype,void*data=NULL);

(17)創(chuàng)建矩陣拷貝:

CvMat*cvCloneMat(constCvMat*mat);

(18)創(chuàng)建多維密集數(shù)組:

CvMatND*cvCreateMatND(intdims,constint*sizes,inttype);

(19)創(chuàng)建新的數(shù)組頭:

CvMatND*cvCreateMatNDHeader(intdims,constint*sizes,inttype);

(20)刪除多維數(shù)組:

voidcvReleaseMatND(CvMatND**mat);

(21)初始化多維數(shù)組頭:

CvMatND*cvInitMatNDHeader(CvMatND*mat,intdims,constint*sizes,inttype,void*data=NULL);

(22)創(chuàng)建多維數(shù)組的完整拷貝:

CvMatND*cvCloneMatND(constCvMatND*mat);

(23)縮減數(shù)組數(shù)據(jù)的參考計數(shù):

voidcvDecRefData(CvArr*arr);

(24)增加數(shù)組數(shù)據(jù)的參考計數(shù):

intcvIncRefData(CvArr*arr);

(25)分配數(shù)組數(shù)據(jù):

voidcvCreateData(CvArr*arr);

(26)釋放數(shù)組數(shù)據(jù):

voidcvReleaseData(CvArr*arr);

(27)指派用戶數(shù)據(jù)給數(shù)組頭:

voidcvSetData(CvArr*arr,void*data,intstep);

(28)返回組數(shù)的底層信息:

voidcvGetRawData(constCvArr*arr,uchar**data,int*step=NULL,CvSize*roi_size=NULL);

(29)從不確定數(shù)組返回矩陣頭:

CvMat*cvGetMat(constCvArr*arr,CvMat*header,int*coi=NULL,intallowND=0);

(30)從不確定數(shù)組返回圖像頭:

IplImage*cvGetImage(constCvArr*arr,IplImage*image_header);

(31)創(chuàng)建稀疏數(shù)組:

CvSparseMat*cvCreateSparseMat(intdims,constint*sizes,inttype);

(32)刪除稀疏數(shù)組:

voidcvReleaseSparseMat(CvSparseMat**mat);

(33)創(chuàng)建稀疏數(shù)組的拷貝:

CvSparseMat*cvCloneSparseMat(constCvSparseMat*mat)。

2)獲取元素和數(shù)組子集

(1)根據(jù)輸入的圖像返回矩陣頭:

CvMat*cvGetSubRect(constCvArr*arr,CvMat*submat,CvRectrect);

(2)返回數(shù)組的行或在一定跨度內(nèi)的行:

CvMat*cvGetRow(constCvArr*arr,CvMat*submat,introw);

CvMat*cvGetRows(constCvArr*arr,CvMat*submat,intstart_row,intend_row,intdelta_row=1);

(3)返回數(shù)組的列或在一定跨度內(nèi)的列:

CvMat*cvGetCol(constCvArr*arr,CvMat*submat,intcol);

CvMat*cvGetCols(constCvArr*arr,CvMat*submat,intstart_col,intend_col);

(4)返回一個數(shù)組對角線:

CvMat*cvGetDiag(constCvArr*arr,CvMat*submat,intdiag=0);

(5)返回圖像或矩陣ROI大小:

CvSizecvGetSize(constCvArr*arr);

(6)初始化稀疏數(shù)線元素迭代器:

CvSparseNode*cvInitSparseMatIterator(constCvSparseMat*mat,

CvSparseMatIterator*mat_iterator);

(7)初始化稀疏數(shù)線元素迭代器:

CvSparseNode*cvGetNextSparseNode(CvSparseMatIterator*mat_iterator);

(8)返回數(shù)組維數(shù)和他們的大小或者殊維的大?。?/p>

intcvGetDims(constCvArr*arr,int*sizes=NULL);intcvGetDimSize(constCvArr*arr,intindex);

(9)返回指向特殊數(shù)組元素的指針:

uchar*cvPtr1D(constCvArr*arr,intidx0,int*type=NULL);

uchar*cvPtr2D(constCvArr*arr,intidx0,intidx1,int*type=NULL);

uchar*cvPtr3D(constCvArr*arr,intidx0,intidx1,intidx2,int*type=NULL);

uchar*cvPtrND(constCvArr*arr,int*idx,int*type=NULL,intcreate_node=1,unsigned*precalc_hashval=NULL);

(10)返回特殊的數(shù)組元素:

CvScalarcvGet1D(constCvArr*arr,intidx0);

CvScalarcvGet2D(constCvArr*arr,intidx0,intidx1);

CvScalarcvGet3D(constCvArr*arr,intidx0,intidx1,intidx2);

CvScalarcvGetND(constCvArr*arr,int*idx);

(11)返回單通道數(shù)組的指定元素:

doublecvGetReal1D(constCvArr*arr,intidx0);

doublecvGetReal2D(constCvArr*arr,intidx0,intidx1);

doublecvGetReal3D(constCvArr*arr,intidx0,intidx1,intidx2);

doublecvGetRealND(constCvArr*arr,int*idx);

(12)返回單通道浮點矩陣指定元素:

doublecvmGet(constCvMat*mat,introw,intcol);

(13)修改指定的數(shù)組:

voidcvSet1D(CvArr*arr,intidx0,CvScalarvalue);

voidcvSet2D(CvArr*arr,intidx0,intidx1,CvScalarvalue);

voidcvSet3D(CvArr*arr,intidx0,intidx1,intidx2,CvScalarvalue);

voidcvSetND(CvArr*arr,int*idx,CvScalarvalue);

(14)修改指定數(shù)組元素值:

voidcvSetReal1D(CvArr*arr,intidx0,doublevalue);

voidcvSetReal2D(CvArr*arr,intidx0,intidx1,doublevalue);

voidcvSetReal3D(CvArr*arr,intidx0,intidx1,intidx2,doublevalue);

voidcvSetRealND(CvArr*arr,int*idx,doublevalue);

(15)返回單通道浮點矩陣的指定元素:

voidcvmSet(CvMat*mat,introw,intcol,doublevalue);

(16)清除指定數(shù)組元素:

voidcvClearND(CvArr*arr,int*idx);

3)拷貝和添加

(1)將A數(shù)組拷貝到B數(shù)組:

voidcvCopy(constCvArr*src,CvArr*dst,constCvArr*mask=NULL);

(2)為數(shù)組的每個元素設(shè)置數(shù)值:

voidcvSet(CvArr*arr,CvScalarvalue,constCvArr*mask=NULL);

(3)清空數(shù)組:

voidcvSetZero(CvArr*arr);#definecvZerocvSetZero

4)變換和置換

(1)將數(shù)組中所有元素初始化:

voidcvSetZero(CvArr*arr);

(2)修改多維數(shù)組形狀:

CvArr*cvReshapeMatND(constCvArr*arr,intsizeof_header,CvArr*header,intnew_cn,intnew_dims,int*new_sizes);

(3)把src通道式填充到dst中:

voidcvRepeat(constCvArr*src,CvArr*dst);

(4)??cvFlip直接從圖像采集卡采集的圖像cvShowImage是反著的圖像,也就是說圖像采集卡采集的圖像是以左下角為原點的,而窗口顯示的圖像原點是左上角,相當(dāng)于是關(guān)于X軸翻轉(zhuǎn)了。在顯示圖像之前使用cvFlip()函數(shù)將圖像翻轉(zhuǎn)。

voidcvFlip(constCvArr*src,CvArr*dst=NULL,intflip_mode=0);

(5)?cvSplit分別復(fù)制每個通道到多個單通道圖像:

voidcvSplit(constCvArr*src,CvArr*dst0,CvArr*dst1,CvArr*dst2,CvArr*dst3);

(6)從幾個單通道數(shù)組組合多通道數(shù)組:

voidcvMerge(constCvArr*src0,constCvArr*src1,constCvArr*src2,constCvArr*src3,CvArr*dst);

5)算術(shù)、邏輯和比較

(1)利用搜索表轉(zhuǎn)換數(shù)組:

voidcvLUT(constCvArr*src,CvArr*dst,constCvArr*lut);

(2)利用線性變換轉(zhuǎn)換數(shù)組:

voidcvConvertScale(constCvArr*src,CvArr*dst,doublescale=1,doubleshift=0);

(3)使用線性變換轉(zhuǎn)換輸入數(shù)組元素為8位無符號整型:

voidcvConvertScaleAbs(constCvArr*src,CvArr*dst,doublescale=1,doubleshift=0);

(4)計算兩個數(shù)中每個元素的和:

voidcvAdd(constCvArr*src1,constCvArr*src2,CvArr*dst,constCvArr*mask=NULL);

(5)計算數(shù)量和數(shù)組的和:

voidcvAddS(constCvArr*src,CvScalarvalue,CvArr*dst,constCvArr*mask=NULL);

(6)計算兩數(shù)組的加權(quán)值的和:

voidcvAddWeighted(constCvArr*src1,doublealpha,constCvArr*src2,doublebeta,doublegamma,CvArr*dst);

(7)計算兩個數(shù)組每個元素的差:

voidcvSub(constCvArr*src1,constCvArr*src2,CvArr*dst,constCvArr*mask=NULL);

(8)計算數(shù)組和數(shù)量之間的差:

voidcvSubS(constCvArr*src,CvScalarvalue,CvArr*dst,constCvArr*mask=NULL);

(9)計算數(shù)量和數(shù)組之間的差:

voidcvSubRS(constCvArr*src,CvScalarvalue,CvArr*dst,constCvArr*mask=NULL);

(10)計算兩個數(shù)組中每個元素的積:

voidcvMul(constCvArr*src1,constCvArr*src2,CvArr*dst,doublescale=1);

(11)實現(xiàn)除法的函數(shù),用src2除以src1中對應(yīng)元素,結(jié)果存到dst中相除:

voidcvDiv(constCvArr*src1,constCvArr*src2,CvArr*dst,doublescale=1);

(12)計算兩個數(shù)組的每個元素的按位與:

voidcvAnd(constCvArr*src1,constCvArr*src2,CvArr*dst,constCvArr*mask=NULL);

(13)計算數(shù)組每個元素與數(shù)量之間的按位與:

voidcvAndS(constCvArr*src,CvScalarvalue,CvArr*dst,constCvArr*mask=NULL);

(14)計算兩個數(shù)組每個元素的按位或:

voidcvOr(constCvArr*src1,constCvArr*src2,CvArr*dst,constCvArr*mask=NULL);

(15)計算數(shù)組中每個元素與數(shù)量之間的按位或:

voidcvOrS(constCvArr*src,CvScalarvalue,CvArr*dst,constCvArr*mask=NULL);

(16)計算兩個數(shù)組中的每個元素的按位異或:

voidcvXor(constCvArr*src1,constCvArr*src2,CvArr*dst,constCvArr*mask=NULL);

(17)計算數(shù)組元素與數(shù)量之間的按位異或:

voidcvXorS(constCvArr*src,CvScalarvalue,CvArr*dst,constCvArr*mask=NULL);

(18)計算數(shù)組元素的按位取反:

voidcvNot(constCvArr*src,CvArr*dst);

(19)比較兩個數(shù)組元素:

voidcvCmp(constCvArr*src1,constCvArr*src2,CvArr*dst,intcmp_op);

(20)比較數(shù)組的每個元素與數(shù)量的關(guān)系:

voidcvCmpS(constCvArr*src,doublevalue,CvArr*dst,intcmp_op);

(21)檢查數(shù)組元素是否在兩個數(shù)組之間:

voidcvInRange(constCvArr*src,constCvArr*lower,constCvArr*upper,CvArr*dst);

(22)檢查數(shù)組元素是否在兩個數(shù)量之間:

voidcvInRangeS(constCvArr*src,CvScalarlower,CvScalarupper,CvArr*dst);

(23)查找兩個數(shù)組中每個元素的較大值:

voidcvMax(constCvArr*src1,constCvArr*src2,CvArr*dst);

(24)查找數(shù)組元素與數(shù)量之間的較大值:

voidcvMaxS(constCvArr*src,doublevalue,CvArr*dst);

(25)查找兩個數(shù)組元素之間的較小值:

voidcvMin(constCvArr*src1,constCvArr*src2,CvArr*dst);

(26)查找數(shù)組元素和數(shù)量之間的較大值:

voidcvMinS(constCvArr*src,doublevalue,CvArr*dst);

(27)計算兩個數(shù)組差的絕對值:

voidcvAbsDiff(constCvArr*src1,constCvArr*src2,CvArr*dst);

(28)計算數(shù)組元素與數(shù)量之間差的絕對值:

voidcvAbsDiffS(constCvArr*src,CvArr*dst,CvScalarvalue);

6)統(tǒng)計

(1)計算非零數(shù)組元素:

intcvCountNonZero(constCvArr*arr);

(2)計算數(shù)組元素的和:

CvScalarcvSum(constCvArr*arr);

(3)計算數(shù)組元素的平均值:

CvScalarcvAvg(constCvArr*arr,constCvArr*mask=NULL);

(4)計算數(shù)組元素的平均值:

voidcvAvgSdv(constCvArr*arr,CvScalar*mean,CvScalar*std_dev,constCvArr*mask=NULL);

(5)查找數(shù)組和子數(shù)組的全局小值和大值:

VoidcvMinMaxLoc(constCvArr*arr,double*min_val,double*max_val,CvPoint*min_loc=NULL,CvPoint*max_loc=NULL,constCvArr*mask=NULL);

(6)計算數(shù)組的絕對范數(shù),絕對差分范數(shù)或者相對差分范數(shù):

doublecvNorm(constCvArr*arr1,constCvArr*arr2=NULL,intnorm_type=CV_L2,constCvArr*mask=NULL);

7)線性代數(shù)

(1)初始化帶尺度的單位矩陣:

voidcvSetIdentity(CvArr*mat,CvScalarvalue=cvRealScalar(1));mat

(2)用歐幾里得準則計算兩個數(shù)組的點積:

doublecvDotProduct(constCvArr*src1,constCvArr*src2);

(3)計算兩個三維向量的叉積:

voidcvCrossProduct(constCvArr*src1,constCvArr*src2,CvArr*dst);

(4)計算一個數(shù)組縮放后與另一個數(shù)組的和:

voidcvScaleAdd(constCvArr*src1,CvScalarscale,constCvArr*src2,CvArr*dst);

(5)通用矩陣乘法:

voidcvGEMM(constCvArr*src1,constCvArr*src2,doublealpha,constCvArr*src3,doublebeta,CvArr*dst,inttABC=0);

(6)對數(shù)組每一個元素執(zhí)行矩陣變換:

voidcvTransform(constCvArr*src,CvArr*dst,constCvMat*transmat,constCvMat*shiftvec=NULL);

(7)向量數(shù)組的透視變換:

voidcvPerspectiveTransform(constCvArr*src,CvArr*dst,constCvMat*mat);

(8)計算數(shù)組和數(shù)組的轉(zhuǎn)置的乘積:

voidcvMulTransposed(constCvArr*src,CvArr*dst,intorder,constCvArr*delta=NULL);

(9)返回矩陣的跡:

CvScalarcvTrace(constCvArr*mat);

(10)矩陣的轉(zhuǎn)置:

voidcvTranspose(constCvArr*src,CvArr*dst);

(11)返回矩陣的行列式值:

doublecvDet(constCvArr*mat);

(12)查找矩陣的逆矩陣或偽逆矩陣:

doublecvInvert(constCvArr*src,CvArr*dst,intmethod=CV_LU);

(13)求解線性系統(tǒng)或者小二乘法問題:

intcvSolve(constCvArr*src1,constCvArr*src2,CvArr*dst,intmethod=CV_LU);

(14)對實數(shù)浮點矩陣進行奇異值分解:

voidcvSVD(CvArr*A,CvArr*W,CvArr*U=NULL,CvArr*V=NULL,intflags=0);

(15)奇異值回代算法(BackSubstitution):

voidcvSVBkSb(constCvArr*W,constCvArr*U,constCvArr*V,constCvArr*B,CvArr*X,intflags);

(16)計算對稱矩陣的特征值和特征向量:

voidcvEigenVV(CvArr*mat,CvArr*evects,CvArr*evals,doubleeps=0);

(17)計算向量集合的協(xié)方差矩陣:

voidcvCalcCovarMatrix(constCvArr**vects,intcount,CvArr*cov_mat,CvArr*avg,intflags);

(18)計算兩個向量之間的馬氏距離(

Mahalonobis

distance):

doublecvMahalanobis(constCvArr*vec1,constCvArr*vec2,CvArr*mat);

8)數(shù)學(xué)函數(shù)

(1)轉(zhuǎn)換浮點數(shù)為整數(shù):

intcvRound(doublevalue);

intcvFloor(doublevalue);

intcvCeil(doublevalue);

(2)計算平方根:

floatcvSqrt(floatvalue);

(3)計算平方根的倒數(shù):

floatcvInvSqrt(floatvalue);

(4)計算立方根:

floatcvCbrt(floatvalue);

(5)計算二維向量的角度:

floatcvFastArctan(floaty,floatx);

(6)判斷輸入是否是一個數(shù)字:

intcvIsNaN(doublevalue);

(7)判斷輸入是否是無窮大:

intcvIsInf(doublevalue);

(8)計算二維向量的長度和/或者角度:

VoidcvCartToPolar(constCvArr*x,constCvArr*y,CvArr*y,CvArr*magnitude,CvArr*angle=NULL,intangle_in_degrees=0);

(9)計算極坐標(biāo)形式的二維向量對應(yīng)的直角坐標(biāo):

voidcvPolarToCart(constCvArr*magnitude,constCvArr*angle,CvArr*x,CvArr*y,intangle_in_degrees=0);

(10)對數(shù)組內(nèi)每個元素求冪:

voidcvPow(constCvArr*src,CvArr*dst,doublepower);

(11)計算數(shù)組元素的指數(shù)冪:

voidcvExp(constCvArr*src,CvArr*dst);

(12)計算每個數(shù)組元素的絕對值的自然對數(shù):

voidcvLog(constCvArr*src,CvArr*dst);

9)隨機數(shù)生成

(1)初始化隨機數(shù)生成器狀態(tài):

CvRNGcvRNG(int64seed=-1);

(2)用隨機數(shù)填充數(shù)組并更新隨機數(shù)RNG(隨機數(shù)產(chǎn)生器)狀態(tài):

voidcvRandArr(CvRNG*rng,CvArr*arr,intdist_type,CvScalarparam1,CvScalarparam2);

(3)返回32-bit無符號整型并更新RNG:

unsignedcvRandInt(CvRNG*rng);

(4)返回浮點型隨機數(shù)并更新RNG:

doublecvRandReal(CvRNG*rng);

10)離散變換

(1)執(zhí)行1維或者2維浮點數(shù)組的離散傅立葉正變換(或逆變換):

voidcvDFT(constCvArr*src,CvArr*dst,intflags);

(2)兩個傅立葉頻譜的每個元素的乘法:

voidcvMulSpectrums(constCvArr*src1,constCvArr*src2,CvArr*dst,intflags);

(3)執(zhí)行1維或者2維浮點數(shù)組的離散(反)余弦變換:

voidcvDCT(constCvArr*src,CvArr*dst,intflags);

3.動態(tài)結(jié)構(gòu)

動態(tài)結(jié)構(gòu)從內(nèi)存存儲、序列、集合、圖、樹等5類對象來闡述其結(jié)構(gòu)。

1)內(nèi)存存儲(MemoryStorage)

(1)擴展內(nèi)存存儲:

(2)內(nèi)存存儲塊結(jié)構(gòu):CvMemBlock代表一個單獨的內(nèi)存存儲塊結(jié)構(gòu)。

typedefstructCvMemBlock

{

structCvMemBlock*prev;

structCvMemBlock*next;

}CvMemBlock;

(3)內(nèi)存存儲塊地址:該結(jié)構(gòu)保存棧頂?shù)牡刂?,棧頂可以通過cvSaveMemStoragePos保存,可以通過cvRestoreMemStoragePos恢復(fù):

typedefstructCvMemStoragePos

{

CvMemBlock*top;

intfree_space;

}CvMemStoragePos;

(4)創(chuàng)建內(nèi)存塊:

CvMemStorage*cvCreateMemStorage(intblock_size=0);

(5)創(chuàng)建子內(nèi)存塊:

CvMemStorage*cvCreateChildMemStorage(CvMemStorage*parent);

(6)釋放內(nèi)存塊:

voidcvReleaseMemStorage(CvMemStorage**storage);

(7)清空內(nèi)存存儲塊:

voidcvClearMemStorage(CvMemStorage*storage);

(8)在存儲塊中分配內(nèi)存緩沖區(qū):

void*cvMemStorageAlloc(CvMemStorage*storage,size_tsize);

(9)在存儲塊中分配一文本字符串:

(10)保存內(nèi)存塊的位置(地址):

voidcvSaveMemStoragePos(constCvMemStorage*storage,CvMemStoragePos*pos);

(11)恢復(fù)內(nèi)存存儲塊的位置:

voidcvRestoreMemStoragePos(CvMemStorage*storage,CvMemStoragePos*pos);

2)序列

(1)創(chuàng)建一序列:

CvSeq*cvCreateSeq(intseq_flags,intheader_size,intelem_size,CvMemStorage*storage);

(2)設(shè)置序列塊的大?。?/p>

voidcvSetSeqBlockSize(CvSeq*seq,intdelta_elems);

(3)將元素添加到序列結(jié)束:

char*cvSeqPush(CvSeq*seq,void*element=NULL);

(4)刪除序列尾部元素:

voidcvSeqPop(CvSeq*seq,void*element=NULL);

(5)在序列頭部添加元素:

char*cvSeqPushFront(CvSeq*seq,void*element=NULL);

(6)刪除序列的頭部元素:

voidcvSeqPopFront(CvSeq*seq,void*element=NULL);

(7)添加多個元素到序列尾部或頭部:

voidcvSeqPushMulti(CvSeq*seq,void*elements,intcount,intin_front=0);

(8)刪除多個序列頭部或尾部的元素:

voidcvSeqPopMulti(CvSeq*seq,void*elements,intcount,intin_front=0);

(9)在序列中添加元素:

char*cvSeqInsert(CvSeq*seq,intbefore_index,void*element=NULL);

(10)刪除序列中的元素:

voidcvSeqRemove(CvSeq*seq,intindex);

(11)清空序列:

voidcvClearSeq(CvSeq*seq);

(12)返回索引所指定的元素指針:

char*cvGetSeqElem(constCvSeq*seq,intindex);

(13)返回序列中元素的索引:

intcvSeqElemIdx(constCvSeq*seq,constvoid*element,CvSeqBlock**block=NULL);

(14)拷貝序列中的元素到一個連續(xù)的內(nèi)存塊中:

void*cvCvtSeqToArray(constCvSeq*seq,void*elements,CvSliceslice=CV_WHOLE_SEQ);

(15)構(gòu)建序列:

CvSeq*cvMakeSeqHeaderForArray(intseq_type,intheader_size,intelem_size,void*elements,inttotal,CvSeq*seq,CvSeqBlock*block);

(16)為各個序列碎片建立頭:

CvSeq*cvSeqSlice(constCvSeq*seq,CvSliceslice,CvMemStorage*storage=NULL,intcopy_data=0);

(17)創(chuàng)建序列的一份拷貝:

CvSeq*cvCloneSeq(constCvSeq*seq,CvMemStorage*storage=NULL);

(18)刪除序列的slice部分:

voidcvSeqRemoveSlice(CvSeq*seq,CvSliceslice);

(19)在序列中插入一數(shù)組:

voidcvSeqInsertSlice(CvSeq*seq,intbefore_index,constCvArr*from_arr);

(20)將序列中的元素進行逆序操作:

voidcvSeqInvert(CvSeq*seq);

(21)使用特定的比較函數(shù)對序列中的元素進行排序:

voidcvSeqSort(CvSeq*seq,CvCmpFuncfunc,void*userdata=NULL);

(22)查詢序列中的元素:

char*cvSeqSearch(CvSeq*seq,constvoid*elem,CvCmpFuncfunc,intis_sorted,int*elem_idx,void*userdata=NULL);

(23)將數(shù)據(jù)寫入序列中,并初始化該過程:

voidcvStartAppendToSeq(CvSeq*seq,CvSeqWriter*writer);

(24)創(chuàng)建新序列,并初始化寫入部分(

writer):

VoidcvStartWriteSeq(intseq_flags,intheader_size,intelem_size,CvMemStorage*storage,CvSeqWriter*writer);

(25)完成寫入操作:

CvSeq*cvEndWriteSeq(CvSeqWriter*writer);

(26)初始化序列中的讀取過程:

voidcvStartReadSeq(constCvSeq*seq,CvSeqReader*reader,intreverse=0);

(27)返回當(dāng)前的讀取器的位置:

intcvGetSeqReaderPos(CvSeqReader*reader);

(28)移動讀取器到指定的位置:

voidcvSetSeqReaderPos(CvSeqReader*reader,intindex,intis_relative=0);

3)集合

(1)采集節(jié)點:

在OpenCV的稀疏數(shù)據(jù)結(jié)構(gòu)中,CvSet是一個基本結(jié)構(gòu)。CvSet繼承自CvSeq,并在此基礎(chǔ)上增加了free_elems域,該域是空節(jié)點組成的列表。

(2)創(chuàng)建空的數(shù)據(jù)集:

CvSet*cvCreateSet(intset_flags,intheader_size,intelem_size,CvMemStorage*storage);

(3)占用集合中的一個節(jié)點:

intcvSetAdd(CvSet*set_header,CvSetElem*elem=NULL,CvSetElem**inserted_elem=NULL);

(4)從點集中

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論