Hướng phát triển và ứng dụng

Một phần của tài liệu Nghiên cứu độ chính xác khi đo profil bề mặt chi tiết máy bằng phương pháp quét laser (Trang 73 - 87)

L ời mở đầ u

2. Hướng phát triển và ứng dụng

Phương pháp đo dựa vào phương pháp quét laser lên vật thểđo là một phương pháp đo với tốc độđo nhanh và độ chính xác đo cao. Các tìm hiểu và nghiên cứu trong bản luận văn này có thể dùng để làm cơ sở đểđánh giá mức

độ ảnh hưởng của các thông số hình học của cụm đầu đo, qua đó ta đưa ra

được thông số hình học phù hợp của cụm đầu đo để có độ chính xác cao hơn khi ứng dụng phương pháp quét laser đểđo kích thước của chi tiết.

Ngoài ra khi có những cơ sở lý thuyết, phương pháp xử lý ảnh, hàm truyền và chương trình xử lý số liệu đo còn mở ra nhiều hướng nghiên cứu khác liên quan đến phương pháp quét laser ứng dụng trong đo lường.

TÀI LIỆU THAM KHẢO Tiếng Việt

1. Lương Mạnh Bá, Nguyễn Thanh Thủy (2002), Nhập môn xử lý ảnh số,

Nhà xuất bản khoa học và kỹ thuật.

2. Lưu Thủy Chung (2009), Xử lý số liệu khi đo kích thước chi tiết bằng phương pháp quét laser - Luận văn thạc sĩ.

3. Dương Đức Hiếu, Vũ Hoàng Tuấn, Nguyễn Dương Hùng (2010),

Nghiên cứu chế tạo máy quét lazer 3D – Đồ án tốt nghiệp.

4. Đinh Thế Thìn (2009), Nghiên cứu xây dựng cơ sở thiết kế thiết bị đo các thông số hình học của chi tiết dạng thanh bằng phương pháp chụp

ảnh vết chiếu laser – Luận văn thạc sĩ.

5. Nguyễn Tiến Thọ, Nguyễn Xuân Bảy (2005), Kỹ Thuật Đo Lường Kiểm Tra Trong Chế Tạo Cơ Khí, Nhà xuất bản khoa học và kỹ thuật. 6. Ninh Đức Tốn (2004), Dung sai và lắp ghép, Nhà xuất bản khoa học

và kỹ thuật.

7. Trần Đình Tường, Hoàng Hồng Hải (2006), Quang kỹ thuật, Nhà xuất bản khoa học và kỹ thuật.

Tiếng Anh

8. Joseph R.Bietry (2000), Laser line generator system, US Patent number 6069748.

9. S.G. Hoggar, Mathematics of Digital Image, Cambridge University Press.

PHỤ LỤC Phụ lục A: Một số hình ảnh mô hình

Phụ lục B: Mã nguồn chương trình dò tìm vết sáng.

Đoạn mã chương trình xác định đường trung bình của vết sáng. Chương trình được viết theo ngôn ngữ Visual Basic.net 2008.

Imports System.IO.File Imports System.IO Imports System.Math Public Class MainForm Structure ArrPoints Public x As Double Public y As Double 'Public zz0 As Integer 'Public goc0 As Integer End Structure

Structure ArrXZ Public x As Double Public Z As Double 'Public zz0 As Integer 'Public goc0 As Integer End Structure

Structure ArrYZ Public y As Double Public Z As Double 'Public zz0 As Integer 'Public goc0 As Integer End Structure

Dim X0 As Integer Dim Y0 As Integer

'///////////////////////////////////////////////// Dim Z0 As Double ' Khoang cach Z0

Dim b As Double ' Khoang cach giua quang tam thau kinh va CCD Dim goc As Double

Dim dpg As Double ' Do phan giai cua CCD

'////////////////////////////////////////////////// Dim m_image As Long

Dim r_image As Long

'////////////////////////////////////////////////// Public Zxarr(100) As ArrXZ

Public Zyarr(100) As ArrYZ Dim listp(640) As ArrPoints

