ApolloStudio高手之路(12):机器视觉图像匹配定位与激光打标领域深度结合(基于海康威视VisionMaster九点标定、模板快速匹配定位、标定转换以及金橙子EzCad2二次开发)
在激光標記領域已越趨成為自動化行業(yè)中在質(zhì)量追溯體系管控環(huán)節(jié)不可或缺的重要一環(huán)的今天,傳統(tǒng)的標記方式已不能滿足于各類綜合性比較強的項目需要了,從而結合越來越多新技術的案例也變得更多了起來,現(xiàn)在我們將一起探討下機器視覺圖像匹配定位技術與傳統(tǒng)的激光標刻相結合的一個案例(本文中將展示筆者提出的一種坐標系轉換思路和方法,當然這肯定不是唯一的,有興趣的讀者可以自行探索更多的解決問題思路,也歡迎將更優(yōu)秀的新思路分享給我)。
圖像匹配定位打標技術的使用已經(jīng)貫穿了我們?nèi)粘I钣闷分械姆椒矫婷?#xff0c;尤其在我們使用的3C電子產(chǎn)品中,小到其組成芯片上的銘文標識,大到其品牌Logo的標識,只要是人們對細節(jié)(這里主要是標記位置的定位精度)的追求越多,那么該技術所適用的領域也越來越廣泛。
這是一個綜合性比較強的項目案例分析講解,為了方便更好的消化本文所涉及ApolloStudio中的使用要點,可以回顧下之前的兩篇文章:
ApolloStudio高手之路(4):用Python以最輕便的方式進行金橙子激光打標板卡二次開發(fā)(以EzCad2為載體二次開發(fā))
ApolloStudio高手之路(5):嵌入海康威視VisionMaster機器視覺算法平臺提供一站式工控設計
原理剖析
圖像匹配定位有一個繞不開的話題:圖像坐標系與現(xiàn)實物理坐標系之間的轉換。在本案例中,我們主要面對的是一個XY二維平面坐標系之間的轉換(即打碼機的成像標記平面與面陣相機成像平面平行,3D打碼應用不在本篇討論范疇,故默認Z軸高度方向始終保持0)。
坐標系約定
本文中所約定的打刻機與相機之間的相對位置安裝方式不是唯一的解決方案,只不過改變安裝方式后需重新規(guī)劃坐標系轉換參數(shù),讀者可以根據(jù)自身需求和安裝條件自行規(guī)劃。
打碼機的打碼成像方向與正向放平一本書后字體方向一致(即文字頭上底下,打碼機光路安裝部分無要求,只需最終打刻面方向與此一致即可):
面陣相機的安裝孔面背向操作員(即安裝孔的背面面向操作員,安裝孔面指向打碼機的機體,鏡頭垂直向下)。
依照上面安裝方式,我們可以確定打碼機與面陣相機的相對位置對應關系(以相機的視角來看):
?坐標系轉換
約定完坐標系后,我們回過頭來思考下我們要達到什么樣的目的?在硬件設施根據(jù)使用現(xiàn)場情況根據(jù)工作距離以及分辨精度選型完成后(選型部分非常重要,直接決定最終項目的成敗,但不同項目有差異,故本文的重點只在于闡述原理以及軟件實現(xiàn)流程),將指定的工件置于相機視野覆蓋范圍內(nèi),任意數(shù)量(不超過視覺軟件最大設定的識別個數(shù)),視野內(nèi)任意坐標以及角度,均能穩(wěn)定的將需要標記的內(nèi)容刻印上去,實現(xiàn)流水線式自動化操作。
為實現(xiàn)上述目的,我們可以分析到,最終視覺軟件只需要輸出的技術參數(shù)指標有4個:匹配識別的數(shù)量、匹配工件的X物理坐標(標定轉換后)集合、匹配工件的Y物理坐標(標定轉換后)集合以及匹配工件的角度集合。
現(xiàn)在假設我們已經(jīng)拿到了上面的4組數(shù)據(jù),那又如何與打碼機的物理坐標系進行關聯(lián)呢?我們以1個工件的識別為例來分析,首先在相機正下方放置好工件后我們在視覺里面建好匹配模板,同時記錄下此時匹配模板的中心值數(shù)據(jù)(該數(shù)據(jù)為標定轉換后的物理坐標數(shù)據(jù)),此時不要移動該工件,繼續(xù)打開EzCAD2軟件,將需要標記的內(nèi)容以及打刻工藝參數(shù)設置好,保存打刻模板。操作完成后,我們來看下下面這張平面原理圖(以打刻機表面為參考坐標系):
在上一步中,我們記錄了建立圖像模板時的模板中心物理坐標值,我們將該坐標與打刻機的坐標系還原到同一平面分析,從模板圖像到無人值守拍照下的任意位置角度目標定位狀態(tài),對于工件而言,實際上只是先圍繞模板中心旋轉了一個夾角差值后,然后平移了XY坐標的差值(即)。
程序實現(xiàn)
在了解原理流程之后,程序方面就好處理了,這里我們以海康威視的VisionMaster(以下簡稱VM)作為案例進行講解,視覺部分處理流程分兩個步驟進行:首先九點標定,獲取相機像素坐標系與打刻機物理坐標系之間的標定文件;之后再通過匹配定位獲取工件的個數(shù)、X、Y以及A(角度)信息,然后帶入標定文件將物理坐標系轉換結果輸出。
機器視覺處理
九點標定
在這個案例中我們并沒有使用到標定板,而是使用了一種更為方便的方式,取一張空白的黑色金屬卡片,在激光打碼機的EzCAD2上編輯9個實心圓,每個圓直徑5mm,每個實心圓圓心與臨近實心圓圓心之間的間距固定為20mm,打刻后的效果圖為:
?通過VM的找圓工具,可以通過手動拖動識別框,依次獲取9個圓圓心的坐標位置(獲取圓心X,Y即可),然后依次填入VM中的“N點標定”數(shù)據(jù)中。
這里有個非常重要的點,物理坐標X與圖像坐標X方向相反,而物理坐標Y與圖像坐標Y相同,填寫內(nèi)容的時候要注意與圖像坐標相對應的物理坐標的正負號,建議如果對該方式不太理解的話,建議用筆和紙把每個點的對應坐標寫出來,來完成對應的“填空題”,比如像下面這樣:
?剩余部分調(diào)整下物理坐標參數(shù)即可,生成標定文件:
模板定位流程?
模板定位流程比較簡單,大家看下流程圖既可了解:
?先取像》定位模板》把定位的數(shù)據(jù)以標定文件進行物理坐標系轉換》通過腳本對轉換后的結果進行組合整理,按照我們需要的格式進行處理,然后將結果打包成一個字符串,輸出給格式化結果,方便ApolloStudio進行數(shù)據(jù)捕捉。
這里有個比較重要的細節(jié)問題,在上面的視覺流程項目文件中視覺模板建立之后,必須在VM里面直接單擊單次執(zhí)行按鈕執(zhí)行一次,因為此時處于模板剛剛建立階段,匹配分數(shù)應該是最高的時候,這時需要將格式化的結果記錄下來,這里的結果將是當前模板匹配中心點轉換后的X,Y以及匹配識別框的角度值,將這3個關鍵信息記錄下,填入ApolloStudio腳本中打碼初始化對應的三個變量init_X,init_Y,init_A中,后面所有的識別目標都將是以此基礎點作為旋轉和偏移,這個細節(jié)非常重要!
這里的腳本里面我們在輸入變量里面獲取了匹配的個數(shù),角度值,轉換后的物理坐標X以及Y,這4個重要的信息,我們使用腳本的目的是為了將這里面包含的信息進行打包,生成一個字符串輸出,下面附上腳本內(nèi)容:
using System; using System.Text; using System.Windows.Forms; using System.Collections.Generic; using Hik.Script.Methods; class UserScript:ScriptMethods,IProcessMethods {//執(zhí)行次數(shù)計數(shù)int marknum = 0;float []bx=new float [20]; float []by=new float [20]; float []ba=new float [20]; /// <summary>/// 預編譯時變量初始化/// </summary>public void Init(){}/// <summary>/// 流程執(zhí)行一次進入Process函數(shù)/// </summary>/// <returns></returns>public bool Process(){GetIntValue("marknum", ref marknum);if (marknum > 0){GetFloatArrayValue("arr_x", ref bx, out marknum);GetFloatArrayValue("arr_y", ref by, out marknum);GetFloatArrayValue("arr_a", ref ba, out marknum);string myres = "";for ( int i = 0; i < marknum; i++){myres = myres + bx[i] + "," + by[i] + "," + ba[i] + "@";}myres = myres.Substring(0, myres.Length - 1);SetStringValue ("finalres", myres);}else {SetStringValue ("finalres", "NG");}return true;} }腳本的格式是根據(jù)匹配的個數(shù)來判斷是否定位成功,成功則發(fā)所有的定位數(shù)據(jù),失敗則發(fā)NG。
ApolloStudio數(shù)據(jù)處理
根據(jù)ApolloStudio高手之路(5):嵌入海康威視VisionMaster機器視覺算法平臺提供一站式工控設計的經(jīng)驗,我們直接上代碼來說明用途:
#-*- coding: UTF-8 -*- #加載內(nèi)嵌模塊 import clr,sys,time,datetime,threading,lmjcz,mvvm#初始化海康視覺平臺 #測試模板路徑 mysol = "D:\\ModelFiles\\test.sol"#視覺方案文件路徑 #創(chuàng)建vm調(diào)用對象 vm = mvvm.AS_MV_VM_Obj(AS) #加載方案 vm.LoadSolution(mysol) #綁定渲染框到指定的圖像框控件 vm.ModuleRender("image1","流程1.快速匹配1")#創(chuàng)建金橙子連接對象 modelpath = "D:\\ModelFiles\\test.ezd"#打碼模板文件路徑 myjcz = lmjcz.AS_LM_JCZ_Obj() myjcz.Init()#板卡初始化連接 #后臺線程 def subloopthread():global myjczwhile AS.Func_Sys_GetSysStatus():#獲取系統(tǒng)狀態(tài),便于安全退出time.sleep(1)myjcz.Exit()#退出板卡控制 #后臺線程啟動 t = threading.Thread(target=subloopthread, name='SubLoopThread') t.start()#打碼初始化 init_X = 0.0#這里需要填寫建立視覺模板時,模板匹配得到的初始X值 init_Y = 0.0#這里需要填寫建立視覺模板時,模板匹配得到的初始Y值 init_A = 0.0#這里需要填寫建立視覺模板時,模板匹配得到的初始A值 #數(shù)據(jù)準備 myjcz.LoadFile(modelpath)#加載EzCad2模板文件#循環(huán)函數(shù)體 while True:if AS.Func_UI_Button_GetValue(0):#按鈕觸發(fā)AS.Func_UI_Button_SetValue(0, False)#復位按鈕觸發(fā)標志位AS.Func_SysInfoAdd("視覺正在識別...")vm.ExecuteOnce("流程1")myres = vm.GetFormatResult("流程1.格式化1")#獲取視覺流程中格式化結果if (myres != "") and (myres != "NULL") :AS.Func_SysInfoAdd("視覺結果:" + myres)#獲取回傳圖像數(shù)據(jù)if myres == "NG":AS.Func_UI_Notify("視覺定位失敗!", "red", 3)continueresall = myres.split('@')#區(qū)分多個結果AS.Func_SysInfoAdd("識別到的個數(shù)" + str(len(resall)))for finallres in resall:#依次打印my_x = float(finallres.split(',')[0])my_y = float(finallres.split(',')[1])my_a = float(finallres.split(',')[2])delta_X = my_x - init_X#獲取X坐標差值delta_Y = my_y - init_Y#獲取Y坐標差值delta_A = my_a - init_A#獲取A坐標差值myjcz.SetRotateMoveParam(delta_X, delta_Y, init_X, init_Y, - delta_A / 180 * 3.14159265)#旋轉打刻myjcz.Mark(False)#開始標刻,帶True表示飛行標刻模式AS.Func_SysInfoAdd("打碼完成!")else:AS.Func_UI_Notify("視覺定位失敗!", "red", 3)time.sleep(0.1)?腳本的流程是通過按鈕觸發(fā),開始執(zhí)行加載的流程,然后捕獲視覺腳本內(nèi)部的“格式化結果”,根據(jù)結果的數(shù)據(jù)進行解析,將數(shù)據(jù)傳遞給打碼機進行打刻。
***********************************************************************************************************************************************
ApolloStudio最新版下載地址(網(wǎng)盤有交流群號):
(點擊跳轉至首頁文章,見文章最底部下載鏈接)
總結
以上是生活随笔為你收集整理的ApolloStudio高手之路(12):机器视觉图像匹配定位与激光打标领域深度结合(基于海康威视VisionMaster九点标定、模板快速匹配定位、标定转换以及金橙子EzCad2二次开发)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 多个列表_Python同时
- 下一篇: Latex安装教程(附美赛论文latex