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