ชุมชนคนรักภาษาเบสิค - Visual Basic Community

 ลืมรหัสผ่าน
 ลงทะเบียน
ค้นหา
ดู: 4727|ตอบกลับ: 1

[VB.NET] การจับภาพและบันทึกไฟล์ภาพจากกล้องเว็บแคมด้วยการใช้งาน Touchless SDK

[คัดลอกลิงก์]

320

กระทู้

512

โพสต์

6583

เครดิต

ผู้ดูแลระบบ

ทองก้อน ทับทิมกรอบ

Rank: 9Rank: 9Rank: 9

เครดิต
6583



วันนี้แอดมินขอนำเสนอการจับภาพ (Capture) และบันทึกไฟล์ภาพแบบ JPG ด้วยการใช้งาน Touchless SDK (Software Development Kit) ซึ่งเป็นชุดพัฒนาของฟรี สามารถทำการดาวน์โหลดได้ที่ http://touchless.codeplex.com สามารถนำไปประยุกต์ใช้งานได้หลากหลายอย่างมากมาย เช่น ถ่ายรูปติดบัตรนักเรียน นักศึกษา ผู้เข้าสอบ ผู้เข้าร่วมประชุมอบรม สัมมนา การจัดเก็บข้อมูลภาพวัสดุ ครุภัณฑ์ สินค้าที่มีหลากหลายมุมมอง ฯลฯ ... ส่วนกล้องนอกจากจะใช้ WebCam เรายังสามารถต่อเชื่อมกับโทรศัพท์ระบบปฏิบัติการ Android ได้ด้วย โดยการใช้ DroidCam เข้าช่วยครับผม ...

หลักการทำงานของโปรแกรม ... ค้นหากล้องเว็บแคมเข้ามาเก็บไว้ใน ComboBox จากนั้นทำการเลือกกล้องที่ต้องการ แล้วก็กดปุ่ม Capture (แอดมินลืมทำฟังค์ชั่นคีย์ให้) แล้วกดปุ่ม Save เพื่อบันทึกภาพลงในโฟลเดอร์ Images และทำการแสดงผลลงไปในตารางกริด โดยเราสามารถลบไฟล์ทิ้งได้ด้วย ในกรณีที่เปิดโปรแกรมขึ้นมาใหม่ ก็จะทำการค้นคืนภาพ (Retrieve) ภาพ JPG ในโฟลเดอร์ Images เอากลับมาแสดงผลในตารางกริด ...

การเรียกใช้ไฟล์ TouchlessLib.DLL และต้องนำไฟล์ WebCamLib.DLL ไปเก็บไว้ที่ไฟล์ Execute รันด้วย ...


