Results 1 to 3 of 3

Thread: Can't access TABLET webcam(s) through code. PLEASE HELP!!

  1. #1

    Thread Starter
    Junior Member
    Join Date
    Feb 2017
    Posts
    23

    Can't access TABLET webcam(s) through code. PLEASE HELP!!

    Hello everyone! I am again begging some help from the experts.

    I am writing an application that captures an image from the back-facing webcam of a tablet, while the user is entering data. The problem is that I cannot access either of the webcams of the tablet through code. Thus far I have tried three different models of new dell tablets, all running Windows 10, and it simply doesn't work.

    If I run the application on a desktop computer with an attached webcam, the webcam video shows up perfectly within the picturebox control, a frame is successfully grabbed and saved, etc. However, when I put the software on a tablet, it is almost as if it cannot talk to the integrated webcams. If I plug in an external webcam to the USB port on the tablet, it works! It just will not work with the integrated webcams.

    The behavior is very specific. There are two webcams, one front-facing, one back-facing. If you run the program on a tablet, when the code initiates the webcam stream Microsoft's little "video source selector" dialog box pops up which asks which webcam you want to use. Once you pick one and either hit apply or OK, the box goes away and nothing appears within the picturebox - it's just empty. In a couple seconds the "video source selector" dialog box pops up again, and it's a repetitive cycle. If I disable one of the two webcams through device manager, the assumption is the ONLY available webcam would be used. Unfortunately, the "video source selector" dialog still pops up, and as expected only has the one remaining webcam listed as available. Still, however, no video appears.

    I have tried several libraries, but settled on two for testing. First, the WebCam_Capture.dll library, and second, the DirectShowLib-2005.dll library. I do not like the DirectShow library - the video quality is very poor compared to the WebCam_Capture library. I have an HD webcam that is on my computer, and DirectShow only has options up to 640x480. WebCam_Capture shows full HD (which I need). Regardless of library selection, the issue lies deeper I fear. Everything works fine on a desktop - and then the video fails on the tablets.

    As a test I have done extensive Google searching for VB.net example programs that make use of webcams (ANYTHING that uses a webcam for any purpose). I have found about 5 full program samples online, complete with libraries, solution, etc., and I have compiled them on my desktop. They all work fine with the USB webcam. I then move them to the tablets, and all have failed with only the integrated webcam(s) available. I have tried compiling them through Visual Studio 2013 (installed on the tablets) and the video fails, and I have tried simply moving the compiled executable over to the tablets, and that fails as well. I plug the USB webcam into the tablet, and the video works fine. For whatever reason, there is something different about the integrated webcams, and I desperately need some help figuring this out. Please!!

    I have stripped down some test code to what is shown below - absolutely nothing out of the ordinary or strange. This code is found within my much larger program, and there are some additional features and tasks performed. This minimal code, however, should simply show the webcam video in picturebox1 on a form. As mentioned, it works fine on a desktop computer with a USB webcam, but fails on a tablet. I am using this fragment of code (and the respective dll library) for all of my testing until I can figure out what is up with the tablets.

    Can anyone point me in a direction to help identify what is going wrong with the tablet webcams? Just to clarify, people may suggest other libraries, etc., but I have tried about 5 libraries in total for webcam processing, and the two that worked "best" in the desktop environment are the two listed at the top of this post - for my application the WebCam_Capture library fuctions far better than the rest. However, NONE of them worked on a tablet. I feel there is a deeper problem here than what library is used but having never worked with video processing in VB.net, I don't have any answers.

    Thank you in advance to anyone who can assist!!!


    Code:
    Option Explicit On
    Imports WebCam_Capture
    
    Public Class Form1
        WithEvents MyWebcam As WebCamCapture
    
        Private Sub MyWebcam_ImageCaptured(source As Object, e As WebcamEventArgs) Handles MyWebcam.ImageCaptured
            PictureBox1.Image = e.WebCamImage
        End Sub
    
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            Me.WindowState = FormWindowState.Maximized  'Runs in a maximized window
            StartWebcam()
        End Sub
    
        Private Sub Button1_Click_1(sender As Object, e As EventArgs) Handles Button1.Click
            'Stop button to stop webcam and return to previous form
    	StopWebcam()
            Form3.Show()
            Me.Close()
        End Sub
    
        Private Sub StartWebcam()
            Try
                StopWebcam()
                MyWebcam = New WebCamCapture
                MyWebcam.Start(0)
            Catch ex As Exception
            End Try
        End Sub
    
        Private Sub StopWebcam()
            Try
                MyWebcam.Stop()
                MyWebcam.Dispose()
            Catch ex As Exception
            End Try
        End Sub
    
    End Class

  2. #2

    Thread Starter
    Junior Member
    Join Date
    Feb 2017
    Posts
    23

    Re: Can't access TABLET webcam(s) through code. PLEASE HELP!!

    Just as an addition, I just located the following code from https://stackoverflow.com/questions/18061055/image-capture-on-windows-8-tablet which doesn't use ANY external webcam libraries, and I just tested it. The code is found below. When I selected either of the two integrated webcams on the tablet, there was a blank black box followed by the popup error "Device not found". If I plugged in the external USB webcam, it worked flawlessly. I am baffled why I cannot make use of any integrated webcam on any tablet that I'm testing on.

    Code:
    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

  3. #3
    New Member
    Join Date
    Sep 2017
    Posts
    1

    Re: Can't access TABLET webcam(s) through code. PLEASE HELP!!

    I have just hit the same problem. Did anyone offer a solution?

Tags for this Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  



Click Here to Expand Forum to Full Width