Dim nump As Integer ' so dem cua listP

Public numX, numY As Integer ' so dem cua Zxarr va Zyarr '////////////////////

Dim numc As Integer Const pi = 3.1415

Private Sub Run_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Run.Click

Dim x, y As Integer ' So pixel theo phuong x va y Dim xt, yt As Double ' Toa do thuc cua diem sang Dim xc, yc As Double ' Toa do cua diem sang tren CCD Dim ytb As Integer

Dim i As Integer Dim c As Color Dim bm As Bitmap Dim strg As String Timer1.Enabled = False i = 0 nump = 0 ytb = 0 bm = PictureBox1.Image For x = 0 To bm.Width - 1 For y = 0 To bm.Height - 1 c = bm.GetPixel(x, y) If c.R = 255 Then i = i + 1 ytb = ytb + y End If Next y If i >= 5 Then ytb = Int(ytb / i)

'bp.SetPixel(x, ytb, Color.FromArgb(20, 20, 20)) xc = (x - X0) * dpg

yc = (ytb - Y0) * dpg

'xt = xc * Z0 / (b * Cos(goc * pi / 180) - yc * Sin(goc * pi / 180)) 'yt = Z0 * (b * Sin(goc * pi / 180) + yc * Cos(goc * pi / 180)) / (b * Cos(goc * pi / 180) - yc * Sin(goc * pi / 180))

xt = (-dpg * 640 / 2 + x * dpg) * Z0 / (-b * Sin(goc * pi / 180) + Cos(goc * pi / 180) * dpg * 480 / 2 - ytb * dpg * Sin(goc * pi / 180))

yt = (-b * Cos(goc * pi / 180) - Sin(goc * pi / 180) * dpg * 480 / 2 + ytb * dpg * Sin(goc * pi / 180)) * Z0 / (-b * Sin(goc * pi / 180) + Cos(goc * pi / 180) * dpg * 480 / 2 - ytb * dpg * Sin(goc * pi / 180)) listp(nump).x = xt listp(nump).y = yt nump = nump + 1 strg = Str(xt) + ";" + Str(yt) ListBox1.Items.Add(strg) End If i = 0 ytb = 0 Next x

numc = numc + 1 Label4.Text = Str(numc) LongXY() If numc = 15 Then Run.Enabled = False End If End Sub

Private Sub LongXY() Dim i, j As Integer

Dim ytg, xtg, ymax As Double Dim x(2) As Double

ytg = listp(0).y xtg = listp(0).x j = 0

For i = 1 To nump

If Abs(listp(i).y - ytg) > 8 Then j = j + 1 If j <= 2 Then x(j) = listp(i).x End If End If ytg = listp(i).y Next If j > 1 Then Zxarr(numX).x = Abs(x(1) - x(2)) Zxarr(numX).Z = Z0 numX = numX + 1 End If ymax = 0 ytg = listp(0).y For i = 1 To nump

If ymax < Abs(listp(i).y - listp(i - 1).y) Then ymax = Abs(listp(i).y - listp(i - 1).y) End If Next Zyarr(numY).y = ymax Zyarr(numY).Z = Z0 numY = numY + 1 End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

AxVideoOCX1.Stop() AxVideoOCX1.Close() End

End Sub

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

X0 = 320 Y0 = 220 '///////////////////////// Z0 = 80 b = 21 goc = 60 dpg = 0.0375 '///////////////////////// numX = 0 numY = 0 '//////////////////////// numc = 0 End Sub

Private Sub Cam_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Cam.Click

Timer1.Enabled = True End Sub

Private Sub Init_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Init.Click

AxVideoOCX1.SetErrorMessages(False) If Not AxVideoOCX1.Init Then

MsgBox(AxVideoOCX1.GetLastErrorString) Else

m_image = AxVideoOCX1.GetGrayImageHandle r_image = AxVideoOCX1.GetGrayImageHandle If Not AxVideoOCX1.Start Then

MsgBox(AxVideoOCX1.GetLastErrorString) End If End If Timer1.Enabled = True Timer1.Interval = 40 Cam.Enabled = True Run.Enabled = True End Sub

Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick

Dim show_result As Boolean

If (AxVideoOCX1.Capture(m_image)) Then

If (AxVideoOCXTools1.Threshold(m_image, 150, r_image)) Then ' Display result later

show_result = True End If

' If a Tool was used, display the resulting image, otherwise show original AxVideoOCX1.Capture(m_image)

PictureBox1.Image = AxVideoOCX1.ToPicture(r_image) End If

End Sub

Private Sub ExitToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ExitToolStripMenuItem.Click

AxVideoOCX1.Stop() AxVideoOCX1.Close() End

End Sub

Private Sub SaveToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SaveToolStripMenuItem.Click

Dim save As New SaveFileDialog 'Khai bao chuoi loc tap tin Dim chuoi As String

Dim i As Integer

chuoi = "Text files(*.txt)"

chuoi += "|*.txt|All files(*.*)|*.*" save.Filter = chuoi

save.Title = "Luu Tap Tin" save.ShowDialog()

If save.FileName <> "" Then 'luu tap tin vua chon Dim taptin As TextWriter

taptin = CreateText(save.FileName) For i = 0 To ListBox1.Items.Count - 1 taptin.WriteLine(ListBox1.Items.Item(i)) Next taptin.Flush() taptin.Close() End If End Sub

Private Sub ToolStripButton2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButton2.Click

SaveToolStripMenuItem_Click(sender, e) End Sub

Private Sub ChartToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ChartToolStripMenuItem.Click

Chart.ShowDialog() End Sub

Private Sub ToolStripButton5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButton5.Click

AxVideoOCX1.Stop() AxVideoOCX1.Close()

End End Sub

Private Sub ComboBox1_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox1.TextChanged Z0 = CDbl(ComboBox1.Text) numc = 0 Run.Enabled = True 'Label3.Text = Str(Z0) End Sub

Private Sub ComboBox2_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox2.TextChanged goc = CDbl(ComboBox2.Text) numc = 0 Run.Enabled = True End Sub End Class Phụ lục C: Mã nguồn chương trình xử lý kết quảđo. Imports System.Windows.Forms Imports System.Drawing.Drawing2D Imports System.Math

Public Class Chart

Dim CacDiemTrenDoThi(359) As PointF, BienDem As Integer Dim KhoangChiaDo As Double, ViTriTrucHoanh As Double Dim gNoiVe As Graphics

'Dim pDuongBieuDien As Pen = New Pen(Color.Blue, 1) Dim pTrucHoanh As Pen = New Pen(Color.Red, 1) Dim pmau As Pen = New Pen(Color.Blue, 1) Dim pluoi As Pen = New Pen(Color.DarkGray, 1) Dim pduong As Pen = New Pen(Color.DarkViolet, 1) Dim pdiem As Pen = New Pen(Color.Chocolate, 4) Private Sub truc()

Dim i As Integer Dim xi, yi As Integer With (gNoiVe) .Clear(Panel1.BackColor) 'New SolidBrush(Color.Green), 120, 20) .DrawLine(pmau, 30, CInt(ViTriTrucHoanh) - 150, _ Panel1.Width - 5, CInt(ViTriTrucHoanh) - 150) xi = 0 For i = 1 To CInt(Panel1.Width / 10) .DrawLine(pluoi, xi, 1, _ xi, Panel1.Height - 1) xi = xi + 10 Next yi = 0

For i = 1 To CInt(Panel1.Height / 10) .DrawLine(pluoi, 1, yi, _ Panel1.Width - 1, yi) yi = yi + 10 Next .DrawLine(pTrucHoanh, 5, CInt(ViTriTrucHoanh), _ Panel1.Width - 5, CInt(ViTriTrucHoanh))

.DrawLine(pTrucHoanh, Panel1.Width - 15, CInt(ViTriTrucHoanh) - 3, _ Panel1.Width - 5, CInt(ViTriTrucHoanh))