มาดูโค้ดฉบับเต็มกันเถอะ ...
  1. Imports System.Threading
  2. Imports TouchlessLib
  3. Imports System.IO

  4. Public Class frmCamera
  5.     Dim WebCamMgr As TouchlessLib.TouchlessMgr
  6.     Dim strImagePath As String

  7.     Private Sub frmCamera_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
  8.         Try
  9.             Timer1.Enabled = False
  10.             WebCamMgr.CurrentCamera.Dispose()
  11.             WebCamMgr.Cameras.Item(cmbCamera.SelectedIndex).Dispose()
  12.             WebCamMgr.Dispose()
  13.         Catch ex As Exception
  14.             MessageBox.Show(ex.Message)
  15.         End Try
  16.     End Sub

  17.     Private Sub frmCamera_Load(sender As Object, e As System.EventArgs) Handles Me.Load
  18.         WebCamMgr = New TouchlessLib.TouchlessMgr
  19.         Label2.Text = ""
  20.         For i As Integer = 0 To WebCamMgr.Cameras.Count - 1
  21.             cmbCamera.Items.Add(WebCamMgr.Cameras(i).ToString)
  22.         Next
  23.         If cmbCamera.Items.Count >= 0 Then
  24.             cmbCamera.SelectedIndex = 0
  25.             Timer1.Enabled = True
  26.             btnSave.Enabled = False
  27.             '// Create a folder in VB if it doesn't exist.
  28.             strImagePath = MyPath(Application.StartupPath) & "Images"
  29.             If (Not System.IO.Directory.Exists(strImagePath)) Then
  30.                 System.IO.Directory.CreateDirectory(strImagePath)
  31.             End If
  32.             '// Initialized and load images into DataGridView.
  33.             Call InitDataGridView()
  34.             Call LoadImage2DatagridView()
  35.         Else
  36.             MessageBox.Show("No Web Camera, This application needs a webcam.", "Report Status", MessageBoxButtons.OK, MessageBoxIcon.Information)
  37.             Me.Close()
  38.         End If
  39.     End Sub

  40.     ' / --------------------------------------------------------------------------
  41.     Private Sub LoadImage2DatagridView()
  42.         Dim directory As New IO.DirectoryInfo(strImagePath)
  43.         If directory.Exists Then
  44.             Dim jpgFiles() As IO.FileInfo = directory.GetFiles("*.jpg")
  45.             Dim row As String()
  46.             Dim iArr() As String
  47.             For Each jpgFile As IO.FileInfo In jpgFiles
  48.                 iArr = Split(jpgFile.FullName, "")
  49.                 row = New String() {iArr(UBound(iArr))}
  50.                 dgvData.Rows.Add(row)
  51.                 Using FS As IO.FileStream = File.Open(jpgFile.FullName, FileMode.Open)
  52.                     Dim bitmap As Bitmap = New Bitmap(FS)
  53.                     Dim currentPicture As Image = CType(bitmap, Image)
  54.                     Me.dgvData.Rows(Me.dgvData.Rows.Count - 1).Cells(1).Value = currentPicture
  55.                 End Using
  56.             Next
  57.         End If
  58.         Label2.Text = "Total Images : " & Me.dgvData.Rows.Count
  59.     End Sub

  60.     ' / --------------------------------------------------------------------------
  61.     Private Sub btnSave_Click(sender As System.Object, e As System.EventArgs) Handles btnSave.Click

  62.         If picPreview Is Nothing Then Exit Sub

  63.         '/ Create file name
  64.         Dim sTempFileName As String = strImagePath & Format(Now, "ddMMyy-hhmmss") & ".jpg"
  65.         Dim b As Bitmap = picPreview.Image
  66.         b.Save(sTempFileName, System.Drawing.Imaging.ImageFormat.Jpeg)
  67.         '//
  68.         Dim iArr() As String
  69.         iArr = Split(sTempFileName, "")
  70.         Dim row As String()
  71.         '// Show File name.
  72.         row = New String() {iArr(UBound(iArr))}
  73.         dgvData.Rows.Add(row)
  74.         '// Load Image into DataGridView.
  75.         Using FS As IO.FileStream = File.Open(sTempFileName, FileMode.Open)
  76.             Dim bitmap As Bitmap = New Bitmap(FS)
  77.             Dim currentPicture As Image = CType(bitmap, Image)
  78.             Me.dgvData.Rows(Me.dgvData.Rows.Count - 1).Cells(1).Value = currentPicture
  79.         End Using
  80.         Label2.Text = "Total Images : " & Me.dgvData.Rows.Count
  81.         Me.dgvData.Focus()
  82.         SendKeys.Send("^{HOME}")
  83.         SendKeys.Send("^{DOWN}")
  84.         '// Delay Time. Prevent to save duplicate file name.
  85.         btnSave.Enabled = False
  86.         Threading.Thread.Sleep(1000) ' ms
  87.         btnSave.Enabled = True
  88.     End Sub

  89.     ' / --------------------------------------------------------------------------
  90.     Private Sub dgvData_DoubleClick(sender As Object, e As System.EventArgs) Handles dgvData.DoubleClick
  91.         If Me.dgvData.Rows.Count = 0 Then Return
  92.         frmShowImage.ShowDialog()
  93.     End Sub

  94.     ' / --------------------------------------------------------------------------
  95.     Private Sub InitDataGridView()
  96.         Me.dgvData.Columns.Clear()
  97.         '// Initialize DataGridView Control
  98.         With dgvData
  99.             .AllowUserToAddRows = False
  100.             .AllowUserToDeleteRows = False
  101.             '.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
  102.             '.AutoResizeColumns()
  103.             .AllowUserToResizeColumns = True
  104.             .AllowUserToResizeRows = True
  105.             .SelectionMode = DataGridViewSelectionMode.FullRowSelect
  106.         End With
  107.         dgvData.RowTemplate.Height = 120
  108.         '// Declare columns type.
  109.         '// Add 1th column (Index = 0), Show image file name.
  110.         Dim FName As New DataGridViewTextBoxColumn()
  111.         dgvData.Columns.Add(FName)
  112.         With FName
  113.             .HeaderText = "File Name"
  114.             .ReadOnly = True
  115.             .Visible = True
  116.             .Width = Me.dgvData.Width \ 2 + 65
  117.         End With
  118.         '// Add 2th column (Index = 1), It's Image.
  119.         Dim imgCol As New DataGridViewImageColumn()
  120.         With imgCol
  121.             .HeaderText = "Image"
  122.             .Name = "img"
  123.             .ImageLayout = DataGridViewImageCellLayout.Stretch
  124.             .Width = 120
  125.         End With
  126.         dgvData.Columns.Add(imgCol)
  127.         '//
  128.         Me.dgvData.Focus()
  129.     End Sub

  130.     Private Sub cmbCamera_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles cmbCamera.SelectedIndexChanged
  131.         WebCamMgr.CurrentCamera = WebCamMgr.Cameras.ElementAt(cmbCamera.SelectedIndex)
  132.         '//
  133.         'WebCamMgr.CurrentCamera.CaptureHeight = 480
  134.         'WebCamMgr.CurrentCamera.CaptureWidth = 640
  135.     End Sub

  136.     Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
  137.         picFeed.Image = WebCamMgr.CurrentCamera.GetCurrentImage()
  138.     End Sub

  139.     Private Sub btnCapture_Click(sender As System.Object, e As System.EventArgs) Handles btnCapture.Click
  140.         picPreview.Image = WebCamMgr.CurrentCamera.GetCurrentImage()
  141.         btnSave.Enabled = True
  142.     End Sub

  143.     Private Sub frmCamera_Resize(sender As Object, e As System.EventArgs) Handles Me.Resize
  144.         If Me.dgvData.Columns.Count > 0 Then
  145.             With Me.dgvData.Columns(0)
  146.                 .Width = Me.dgvData.Width \ 2 + 65
  147.             End With
  148.         End If
  149.     End Sub

  150.     Private Sub btnDelete_Click(sender As System.Object, e As System.EventArgs) Handles btnDelete.Click
  151.         If Me.dgvData.Rows.Count = 0 Then Return
  152.         Try
  153.             '// Delete files in folder.
  154.             FileSystem.Kill(strImagePath & dgvData.CurrentRow.Cells(0).Value.ToString)
  155.             '// Delete current row from dgvData
  156.             dgvData.Rows.Remove(dgvData.CurrentRow)
  157.         Catch ex As Exception
  158.             MessageBox.Show(ex.Message)
  159.         End Try
  160.     End Sub

  161. End Class
