擷取Camera影像

短短兩三行,搞定攝影機大麻煩!

在寫Windows程式時,擷取攝影機畫面的方法有很多,古老一點的是VFW,先前提到的OPEN CV也可以加以利用,網路上也有很多人提供不同種類方法的函數庫,但對於初學者而言大多都太困難了,畢竟這是牽扯到硬體的東西,有很多事情顧慮才有辦法順利取得影像,今天就分享一個超級簡單的方法,在此提供以前使用過的函數庫給大家,讓大家可以簡單完成擷取攝影機畫面的任務。

 

1.新增一個【程式碼檔】並命名他,然後複製以下程式碼

	Imports System.Windows.Forms

Public Class Camera

#Region "常數"
    '定義常數
    '開始攝影
    Const WM_CAP_START = CType(&H400, Integer)
    '停止攝影
    Const WM_CAP_STOP = WM_CAP_START + 68
    '抓圖
    Private Const WM_CAP_SAVEDIB As Integer = WM_CAP_START + 25
    '攝影參數
    Const WM_CAP_FILE_SET_CAPTURE_FILEA = WM_CAP_START + 20
    Const WM_CAP_SEQUENCE = WM_CAP_START + 62
    Const WS_CHILD = &H40000000
    Const WS_VISIBLE = &H10000000
    '取得與視訊的聯繫
    Const WM_CAP_DRIVER_CONNECT = WM_CAP_START + 10
    '視窗大小
    Const WM_CAP_SET_SCALE = WM_CAP_START + 53
    '中斷與視訊的聯繫
    Const WM_CAP_DRIVER_DISCONNECT = WM_CAP_START + 11
    Const WM_CAP_SET_PREVIEWRATE = WM_CAP_START + 52
    Const WM_CAP_SET_PREVIEW = WM_CAP_START + 50
#End Region

#Region "宣告"
    '設備
    Private hWndC As IntPtr

    '要顯示畫面的控制項
    Private myPic As PictureBox
    'api
    Private Declare Function capCreateCaptureWindowA Lib "avicap32.dll" (ByVal Name As String, ByVal Style As Integer, ByVal x As Integer, ByVal y As Integer, ByVal Width As Integer, ByVal Height As Integer, ByVal hWndParent As IntPtr, ByVal nID As Integer) As IntPtr
    Private Declare Function SendMessageA Lib "user32" (ByVal hWnd As IntPtr, ByVal msg As Integer, ByVal wParam As Integer, ByVal filePath As String) As Integer
#End Region

#Region "對外方法"

    '建購子-傳入要畫面顯示的控制項
    Public Sub New(ByVal pic As PictureBox)
        myPic = pic
    End Sub

    '開始顯示影像   
    Public Sub Start()
        hWndC = capCreateCaptureWindowA("WebCam", WS_CHILD Or WS_VISIBLE, 0, 0, myPic.Width, myPic.Height, myPic.Handle, 0)

        If hWndC.ToInt32() <> 0 Then
            '取得與視訊的聯繫
            SendMessageA(hWndC, WM_CAP_DRIVER_CONNECT, 0, 0)
            '讓視訊取得的視窗大小與符合要顯示的控制項大小
            SendMessageA(hWndC, WM_CAP_SET_SCALE, 1, 0)
            '---set the preview rate (ms)---
            SendMessageA(hWndC, WM_CAP_SET_PREVIEWRATE, 30, 0)
            '---start previewing the image---
            SendMessageA(hWndC, WM_CAP_SET_PREVIEW, 1, 0)
        End If
    End Sub

    '停止顯示影像
    Public Sub StopWebCam()
        SendMessageA(hWndC, WM_CAP_DRIVER_DISCONNECT, 0, 0)
    End Sub

    '抓圖
    Public Sub SaveImage(ByVal filePath As String)
        SendMessageA(hWndC, WM_CAP_SAVEDIB, 0, filePath)
    End Sub
#End Region

End Class

 

2.視窗中插入【PictureBox】元件,宣告號在觸發事件中插入啟動攝影機的程式碼

 

	Dim WC As Camera

 

 

	WC = New Camera(Me.PictureBox1)
WC.Start()

 

3.關閉攝影機程式碼

	WC.StopWebCam()

 

4.若是要擷取畫面,提供兩個方法:指定位置檔名直接存檔、使用SaveFileDialog

	WC.SaveImage("C:\PeterDotNetVB10092101.bmp")

 

以上就是今天的文章啦,對於想要使用VB做為影像處理程式撰寫的初學者來說已經跨出最重要的第一步了,祝福各位寫程式都順利唷。

 

 

PeterDotNetVB10092101.zip