.DrawLine(pTrucHoanh, Panel1.Width - 15, CInt(ViTriTrucHoanh) + 3, _ Panel1.Width - 5, CInt(ViTriTrucHoanh)) ' ve truc tung .DrawLine(pTrucHoanh, 30, 10, _ 30, Panel1.Height - 10) .DrawLine(pTrucHoanh, 27, 20, _ 30, 10) .DrawLine(pTrucHoanh, 33, 20, _ 30, 10) End With End Sub

Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click Label1.Text = "" Label1.Visible = False Label2.Visible = False Close() End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim i As Integer Dim x, xx As Integer Dim y, yy As Integer Dim z As Double Label1.Text = "X" Label1.Visible = True Label2.Visible = True truc() For i = 0 To 14 DataGridView1.Rows.Item(0).Cells(i).Value = Str(Form1.Zxarr(i).x) Next With (gNoiVe) For i = 0 To 13 x = 30 * i + 30 xx = 30 * i + 60

y = CInt(ViTriTrucHoanh) - 150 - CInt(100 * (Form1.Zxarr(i).x - 20)) yy = CInt(ViTriTrucHoanh) - 150 - CInt(100 * (Form1.Zxarr(i + 1).x - 20)) .DrawLine(pdiem, x - 2, y, x + 2, y)

pduong = New Pen(Color.DarkBlue, 1) .DrawLine(pduong, x, y, _

xx, yy)

.DrawLine(pdiem, xx - 2, yy, xx + 2, yy) z = Form1.Zxarr(i).Z

Next

.DrawLine(pduong, Panel1.Width - 60, 10, Panel1.Width - 10, 10) .DrawLine(pdiem, Panel1.Width - 37, 10, Panel1.Width - 33, 10) .DrawString("Z0=" + Str(z), New Font("Times New Roman", 8), _ New SolidBrush(Color.DarkBlue), Panel1.Width - 100, 4) '/////////////////////////////////////////////////////////// For i = 0 To 14 DataGridView1.Rows.Item(1).Cells(i).Value = Str(Form1.Zxarr(i + 15).x) Next For i = 15 To 28 x = 30 * (i - 15) + 30 xx = 30 * (i - 15) + 60

y = CInt(ViTriTrucHoanh) - 150 - CInt(100 * (Form1.Zxarr(i).x - 20)) yy = CInt(ViTriTrucHoanh) - 150 - CInt(100 * (Form1.Zxarr(i + 1).x - 20)) .DrawLine(pdiem, x - 2, y, x + 2, y)

pduong = New Pen(Color.Brown, 1) .DrawLine(pduong, x, y, _ xx, yy)

.DrawLine(pdiem, xx - 2, yy, xx + 2, yy) z = Form1.Zxarr(i).Z

Next

.DrawLine(pduong, Panel1.Width - 60, 25, Panel1.Width - 10, 25) .DrawLine(pdiem, Panel1.Width - 37, 25, Panel1.Width - 33, 25) .DrawString("Z0=" + Str(z), New Font("Times New Roman", 8), _ New SolidBrush(Color.Brown), Panel1.Width - 100, 19)

'/////////////////////////////////////////////////////////// For i = 0 To 14 DataGridView1.Rows.Item(2).Cells(i).Value = Str(Form1.Zxarr(i + 30).x) Next For i = 30 To 43 x = 30 * (i - 30) + 30 xx = 30 * (i - 30) + 60

y = CInt(ViTriTrucHoanh) - 150 - CInt(100 * (Form1.Zxarr(i).x - 20)) yy = CInt(ViTriTrucHoanh) - 150 - CInt(100 * (Form1.Zxarr(i + 1).x - 20)) .DrawLine(pdiem, x - 2, y, x + 2, y)

pduong = New Pen(Color.Green, 1) .DrawLine(pduong, x, y, _ xx, yy)

.DrawLine(pdiem, xx - 2, yy, xx + 2, yy) z = Form1.Zxarr(i).Z

Next

.DrawLine(pduong, Panel1.Width - 60, 40, Panel1.Width - 10, 40) .DrawLine(pdiem, Panel1.Width - 37, 40, Panel1.Width - 33, 40)

