2013-08-05 51 views
3

我正在使用戴尔Latitude ST2平板电脑。它在Intel Atom处理器上运行Windows 8 Pro。Windows 8平板电脑上的图像捕获

我试图从正面和背部摄像头都做了同步图像捕捉。我从这里乱搞的代码:http://www.codeproject.com/Articles/18511/Webcam-using-DirectShow-NET

我只能得到后置摄像头,甚则图像采集不起作用。溪流很好。 (不太关心这个比我的双流。)

在平板电脑这两个图像传感器OV8830和OV2720。

此外,有没有更好的API或方法,而不是用DirectShow对我想要实现什么?

谢谢!

编辑:我忘了提,我在VB中工作。我宁愿坚持使用Windows窗体应用程序。

+0

如果标记为C#,您可能会有更好的运气。 –

回答

1

我已经尝试了这个方法只是一天回来在code.For我的图像流小的修改,以及捕获正在great.i将会把我的代码here.you可以有你的修改应用程序工作为你。

Imports System.Runtime.InteropServices 
Imports System.IO 

Public Class FrmCam 
    Const WM_CAP As Short = &H400S 
    Const WM_CAP_DRIVER_CONNECT As Integer = WM_CAP + 10 
    Const WM_CAP_DRIVER_DISCONNECT As Integer = WM_CAP + 11 
    Const WM_CAP_EDIT_COPY As Integer = WM_CAP + 30 
    Public Const WM_CAP_GET_STATUS As Integer = WM_CAP + 54 
    Public Const WM_CAP_DLG_VIDEOFORMAT As Integer = WM_CAP + 41 
    Const WM_CAP_SET_PREVIEW As Integer = WM_CAP + 50 
    Const WM_CAP_SET_PREVIEWRATE As Integer = WM_CAP + 52 
    Const WM_CAP_SET_SCALE As Integer = WM_CAP + 53 
    Const WS_CHILD As Integer = &H40000000 
    Const WS_VISIBLE As Integer = &H10000000 
    Const SWP_NOMOVE As Short = &H2S 
    Const SWP_NOSIZE As Short = 1 
    Const SWP_NOZORDER As Short = &H4S 
    Const HWND_BOTTOM As Short = 1 
    Private DeviceID As Integer = 0 ' Current device ID 
    Private hHwnd As Integer ' Handle to preview window 
    Declare Function SendMessage Lib "user32" Alias "SendMessageA" _ 
     (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, _ 
     ByRef lParam As CAPSTATUS) As Boolean 
    Declare Function SendMessage Lib "user32" Alias "SendMessageA" _ 
     (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Boolean, _ 
     ByRef lParam As Integer) As Boolean 
    Declare Function SendMessage Lib "user32" Alias "SendMessageA" _ 
     (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, _ 
     ByRef lParam As Integer) As Boolean 
    Declare Function SetWindowPos Lib "user32" Alias "SetWindowPos" (ByVal hwnd As Integer, _ 
     ByVal hWndInsertAfter As Integer, ByVal x As Integer, ByVal y As Integer, _ 
     ByVal cx As Integer, ByVal cy As Integer, ByVal wFlags As Integer) As Integer 

    Declare Function DestroyWindow Lib "user32" (ByVal hndw As Integer) As Boolean 
    Structure POINTAPI 
     Dim x As Integer 
     Dim y As Integer 
    End Structure 
    Public Structure CAPSTATUS 
     Dim uiImageWidth As Integer     '// Width of the image 
     Dim uiImageHeight As Integer     '// Height of the image 
     Dim fLiveWindow As Integer      '// Now Previewing video? 
     Dim fOverlayWindow As Integer     '// Now Overlaying video? 
     Dim fScale As Integer       '// Scale image to client? 
     Dim ptScroll As POINTAPI     '// Scroll position 
     Dim fUsingDefaultPalette As Integer   '// Using default driver palette? 
     Dim fAudioHardware As Integer     '// Audio hardware present? 
     Dim fCapFileExists As Integer     '// Does capture file exist? 
     Dim dwCurrentVideoFrame As Integer    '// # of video frames cap'td 
     Dim dwCurrentVideoFramesDropped As Integer  '// # of video frames dropped 
     Dim dwCurrentWaveSamples As Integer   '// # of wave samples cap'td 
     Dim dwCurrentTimeElapsedMS As Integer   '// Elapsed capture duration 
     Dim hPalCurrent As Integer      '// Current palette in use 
     Dim fCapturingNow As Integer     '// Capture in progress? 
     Dim dwReturn As Integer      '// Error value after any operation 
     Dim wNumVideoAllocated As Integer    '// Actual number of video buffers 
     Dim wNumAudioAllocated As Integer    '// Actual number of audio buffers 
    End Structure 
    Declare Function capCreateCaptureWindowA Lib "avicap32.dll" _ 
     (ByVal lpszWindowName As String, ByVal dwStyle As Integer, _ 
     ByVal x As Integer, ByVal y As Integer, ByVal nWidth As Integer, _ 
     ByVal nHeight As Short, ByVal hWndParent As Integer, _ 
     ByVal nID As Integer) As Integer 
    Declare Function capGetDriverDescriptionA Lib "avicap32.dll" (ByVal wDriver As Short, _ 
     ByVal lpszName As String, ByVal cbName As Integer, ByVal lpszVer As String, _ 
     ByVal cbVer As Integer) As Boolean 
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
     LoadDeviceList() 
     If Not Directory.Exists(Application.StartupPath & "\Images") Then 
      Directory.CreateDirectory(Application.StartupPath & "\Images") 
     End If 
     If lstDevices.Items.Count > 0 Then 
      btnStart.Enabled = True 
      lstDevices.SelectedIndex = 0 
      btnStart.Enabled = True 
     Else 
      lstDevices.Items.Add("No Capture Device") 
      btnStart.Enabled = False 
     End If 
     Me.AutoScrollMinSize = New Size(100, 100) 
     btnStop.Enabled = False 
     btnSave.Enabled = False 
     'picCapture.SizeMode = PictureBoxSizeMode.StretchImage 
    End Sub 
    Private Sub LoadDeviceList() 
     Dim strName As String = Space(100) 
     Dim strVer As String = Space(100) 
     Dim bReturn As Boolean 
     Dim x As Short = 0 
     ' 
     ' Load name of all avialable devices into the lstDevices 
     ' 
     Do 
      ' 
      ' Get Driver name and version 
      ' 
      bReturn = capGetDriverDescriptionA(x, strName, 100, strVer, 100) 
      ' 
      ' If there was a device add device name to the list 
      ' 
      If bReturn Then lstDevices.Items.Add(strName.Trim) 
      x += CType(1, Short) 
     Loop Until bReturn = False 
    End Sub 

    Private Sub OpenPreviewWindow() 
     Dim iHeight As Integer = Piccapture.Height 
     Dim iWidth As Integer = Piccapture.Width 
     ' 
     ' Open Preview window in picturebox 
     ' 
     hHwnd = capCreateCaptureWindowA(DeviceID.ToString, WS_VISIBLE Or WS_CHILD, 0, 0, 1280, _ 
      1024, Piccapture.Handle.ToInt32, 0) 
     ' 
     ' Connect to device 
     ' 
     If SendMessage(hHwnd, WM_CAP_DRIVER_CONNECT, DeviceID, 0) Then 
      ' 
      'Set the preview scale 
      ' 
      SendMessage(hHwnd, WM_CAP_SET_SCALE, True, 0) 

      ' 
      'Set the preview rate in milliseconds 
      ' 
      SendMessage(hHwnd, WM_CAP_SET_PREVIEWRATE, 66, 0) 

      ' 
      'Start previewing the image from the camera 
      ' 
      SendMessage(hHwnd, WM_CAP_SET_PREVIEW, True, 0) 

      ' 
      ' Resize window to fit in picturebox 
      ' 
      SetWindowPos(hHwnd, HWND_BOTTOM, 0, 0, Piccapture.Width, Piccapture.Height, _ 
        SWP_NOMOVE Or SWP_NOZORDER) 

      btnSave.Enabled = True 
      btnStop.Enabled = True 
      btnStart.Enabled = False 
     Else 
      ' 
      MsgBox("No Device Connected", MsgBoxStyle.Information, "RStar") 
      ' 
      DestroyWindow(hHwnd) 
      btnSave.Enabled = False 
     End If 
    End Sub 
    Private Sub btnStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStart.Click 
     DeviceID = lstDevices.SelectedIndex 
     'If DeviceID = 0 Then 
     ' MsgBox("No Device Found", MsgBoxStyle.Information, "RStar") 
     ' Exit Sub 
     'End If 
     OpenPreviewWindow() 
     Dim bReturn As Boolean 
     Dim s As CAPSTATUS 
     bReturn = SendMessage(hHwnd, WM_CAP_GET_STATUS, Marshal.SizeOf(s), s) 
     Debug.WriteLine(String.Format("Video Size {0} x {1}", s.uiImageWidth, s.uiImageHeight)) 
    End Sub 
    Private Sub ClosePreviewWindow() 
     ' 
     ' Disconnect from device 
     ' 
     SendMessage(hHwnd, WM_CAP_DRIVER_DISCONNECT, DeviceID, 0) 
     ' 
     ' close window 
     ' 
     DestroyWindow(hHwnd) 
    End Sub 
    Private Sub btnStop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStop.Click 
     ClosePreviewWindow() 
     btnSave.Enabled = False 
     btnStart.Enabled = True 
     btnStop.Enabled = False 

    End Sub 
    Private Sub btnSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSave.Click 
     Dim data As IDataObject 
     Dim bmap As Bitmap 
     Dim filepath As String 

     ' 
     ' Copy image to clipboard 
     ' 
     SendMessage(hHwnd, WM_CAP_EDIT_COPY, 0, 0) 
     ' 
     ' Get image from clipboard and convert it to a bitmap 
     ' 
     data = Clipboard.GetDataObject() 
     If data.GetDataPresent(GetType(System.Drawing.Bitmap)) Then 
      bmap = CType(data.GetData(GetType(System.Drawing.Bitmap)), Bitmap) 
      Piccapture.Image = bmap 
      ClosePreviewWindow() 
      btnSave.Enabled = False 
      btnStop.Enabled = False 
      btnStart.Enabled = True 
      Trace.Assert(Not (bmap Is Nothing)) 
      filepath = Application.StartupPath & "\Images\" & frmChartOfAccounts.txtAcName.Text & frmChartOfAccounts.txtRegNo.Text & ".jpeg" 
      bmap.Save(filepath) 
      frmChartOfAccounts.txtimg.Text = filepath 
     End If 
    End Sub 
    Private Sub Form1_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing 
     If btnStop.Enabled Then 
      ClosePreviewWindow() 
     End If 
    End Sub 
    Private Sub btnInfo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) 
     'SendMessage(hHwnd, WM_CAP_DLG_VIDEOFORMAT, 0&, 0&) 
    End Sub 

    Private Sub cmdExit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdExit.Click 
     Close() 
    End Sub 
    End Class 

希望它能帮助你。

+0

感谢您的回复。但是我无法验证你的答案,因为我不再在那个项目上工作。 (我也无法找到工作解决方案。) – Cameron

相关问题