|
-
Jun 13th, 2017, 07:53 AM
#1
Thread Starter
Junior Member
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
-
Jun 13th, 2017, 08:53 AM
#2
Thread Starter
Junior Member
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
-
Sep 12th, 2017, 01:28 PM
#3
New Member
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
-
Forum Rules
|
Click Here to Expand Forum to Full Width
|