HALCON對于機(jī)器視覺的學(xué)習(xí)者、開發(fā)者而言并不陌生,稱其為機(jī)器視覺領(lǐng)域第一軟件,亦無可厚非。
我們提供的服務(wù)有:網(wǎng)站建設(shè)、成都網(wǎng)站制作、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、吉安ssl等。為1000+企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的吉安網(wǎng)站制作公司
HALCON對于視覺系統(tǒng)的控制、圖像的處理和分析都能夠較好的實現(xiàn),尤其是各種圖像處理算法。但就其本身而言,開發(fā)用戶界面并不理想。用戶界面以及對于其他底層的控制,比如和底層電路板、PLC等的控制和通信,可通過VC++、VB等進(jìn)行開發(fā)。方便的是,HALCON恰恰能夠被這些開發(fā)工具所調(diào)用,它支持C、C++、VB、JAVA等等。
剛開始結(jié)合VC++結(jié)合HALCON進(jìn)行學(xué)習(xí)和開發(fā)時,因為軟件方面的薄弱,對如何在VC++中如何調(diào)用HALCON感到不知所措,也在網(wǎng)上找了一些資料,資料較少,基本內(nèi)容相同,或許能用,但始終對于筆者個人而言不太靈光。后來在一位軟件同事的指導(dǎo)下,對其有了較為深刻的了解,其實說到底對軟件工程師而言這是一件很簡單的事,也就是將HALCON的庫導(dǎo)入VC++。
以下,針對初學(xué)者一步步介紹,以MFC作為開發(fā)工具。
在Visual Studio中新建項目選擇Visual C++下的MFC,其中的MFC應(yīng)用程序,建立過程不贅述。本文以Visual Studio 2005為例。
打開HALCON安裝目錄(以HALCON7.0為例,后面的版本也相同),如下圖1所示:
將其中的include文件夾整個拷貝至所建MFC項目工作目錄下,如下圖2所示:
同樣,將HALCON的LIB文件拷貝到所建MFC項目工作目錄下,因使用C++進(jìn)行開發(fā),所以選擇X:Program FilesMVTecHALCONlibi586-nt4下的halconcpp.lib,這里X:為安裝盤符
打開stdafx.h,在文件中空白位置處,加入
#include "include/cpp/HalconCpp.h"
#prama comment(lib,"halconcpp.lib")
下一步,點擊項目下的屬性,如下圖6所示:
點開配置屬性中的C/C++,如下圖7所示:
當(dāng)點在附加包含目錄右側(cè)空白框時,會出現(xiàn)的圖標(biāo),點開,如下圖8所示:
點擊新建行,將所建MFC項目工程目錄下的include文件夾的地址輸入,也就是剛才我們拷貝過去的那個文件夾
最后一步,在需要使用HALCON庫的地方,將其頭文件導(dǎo)入,以****Dlg.cpp為例
這樣我們就算成功在VC++/MFC中導(dǎo)入了HALCON庫文件,就可以調(diào)用HALCON的函數(shù),使用其強大的算法。另外,單純執(zhí)行上述步驟后,按F5啟動調(diào)試,應(yīng)該是不會有任何的ERROR和WARNING的。此方法同樣適用于VB,在此不贅述,VB的開發(fā)者可自行嘗試。
一般二次開發(fā)用vb.net或者c#即可,如果想要自己寫算法做開發(fā),或者定制現(xiàn)有的算法,建議使用C++
建議用VC做吧,VB圖像處理速度慢。
VC的話其實不怎么難,簡單學(xué)學(xué)圖像處理,網(wǎng)上現(xiàn)成的程序一把,涉及降噪、圖像二值化、邊界提取、中心計算等問題,還有回調(diào)函數(shù)也用的到。
可以借助DirectX來編程。免費3D引擎可不好找,一般來說速度比不上硬件加速后的DX,尤其令人頭疼的是一般都沒有針對VB的文檔,LZ有這方面理想的話,自己寫一個吧……
我不得不承認(rèn)在VB上寫DirectX的教程相當(dāng)難找!如果LZ想深入研究三維圖形問題,C++一定要學(xué),就算不能用C++編程,起碼要能把C++程序翻譯成VB程序。
我自己學(xué)會DX編程花了兩三個月(很淺)。編這樣一個程序難度是有點大的。
工具:DirectX9和其針對VB的庫(項目-添加引用。.NET庫里DX庫一般都有),VB不知道現(xiàn)在支不支持DX10以上的版本,不過9絕對夠用了。
思路:一切3D圖形都是由三角形拼成的。矩形挖掉一個圓孔可不是一個方便畫的圖形,我估計至少得有24個三角形。你需要記錄這些點的坐標(biāo),或者干脆把它們寫在文件里,到時讀出來。
這是我的一個老DX程序的不完全的代碼(顯示一個黑乎乎的平面),不一定能編譯,可以參考一下。
Imports Microsoft.DirectX '一定要~
Public Class FormMain
'Direct3D Startup
Dim d3dpp As New Direct3D.PresentParameters 'DX基本參數(shù),例如全屏還是窗口等
Public MyDevice As Direct3D.Device ‘DX基本設(shè)備,畫圖就靠它。
'Matrices
Dim matWorld, matView, matProj As Matrix '世界位置矩陣,攝像機(jī)位置矩陣和透視矩陣,數(shù)學(xué)要學(xué)好啊。
'mesh
Public MyPlane as Direct3D.Mesh ’我們的物體
Public VBPlane(3) As Direct3D.CustomVertex.PositionNormalTextured '存放頂點位置的數(shù)組
#Region "DX Core"
Public Sub InitDeviceObjects()
With d3dpp ‘以下請照抄。
.Windowed = True ‘不全屏。
.SwapEffect = Direct3D.SwapEffect.Discard ’雙緩沖交換效果。請百度“雙緩沖”
.BackBufferFormat = Direct3D.Format.Unknown
.EnableAutoDepthStencil = True ’讓DX自動管理深度緩沖
.AutoDepthStencilFormat = Direct3D.DepthFormat.D16
End With
MyDevice = New Direct3D.Device(0, Direct3D.DeviceType.Hardware, Me.Handle, Direct3D.CreateFlags.HardwareVertexProcessing, d3dpp) '創(chuàng)建DX設(shè)備啦!以下兩句請照抄。
MyDevice.SetRenderState(Direct3D.RenderStates.ZEnable, True) ‘Z緩沖
MyDevice.SetRenderState(Direct3D.RenderStates.NormalizeNormals, True)'法線歸一化,請看相關(guān)數(shù)學(xué)書籍。
End Sub
Public Sub RestoreDeviceObjects()
Dim PlaneIB() As Short = {0, 1, 3, 0, 2, 3} ’頂點索引信息。
Dim AttrTable(1) As Direct3D.AttributeRange ‘頂點分組屬性表
AttrTable(0).AttributeId = 0
AttrTable(0).FaceStart = 0
AttrTable(0).FaceCount = 2 ’有兩個三角形
AttrTable(0).VertexStart = 0
AttrTable(0).VertexCount = 4 ‘四個點
‘頂點坐標(biāo)信息。
VBPlane(0) = New Direct3D.CustomVertex.PositionNormalTextured(-500, -500, 0, 0, 0, 1, 0, 0)
VBPlane(1) = New Direct3D.CustomVertex.PositionNormalTextured(500, -500, 0, 0, 0, 1, 1, 0)
VBPlane(2) = New Direct3D.CustomVertex.PositionNormalTextured(-500, 500, 0, 0, 0, 1, 0, 1)
VBPlane(3) = New Direct3D.CustomVertex.PositionNormalTextured(500, 500, 0, 0, 0, 1, 1, 1)
MyPlane = New Direct3D.Mesh(2, 4, Direct3D.MeshFlags.Managed, Direct3D.VertexFormats.Position + Direct3D.VertexFormats.Normal + Direct3D.VertexFormats.Texture1, MyDevice) ’創(chuàng)建物體
MyPlane.SetVertexBufferData(VBPlane, Direct3D.LockFlags.None) ‘輸入頂點坐標(biāo)數(shù)據(jù)
MyPlane.SetIndexBufferData(PlaneIB, Direct3D.LockFlags.None) ‘輸入索引數(shù)據(jù)
MyPlane.SetAttributeTable(AttrTable) ‘輸入頂點分組屬性表
End Sub
Public Sub Render() ‘調(diào)用它畫圖
Dim vlook As New Vector3(1, 0, 0)
Dim vPos As New Vector3(0,0,0)
Dim vUp As New Vector3(0, 0, 1)
MatView = Matrix.LookAtLH(vPos, vlook, vUp) ‘計算攝像機(jī)位置矩陣
Device.SetTransform(Direct3D.TransformType.View, MatView) ‘設(shè)置當(dāng)前攝像機(jī)位置矩陣為MatView。
Dim fAspect As Single = Me.Width / Me.Height ’窗口長寬比
matProj = Matrix.PerspectiveFovLH(Math.PI / 4, fAspect, 1.0F, 10001) ‘計算透視矩陣MatProj。
MyDevice.SetTransform(Direct3D.TransformType.Projection, matProj) ‘設(shè)置當(dāng)前透視矩陣為MatProj。
MyDevice.Clear(Direct3D.ClearFlags.Target + Direct3D.ClearFlags.ZBuffer, Color.Blue, 1.0F, 0) ’先刷藍(lán)屏
MyDevice.BeginScene() ‘開始畫
MatWorld = Matrix.Identity ’物體位于原點,不旋轉(zhuǎn)
Device.SetTransform(Direct3D.TransformType.World, MatWorld) ’設(shè)置物體位置
Me.Mesh.DrawSubset(0) ‘畫物體
MyDevice.EndScene() ’結(jié)束
MyDevice.Present() ‘顯示在屏幕上
End Sub
Public Sub DeleteDeviceObjects() ’結(jié)束程序時放掉資源
MyPlane.Dispose()
MyDevice.Dispose()
End Sub
#End Region
Private Sub FormMain_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
DeleteDeviceObjects()
Windows.Forms.Cursor.Show()
End Sub
Private Sub FormMain_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
InitDeviceObjects()
RestoreDeviceObjects()
Windows.Forms.Cursor.Hide()
Render()
End Sub
End Class
VB是可以的。例如常規(guī),像素RGB范圍匹配模式,二值化對比模式也都是僅僅數(shù)十行代碼可以實現(xiàn)。當(dāng)然一些高級的工件自由檢測,如指紋算法模式,非基準(zhǔn)輪廓對比等就是看自己的VB功力了。
首先,硬件方面
1、相機(jī)最好要支持VB6的SDK開發(fā)包,這樣事半功倍;
2、如果檢測環(huán)境無法做防干擾屏蔽罩時,必須選用窄通紅外相機(jī)配合紅外光源,一般透光波長選擇800·900納米范圍,缺點是這樣的相機(jī)只有灰度圖像;
3、檢測誤報率與環(huán)境光源干擾、信噪比、曝光穩(wěn)定性、白平衡等有重要關(guān)系;
4、檢測響應(yīng)速度與相機(jī)幀率、相機(jī)像素大小、控制器CPU、上位機(jī)計算程序代碼寫法有關(guān);
5、如果被檢查工件之間的顏色差異非常明顯如黑與白,藍(lán)與黃,紅與綠且檢測精度要求低或僅檢測有無,則可以選擇低端的普通攝像頭、一般的白光光源。但最好要防干擾屏蔽罩;
6、相機(jī)的I/O觸發(fā)可有可無,一般通過軟觸發(fā)。因此要配一塊串口通訊的單片機(jī),根據(jù)實際檢測功能配置合適的輸入和輸出點數(shù),其作用是上位機(jī)控制相機(jī)和外接其它功能設(shè)備。土豪當(dāng)然也可以直接用PLC。
7、軟件基本邏輯是,上位機(jī)軟件觸發(fā)相機(jī)拍照,程序?qū)⒄掌祷幚砘蜉喞崛。治雠c基準(zhǔn)圖像的差異并作出判斷。I/O卡輸出信號控制其它外接設(shè)備工作。
檢測分為,ROI匹配或全圖匹配。ROI匹配即通過VB上位機(jī)軟件設(shè)定,只檢測需要檢測的部分,大大減少CPU計算量,提升檢測響應(yīng)速度。全圖匹配,不建議使用,不但誤報高,而且吃CPU。
希望這些信息可以幫到你。