vb.net開發(fā)視覺系統(tǒng)的簡(jiǎn)單介紹

如何在VB,VC和.NET中使用halcon

HALCON對(duì)于機(jī)器視覺的學(xué)習(xí)者、開發(fā)者而言并不陌生,稱其為機(jī)器視覺領(lǐng)域第一軟件,亦無可厚非。

我們提供的服務(wù)有:網(wǎng)站建設(shè)、成都網(wǎng)站制作、微信公眾號(hào)開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、吉安ssl等。為1000+企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的吉安網(wǎng)站制作公司

HALCON對(duì)于視覺系統(tǒng)的控制、圖像的處理和分析都能夠較好的實(shí)現(xiàn),尤其是各種圖像處理算法。但就其本身而言,開發(fā)用戶界面并不理想。用戶界面以及對(duì)于其他底層的控制,比如和底層電路板、PLC等的控制和通信,可通過VC++、VB等進(jìn)行開發(fā)。方便的是,HALCON恰恰能夠被這些開發(fā)工具所調(diào)用,它支持C、C++、VB、JAVA等等。

剛開始結(jié)合VC++結(jié)合HALCON進(jìn)行學(xué)習(xí)和開發(fā)時(shí),因?yàn)檐浖矫娴谋∪?,?duì)如何在VC++中如何調(diào)用HALCON感到不知所措,也在網(wǎng)上找了一些資料,資料較少,基本內(nèi)容相同,或許能用,但始終對(duì)于筆者個(gè)人而言不太靈光。后來在一位軟件同事的指導(dǎo)下,對(duì)其有了較為深刻的了解,其實(shí)說到底對(duì)軟件工程師而言這是一件很簡(jiǎn)單的事,也就是將HALCON的庫(kù)導(dǎo)入VC++。

以下,針對(duì)初學(xué)者一步步介紹,以MFC作為開發(fā)工具。

在Visual Studio中新建項(xiàng)目選擇Visual C++下的MFC,其中的MFC應(yīng)用程序,建立過程不贅述。本文以Visual Studio 2005為例。

打開HALCON安裝目錄(以HALCON7.0為例,后面的版本也相同),如下圖1所示:

將其中的include文件夾整個(gè)拷貝至所建MFC項(xiàng)目工作目錄下,如下圖2所示:

同樣,將HALCON的LIB文件拷貝到所建MFC項(xiàng)目工作目錄下,因使用C++進(jìn)行開發(fā),所以選擇X:Program FilesMVTecHALCONlibi586-nt4下的halconcpp.lib,這里X:為安裝盤符

打開stdafx.h,在文件中空白位置處,加入

#include "include/cpp/HalconCpp.h"

#prama comment(lib,"halconcpp.lib")

下一步,點(diǎn)擊項(xiàng)目下的屬性,如下圖6所示:

點(diǎn)開配置屬性中的C/C++,如下圖7所示:

當(dāng)點(diǎn)在附加包含目錄右側(cè)空白框時(shí),會(huì)出現(xiàn)的圖標(biāo),點(diǎn)開,如下圖8所示:

點(diǎn)擊新建行,將所建MFC項(xiàng)目工程目錄下的include文件夾的地址輸入,也就是剛才我們拷貝過去的那個(gè)文件夾

最后一步,在需要使用HALCON庫(kù)的地方,將其頭文件導(dǎo)入,以****Dlg.cpp為例

這樣我們就算成功在VC++/MFC中導(dǎo)入了HALCON庫(kù)文件,就可以調(diào)用HALCON的函數(shù),使用其強(qiáng)大的算法。另外,單純執(zhí)行上述步驟后,按F5啟動(dòng)調(diào)試,應(yīng)該是不會(huì)有任何的ERROR和WARNING的。此方法同樣適用于VB,在此不贅述,VB的開發(fā)者可自行嘗試。

機(jī)器視覺檢測(cè)系統(tǒng)編程用的什么語言

