locked
WebCam Capturing RRS feed

  • Question

  • Hi All

    I need to Capture Webcam Images at regular intervals and save them to disc,i am developing a window based application using Visual studio 2003 and Dotnet Framework 1.1 ,
     i really have no idea of how to do it, i welcome all  with their valuable suggestions

    Thanks
    Thursday, November 16, 2006 9:35 AM

Answers

All replies

  • Hey Zubair,

    You can try using Windows Image Acquisition (WIA). Its an API included in windows which gets images from devices like scanners and cameras. Check out this Coding4Fun article by Scott Hanselman: Look At Me! Windows Image Acquisition. Also check out this CodeProject article: WebCam Fast Image Capture Service using WIA. You can also use DirectX's component called DirectShow.

    Cheers,

    Ashish

     

    Thursday, November 16, 2006 10:22 AM
  • A More independant way is P/Invoke without WIA and DirectShow:

    http://www.windowsformsdatagridhelp.com/default.aspx?ID=458a6b78-eacc-48b9-9036-e5cf2ebb86b6

    This code is in VB and can be converted to C# with a little effort and time! I think this will work for Windows 2000 and above!

    Best Regards,

    Rizwan

    Thursday, November 16, 2006 10:33 AM
  • C# Webcam Capture: This will return a System.Drawing.Image every x milliseconds: http://www.Planet-Source-Code.com/vb/scripts/ShowCode.asp?txtCodeId=1339&lngWId=10

    Regards,

    Ashish

    Thursday, November 16, 2006 11:08 AM
  • Thanks for getting back

    the problem is that the source code i downloaded from the link is not working ,

    suggest !

    zubair
    Thursday, November 16, 2006 1:13 PM
  • i am using the following code snippet, there is problem in saving the image , i have highlighted the portion of the code which is not working, please suggest me how to fix it

    The code follows
    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
        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

        Dim iDevice As Integer = 0  ' Normal device ID
        Dim hHwnd As Integer  ' Handle value to preview window

        ' Declare function from AVI capture DLL.

        Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
            (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, _
             ByVal lParam As Object) As Integer

        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

        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

        ' Connect to the device.

        Private Sub LoadDeviceList()
            Dim strName As String = Space(100)
            Dim strVer As String = Space(100)
            Dim bReturn As Boolean
            Dim x As Integer = 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 += 1
            Loop Until bReturn = False
        End Sub

        ' To display the output from a video capture device, you need to create a capture window.

        Private Sub OpenPreviewWindow()
            Dim iHeight As Integer = picCapture.Height
            Dim iWidth As Integer = picCapture.Width


            ' Open Preview window in picturebox .
            ' Create a child window with capCreateCaptureWindowA so you can display it in a picturebox.

            hHwnd = capCreateCaptureWindowA(iDevice, WS_VISIBLE Or WS_CHILD, 0, 0, 640, _
                480, picCapture.Handle.ToInt32, 0)

            ' Connect to device
            If SendMessage(hHwnd, WM_CAP_DRIVER_CONNECT, iDevice, 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
                ' Error connecting to device close window
                DestroyWindow(hHwnd)
                btnsave.Enabled = False
            End If
        End Sub

        ' Use SendMessage to copy the data to the clipboard Then transfer the image to the picture box.

        Private Sub btnSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnsave.Click
            Dim data As IDataObject
            Dim bmap As Image
            ' 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)), Image)
                picCapture.Image = bmap
                ClosePreviewWindow()
                btnsave.Enabled = False
                btnStop.Enabled = False
                btnstart.Enabled = True
               // sfdImage is not defined any where .........
                If sfdImage.ShowDialog = DialogResult.OK Then
                    bmap.Save(sfdImage.FileName, Imaging.ImageFormat.Bmp)
                End If
            End If
        End Sub

        ' Finally, to close the preview window, disconnect from the device and destroy the preview window.

        Private Sub ClosePreviewWindow()
            ' Disconnect from device
            SendMessage(hHwnd, WM_CAP_DRIVER_DISCONNECT, iDevice, 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()
        End Sub

        Private Sub btnstart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnstart.Click
            LoadDeviceList()
            OpenPreviewWindow()
        End Sub


    i welcome all advices

    thanks

    Thursday, November 16, 2006 1:46 PM
  • Here are links to code that does work...

    http://www.timvw.be/windows-multimedia-video-capture/
    http://www.timvw.be/windows-image-acquisition/ (runs slooow on my computer)


    Thursday, November 16, 2006 1:58 PM
  • "i have highlighted the portion of the code which is not working, please suggest me how to fix it "

    Can you explain what problem you are facing on the specified portion of code. Is it raising any exception or just halts?

    Best Regards,

    Rizwan

    Thursday, November 16, 2006 2:21 PM
  • sdfimage is not defined any where, the applications fails to compile .

    Thursday, November 16, 2006 2:35 PM
  • Create it in the code like this:

    dim msImageObj as new SaveFileDialog

    Best Regards,

     

    Thursday, November 16, 2006 2:48 PM
  • yeh it worked, thanks in deed

    zubair
    Thursday, November 16, 2006 3:14 PM
  • Can anyone help me please. I have applied the same source code. It does work well with 1 webcam connected in my computer but if I have 2 webcam. I can only use 1 at a time. After the second run, program will automatically detect the last used camera for me. You cannot fix which camera you will use. Only if you open the same program while another one is running it will ask you to select Capture source so you can select second camera. 

    Does anyone know how to work around with this displaying Capture source? Do you have any command to list all camera device that connect to your computer and select which one to use by your self?

     

    I am also a newbie but got an assignment on this.  So if you khow how to do it, i would be very please to thank you...

     

    Thursday, June 14, 2007 3:58 AM
  •  i found sample and easy VB.net programming with webcam thus as link below
    http://www.thaiio.com/cgi-bin/html/vhtml.pl?name=.NET&topic=3

    that has easy to understand in programming
    Thursday, July 3, 2008 3:55 AM