คัดลอกไปที่คลิปบอร์ด

ฟอร์มของการนำภาพมาแสดงอีกหน้าจอ ...
  1. Public Class frmShowImage

  2.     Private Sub btnExit_Click(sender As System.Object, e As System.EventArgs) Handles btnExit.Click
  3.         Me.Close()
  4.     End Sub

  5.     Private Sub frmShowImage_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
  6.         picData.Image = Image.FromFile(MyPath(Application.StartupPath) & "Images" & frmCamera.dgvData.CurrentRow.Cells(0).Value.ToString)
  7.     End Sub
  8. End Class
คัดลอกไปที่คลิปบอร์ด

โมดูลในการกำหนดตำแหน่งไฟล์พาร์ธต่างๆ ...
  1. Module modFunction
  2.     ' / Get my project path
  3.     ' / Ex.
  4.     ' / AppPath = C:\My Project\bin\debug
  5.     ' / Replace "\bin\debug" with ""
  6.     ' / Return : C:\My Project\
  7.     Public Function MyPath(AppPath As String) As String
  8.         '/ MessageBox.Show(AppPath);
  9.         AppPath = AppPath.ToLower()
  10.         MyPath = AppPath.Replace("\bin\debug", "").Replace("\bin\release", "")
  11.         '// Check the backslash symbol (ASCII Code = 92) on the far right. If not, add one at the end.
  12.         If Microsoft.VisualBasic.Right(MyPath, 1) <> Chr(92) Then MyPath = MyPath & Chr(92)
  13.     End Function

  14. End Module
คัดลอกไปที่คลิปบอร์ด

ดาวน์โหลดโค้ดฉบับเต็ม VB.NET (2010) ได้ที่นี่ ...

ขออภัย! โพสต์นี้มีไฟล์แนบหรือรูปภาพที่ไม่ได้รับอนุญาตให้คุณเข้าถึง

คุณจำเป็นต้อง ลงชื่อเข้าใช้ เพื่อดาวน์โหลดหรือดูไฟล์แนบนี้ คุณยังไม่มีบัญชีใช่ไหม? ลงทะเบียน

x
สิ่งที่ดีกว่าการให้ คือการให้แบบไม่มีที่สิ้นสุด

0

กระทู้

51

โพสต์

232

เครดิต

Full Member

Rank: 3Rank: 3

เครดิต
232
โพสต์ 2019-11-25 16:25:02 | ดูโพสต์ทั้งหมด

ขอบพระคุณอย่างสูงครับผม
ขออภัย! คุณไม่ได้รับสิทธิ์ในการดำเนินการในส่วนนี้ กรุณาเลือกอย่างใดอย่างหนึ่ง ลงชื่อเข้าใช้ | ลงทะเบียน

รายละเอียดเครดิต

ข้อความล้วน|อุปกรณ์พกพา|ประวัติการแบน|G2GNet.com  

GMT+7, 2024-11-27 21:24 , Processed in 0.171869 second(s), 5 queries , File On.

Powered by Discuz! X3.4, Rev.62

Copyright © 2001-2020 Tencent Cloud.

ตอบกระทู้ ขึ้นไปด้านบน ไปที่หน้ารายการกระทู้