一般二次開發(fā)用vb.net或者c#即可,如果想要自己寫算法做開發(fā),或者定制現(xiàn)有的算法,建議使用C++

Vb(或者VB.net)影像識(shí)別系統(tǒng)

建議用VC做吧,VB圖像處理速度慢。

VC的話其實(shí)不怎么難,簡(jiǎn)單學(xué)學(xué)圖像處理,網(wǎng)上現(xiàn)成的程序一把,涉及降噪、圖像二值化、邊界提取、中心計(jì)算等問題,還有回調(diào)函數(shù)也用的到。

VB.net可以開發(fā)小型3D圖形顯示軟件嗎?

可以借助DirectX來編程。免費(fèi)3D引擎可不好找,一般來說速度比不上硬件加速后的DX,尤其令人頭疼的是一般都沒有針對(duì)VB的文檔,LZ有這方面理想的話,自己寫一個(gè)吧……

我不得不承認(rèn)在VB上寫DirectX的教程相當(dāng)難找!如果LZ想深入研究三維圖形問題,C++一定要學(xué),就算不能用C++編程,起碼要能把C++程序翻譯成VB程序。

我自己學(xué)會(huì)DX編程花了兩三個(gè)月(很淺)。編這樣一個(gè)程序難度是有點(diǎn)大的。

工具:DirectX9和其針對(duì)VB的庫(kù)(項(xiàng)目-添加引用。.NET庫(kù)里DX庫(kù)一般都有),VB不知道現(xiàn)在支不支持DX10以上的版本,不過9絕對(duì)夠用了。

思路:一切3D圖形都是由三角形拼成的。矩形挖掉一個(gè)圓孔可不是一個(gè)方便畫的圖形,我估計(jì)至少得有24個(gè)三角形。你需要記錄這些點(diǎn)的坐標(biāo),或者干脆把它們寫在文件里,到時(shí)讀出來。

這是我的一個(gè)老DX程序的不完全的代碼(顯示一個(gè)黑乎乎的平面),不一定能編譯,可以參考一下。

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 '存放頂點(diǎn)位置的數(shù)組

#Region "DX Core"

Public Sub InitDeviceObjects()

With d3dpp ‘以下請(qǐng)照抄。

.Windowed = True ‘不全屏。

.SwapEffect = Direct3D.SwapEffect.Discard ’雙緩沖交換效果。請(qǐng)百度“雙緩沖”

.BackBufferFormat = Direct3D.Format.Unknown

.EnableAutoDepthStencil = True ’讓DX自動(dòng)管理深度緩沖

.AutoDepthStencilFormat = Direct3D.DepthFormat.D16

End With

MyDevice = New Direct3D.Device(0, Direct3D.DeviceType.Hardware, Me.Handle, Direct3D.CreateFlags.HardwareVertexProcessing, d3dpp) '創(chuàng)建DX設(shè)備啦!以下兩句請(qǐng)照抄。

MyDevice.SetRenderState(Direct3D.RenderStates.ZEnable, True) ‘Z緩沖

MyDevice.SetRenderState(Direct3D.RenderStates.NormalizeNormals, True)'法線歸一化,請(qǐng)看相關(guān)數(shù)學(xué)書籍。

End Sub

Public Sub RestoreDeviceObjects()

Dim PlaneIB() As Short = {0, 1, 3, 0, 2, 3} ’頂點(diǎn)索引信息。

Dim AttrTable(1) As Direct3D.AttributeRange ‘頂點(diǎn)分組屬性表

AttrTable(0).AttributeId = 0

AttrTable(0).FaceStart = 0

AttrTable(0).FaceCount = 2 ’有兩個(gè)三角形

AttrTable(0).VertexStart = 0

AttrTable(0).VertexCount = 4 ‘四個(gè)點(diǎn)

‘頂點(diǎn)坐標(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) ‘輸入頂點(diǎn)坐標(biāo)數(shù)據(jù)

MyPlane.SetIndexBufferData(PlaneIB, Direct3D.LockFlags.None) ‘輸入索引數(shù)據(jù)