.DrawString("Z0=" + Str(z), New Font("Times New Roman", 8), _ New SolidBrush(Color.Green), Panel1.Width - 100, 34)

'/////////////////////////////////////////////////////////// For i = 0 To 14 DataGridView1.Rows.Item(3).Cells(i).Value = Str(Form1.Zxarr(i + 45).x) Next For i = 45 To 58 x = 30 * (i - 45) + 30 xx = 30 * (i - 45) + 60

y = CInt(ViTriTrucHoanh) - 150 - CInt(100 * (Form1.Zxarr(i).x - 20)) yy = CInt(ViTriTrucHoanh) - 150 - CInt(100 * (Form1.Zxarr(i + 1).x - 20)) .DrawLine(pdiem, x - 2, y, x + 2, y)

pduong = New Pen(Color.Violet, 1) .DrawLine(pduong, x, y, _

xx, yy)

.DrawLine(pdiem, xx - 2, yy, xx + 2, yy) z = Form1.Zxarr(i).Z

Next

.DrawLine(pduong, Panel1.Width - 60, 55, Panel1.Width - 10, 55) .DrawLine(pdiem, Panel1.Width - 37, 55, Panel1.Width - 33, 55) .DrawString("Z0=" + Str(z), New Font("Times New Roman", 8), _ New SolidBrush(Color.Violet), Panel1.Width - 100, 49)

'/////////////////////////////////////////////////////////// For i = 0 To 14 DataGridView1.Rows.Item(4).Cells(i).Value = Str(Form1.Zxarr(i + 60).x) Next For i = 60 To 73 x = 30 * (i - 60) + 30 xx = 30 * (i - 60) + 60

y = CInt(ViTriTrucHoanh) - 150 - CInt(100 * (Form1.Zxarr(i).x - 20)) yy = CInt(ViTriTrucHoanh) - 150 - CInt(100 * (Form1.Zxarr(i + 1).x - 20)) .DrawLine(pdiem, x - 2, y, x + 2, y)

pduong = New Pen(Color.Black, 1) .DrawLine(pduong, x, y, _ xx, yy)

.DrawLine(pdiem, xx - 2, yy, xx + 2, yy) z = Form1.Zxarr(i).Z

Next

.DrawLine(pduong, Panel1.Width - 60, 70, Panel1.Width - 10, 70) .DrawLine(pdiem, Panel1.Width - 37, 70, Panel1.Width - 33, 70) .DrawString("Z0=" + Str(z), New Font("Times New Roman", 8), _ New SolidBrush(Color.Black), Panel1.Width - 100, 64)

End With End Sub

Private Sub Chart_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

ViTriTrucHoanh = CInt(Panel1.Height - 30) pluoi.DashStyle = DashStyle.Dot pmau.DashStyle = DashStyle.Dash gNoiVe = Panel1.CreateGraphics DataGridView1.Rows.Add() DataGridView1.Rows.Add() DataGridView1.Rows.Add() DataGridView1.Rows.Add() End Sub

Sub VeDuongBieuDien(ByVal sTenHam As String) '

End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim i As Integer Dim x, xx As Integer Dim y, yy As Integer Label1.Text = "Y" Label1.Visible = True Label2.Visible = True truc() For i = 0 To Form1.numY - 1 DataGridView1.Rows.Item(0).Cells(i).Value = Str(Form1.Zyarr(i).y) Next With (gNoiVe) For i = 0 To Form1.numY - 2 x = 20 * i + 30 xx = 20 * i + 50 y = CInt(ViTriTrucHoanh) - 5 * CInt(Form1.Zyarr(i).y) yy = CInt(ViTriTrucHoanh) - 5 * CInt(Form1.Zyarr(i + 1).y) .DrawLine(pduong, x, y, _ xx, yy) Next End With End Sub End Class

Một phần của tài liệu Nghiên cứu độ chính xác khi đo profil bề mặt chi tiết máy bằng phương pháp quét laser (Trang 73 - 87)

Tải bản đầy đủ (PDF)

(87 trang)