MyPlane.SetAttributeTable(AttrTable) ‘輸入頂點(diǎn)分組屬性表

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ì)算攝像機(jī)位置矩陣

Device.SetTransform(Direct3D.TransformType.View, MatView) ‘設(shè)置當(dāng)前攝像機(jī)位置矩陣為MatView。

Dim fAspect As Single = Me.Width / Me.Height ’窗口長(zhǎng)寬比

matProj = Matrix.PerspectiveFovLH(Math.PI / 4, fAspect, 1.0F, 10001) ‘計(jì)算透視矩陣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 ’物體位于原點(diǎn),不旋轉(zhuǎn)

Device.SetTransform(Direct3D.TransformType.World, MatWorld) ’設(shè)置物體位置

Me.Mesh.DrawSubset(0) ‘畫物體

MyDevice.EndScene() ’結(jié)束

MyDevice.Present() ‘顯示在屏幕上

End Sub

Public Sub DeleteDeviceObjects() ’結(jié)束程序時(shí)放掉資源

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可以用來做機(jī)器視覺開發(fā)嗎

VB是可以的。例如常規(guī),像素RGB范圍匹配模式,二值化對(duì)比模式也都是僅僅數(shù)十行代碼可以實(shí)現(xiàn)。當(dāng)然一些高級(jí)的工件自由檢測(cè),如指紋算法模式,非基準(zhǔn)輪廓對(duì)比等就是看自己的VB功力了。

首先,硬件方面

1、相機(jī)最好要支持VB6的SDK開發(fā)包,這樣事半功倍;

2、如果檢測(cè)環(huán)境無法做防干擾屏蔽罩時(shí),必須選用窄通紅外相機(jī)配合紅外光源,一般透光波長(zhǎng)選擇800·900納米范圍,缺點(diǎn)是這樣的相機(jī)只有灰度圖像;

3、檢測(cè)誤報(bào)率與環(huán)境光源干擾、信噪比、曝光穩(wěn)定性、白平衡等有重要關(guān)系;

4、檢測(cè)響應(yīng)速度與相機(jī)幀率、相機(jī)像素大小、控制器CPU、上位機(jī)計(jì)算程序代碼寫法有關(guān);

5、如果被檢查工件之間的顏色差異非常明顯如黑與白,藍(lán)與黃,紅與綠且檢測(cè)精度要求低或僅檢測(cè)有無,則可以選擇低端的普通攝像頭、一般的白光光源。但最好要防干擾屏蔽罩;

6、相機(jī)的I/O觸發(fā)可有可無,一般通過軟觸發(fā)。因此要配一塊串口通訊的單片機(jī),根據(jù)實(shí)際檢測(cè)功能配置合適的輸入和輸出點(diǎn)數(shù),其作用是上位機(jī)控制相機(jī)和外接其它功能設(shè)備。土豪當(dāng)然也可以直接用PLC。

7、軟件基本邏輯是,上位機(jī)軟件觸發(fā)相機(jī)拍照,程序?qū)⒄掌祷幚砘蜉喞崛?,分析與基準(zhǔn)圖像的差異并作出判斷。I/O卡輸出信號(hào)控制其它外接設(shè)備工作。

檢測(cè)分為,ROI匹配或全圖匹配。ROI匹配即通過VB上位機(jī)軟件設(shè)定,只檢測(cè)需要檢測(cè)的部分,大大減少CPU計(jì)算量,提升檢測(cè)響應(yīng)速度。全圖匹配,不建議使用,不但誤報(bào)高,而且吃CPU。

希望這些信息可以幫到你。

本文題目:vb.net開發(fā)視覺系統(tǒng)的簡(jiǎn)單介紹
URL標(biāo)題:http://muchs.cn/article36/hjdhpg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動(dòng)網(wǎng)站建設(shè)、App設(shè)計(jì)云服務(wù)器、關(guān)鍵詞優(yōu)化網(wǎng)站維護(hù)、小程序開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

手機(jī)網(wǎng)站建設(shè)