mylise Posted May 3, 2013 Posted May 3, 2013 (edited) This is a down to earth DLL to access webcams in Direct Show. The only hick is it lacks access to webcam's adjustments.You can find more information here: http://sol.gfxile.net/escapi/index.htmlHere is a simple script showing how to use it. Have fun!expandcollapse popup;-------------------------------------------------------------------------- ; ESCAPI is a very simple DLL interface to use video capture devices ; (most commonly webcams, but also video in devices and other similar things) ; Get dll from --> [url="http://sol.gfxile.net/escapi/index.html"]http://sol.gfxile.net/escapi/index.html[/url] ; #include <GDIplus.au3> #Include <GUIConstantsEx.au3> ;-------------------------------------------------------------------------- ; Local variables Local $Width = 640 ;Escapi seems to use 640x480 (or lower) as webcam resolution and will Local $Height = 480 ; adjust the image size to $Width by $Height ;-------------------------------------------------------------------------- ; variables required for dshow escapi Local $tagSimpleCapParams = _ "ptr mTargetBuf;" & _ "int mWidth;" & _ "int mHeight;" Local $tSimpleCapParams = DllStructCreate($tagSimpleCapParams) Local $tTargetBuf = DllStructCreate("BYTE[" & $Width*$Height*4 & "]") Global $pTargetBuf = DllStructGetPtr($tTargetBuf) DllStructSetData($tSimpleCapParams, 1, $pTargetBuf) DllStructSetData($tSimpleCapParams, 2, $Width) DllStructSetData($tSimpleCapParams, 3, $Height) Local $pSimpleCapParams = DllStructGetPtr($tSimpleCapParams) Local $device = 0 ;change this number to select dshow device ;--------------------------------------------------------------------------- ;Escapi init local $_escapi_Dll = DllOpen("escapi.dll") $return = DllCall($_escapi_Dll,"int","initCOM") $return = DllCall($_escapi_Dll,"int:cdecl","initCapture", "int", $device, "ptr", $pSimpleCapParams) ;--------------------------------------------------------------------------- ; GUI and GDI init Global $hwnd = GUICreate("EscApi WebCam", $Width, $Height) GUISetState(@SW_SHOW,$hwnd) _GDIPlus_Startup() Global $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hwnd) ;--------------------------------------------------------------------------- ;Get frame DllCall($_escapi_Dll,"none:cdecl","doCapture", "int", 0) Do $return = DllCall($_escapi_Dll,"int:cdecl","isCaptureDone", "int", 0) sleep(100) Until $return[0] = 1 ;--------------------------------------------------------------------------- ;Display frame $hBMP = _WinAPI_CreateBitmap($Width, $Height , 1 , 32 , $pTargetBuf) Local $hImage = _GDIPlus_BitmapCreateFromHBITMAP($hBMP) _GDIPlus_GraphicsDrawImageRect($hGraphics, $hImage, 0, 0, $Width, $Height) _GDIPlus_BitmapDispose($hImage) _WinAPI_DeleteObject($hBMP) While 1 Local $msg = GUIGetMsg() If $msg = $GUI_EVENT_CLOSE Then ExitLoop sleep(50) WEnd ;-------------------------------------------------------------------------- ;Clean up _GDIPlus_GraphicsDispose($hGraphics) _GDIPlus_Shutdown() GUIDelete($hwnd) Edited May 4, 2013 by mylise Werty 1
wakillon Posted May 3, 2013 Posted May 3, 2013 have added #Include <GUIConstantsEx.au3> but there is an other error : ERROR: $hGraphics: undeclared global variable. AutoIt 3.3.14.2 X86 - SciTE 3.6.0 - WIN 8.1 X64 - Other Example Scripts
mylise Posted May 4, 2013 Author Posted May 4, 2013 (edited) Thank you Wakillon for pointing out the errors. Next time I will try the scripts after cleaning them up! I did forget two lines: #include <GUIConstantsEx.au3> Global $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hwnd) P.S. The script above has been edited and fixed. Edited May 4, 2013 by mylise
wakillon Posted May 4, 2013 Posted May 4, 2013 Thanks mylise, works well now ! if you use initCapture at start may be you must use deinitCapture at end ? Do you have examples for countCaptureDevices, getCaptureDeviceName and ESCAPIDLLVersion functions ? AutoIt 3.3.14.2 X86 - SciTE 3.6.0 - WIN 8.1 X64 - Other Example Scripts
mylise Posted May 4, 2013 Author Posted May 4, 2013 Yes you are right, we do need a deinitcapture at the end. I have modified the script and I think it is all there Have fun
mylise Posted May 4, 2013 Author Posted May 4, 2013 (edited) expandcollapse popup;-------------------------------------------------------------------------- ; ESCAPI is a very simple DLL interface to use video capture devices ; (most commonly webcams, but also video in devices and other similar things) ; Get dll from --> [url="http://sol.gfxile.net/escapi/index.html"]http://sol.gfxile.net/escapi/index.html[/url] ; #include <GDIplus.au3> #Include <GUIConstantsEx.au3> ;-------------------------------------------------------------------------- ; Local variables Local $Width = 640 ;Escapi seems to use 640x480 (or lower) as webcam resolution and will Local $Height = 480 ; adjust the image size to $Width by $Height ;-------------------------------------------------------------------------- ; variables required for dshow escapi Local $tagSimpleCapParams = _ "ptr mTargetBuf;" & _ "int mWidth;" & _ "int mHeight;" Local $tSimpleCapParams = DllStructCreate($tagSimpleCapParams) Local $tTargetBuf = DllStructCreate("BYTE[" & $Width*$Height*4 & "]") Global $pTargetBuf = DllStructGetPtr($tTargetBuf) DllStructSetData($tSimpleCapParams, 1, $pTargetBuf) DllStructSetData($tSimpleCapParams, 2, $Width) DllStructSetData($tSimpleCapParams, 3, $Height) Local $pSimpleCapParams = DllStructGetPtr($tSimpleCapParams) Local $device = 0 ;change this number to select dshow device Local $sver = "--ERROR--" Local $tCam = DllStructCreate("CHAR v[20]") ;buffer used to get ESCAPI device name DllStructSetData($tCam, 1, $sver) Local $pCam = DllStructGetPtr($tCam) ;--------------------------------------------------------------------------- ;Escapi init and get Information local $_escapi_Dll = DllOpen("escapi.dll") Local $CamInfo ;ESCAPI version $return = DllCall($_escapi_Dll,"int","ESCAPIDLLVersion") $CamInfo &= "Dll version = " & Hex($return[0],3) & @CRLF $return = DllCall($_escapi_Dll,"int","initCOM") ; get number of available devices $return = DllCall($_escapi_Dll,"int","countCaptureDevices") $CamInfo &= "Number of devices = " & $return[0] & @CRLF ; get selected device name, $device = 0 DllCall($_escapi_Dll,"none:cdecl","getCaptureDeviceName", "uint" , $device, "ptr" , $pCam , "int" , 20) Local $vCam = DllStructGetData($tCam , 1) $CamInfo &= "First device name = " & $vCam & @CRLF MsgBox(0,"ESCAPI info", $CamInfo) $return = DllCall($_escapi_Dll,"int:cdecl","initCapture", "int", $device, "ptr", $pSimpleCapParams) ;--------------------------------------------------------------------------- ; GUI and GDI init Global $hwnd = GUICreate("EscApi WebCam", $Width, $Height) GUISetState(@SW_SHOW,$hwnd) _GDIPlus_Startup() Global $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hwnd) ;--------------------------------------------------------------------------- ;Get frame DllCall($_escapi_Dll,"none:cdecl","doCapture", "int", $device) Do $return = DllCall($_escapi_Dll,"int:cdecl","isCaptureDone", "int", $device) sleep(100) Until $return[0] = 1 ;--------------------------------------------------------------------------- ;Display frame $hBMP = _WinAPI_CreateBitmap($Width, $Height , 1 , 32 , $pTargetBuf) Local $hImage = _GDIPlus_BitmapCreateFromHBITMAP($hBMP) _GDIPlus_GraphicsDrawImageRect($hGraphics, $hImage, 0, 0, $Width, $Height) _GDIPlus_BitmapDispose($hImage) _WinAPI_DeleteObject($hBMP) While 1 Local $msg = GUIGetMsg() If $msg = $GUI_EVENT_CLOSE Then ExitLoop sleep(50) WEnd ;-------------------------------------------------------------------------- ;Clean up $return = DllCall($_escapi_Dll,"none:cdecl","deinitCapture", "int", $device) DllClose($_escapi_Dll) _GDIPlus_GraphicsDispose($hGraphics) _GDIPlus_Shutdown() GUIDelete($hwnd) Edited May 4, 2013 by mylise
wakillon Posted May 4, 2013 Posted May 4, 2013 Thanks for functions examples AutoIt 3.3.14.2 X86 - SciTE 3.6.0 - WIN 8.1 X64 - Other Example Scripts
MadaraUchiha Posted December 12, 2013 Posted December 12, 2013 Yo, sorry for Grave digging the thread, but I am really interessted in this. I have problems with the SnapShot function. I like the snapshotfunction to have the device ID as prameter... but it won't work... why? Here is my code: expandcollapse popup;-------------------------------------------------------------------------- ; ESCAPI is a very simple DLL interface to use video capture devices ; (most commonly webcams, but also video in devices and other similar things) ; Get dll from --> [url="http://sol.gfxile.net/escapi/index.html"]http://sol.gfxile.net/escapi/index.html[/url] ; http://www.autoitscript.com/forum/topic/150536-simple-webcam-access-using-escapi/ #include <GDIplus.au3> #Include <GUIConstantsEx.au3> ; ================================= DIRECTSHOW VARIABLES ================================== Local $Width = 640 ;Escapi seems to use 640x480 (or lower) as webcam resolution and will Local $Height = 480 ; adjust the image size to $Width by $Height Local $tagSimpleCapParams = "ptr mTargetBuf;" & "int mWidth;" & "int mHeight;" Local $tSimpleCapParams = DllStructCreate($tagSimpleCapParams) Local $tTargetBuf = DllStructCreate("BYTE[" & $Width*$Height*4 & "]") Global $pTargetBuf = DllStructGetPtr($tTargetBuf) DllStructSetData($tSimpleCapParams, 1, $pTargetBuf) DllStructSetData($tSimpleCapParams, 2, $Width) DllStructSetData($tSimpleCapParams, 3, $Height) Local $pSimpleCapParams = DllStructGetPtr($tSimpleCapParams) Local $CountCams ; Count connected webcam devices Local $device = 0 ;change this number to select dshow device Local $sver = "--ERROR--" Local $tCam = DllStructCreate("CHAR v[20]") ;buffer used to get ESCAPI device name DllStructSetData($tCam, 1, $sver) Local $pCam = DllStructGetPtr($tCam) local $_escapi_Dll = DllOpen("escapi.dll") Local $CamInfo ;========================================================================================== Global $hwnd = GUICreate("Webcam Manager", $Width, $Height) GUISetState(@SW_SHOW,$hwnd) _GDIPlus_Startup() Global $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hwnd) ;========================================================================================== Func GetDLLVersion() $return = DllCall($_escapi_Dll,"int","initCOM") $return = DllCall($_escapi_Dll,"int","ESCAPIDLLVersion") $CamInfo &= "Dll version = " & Hex($return[0],3) & @CRLF Return $CamInfo EndFunc Func CountWebcams() $return = DllCall($_escapi_Dll,"int","initCOM") $return = DllCall($_escapi_Dll,"int","countCaptureDevices") $CamInfo &= $return[0] & @CRLF Return $CamInfo EndFunc Func GetWebcamName($DevNo) $return = DllCall($_escapi_Dll,"int","initCOM") DllCall($_escapi_Dll,"none:cdecl","getCaptureDeviceName", "uint" , $DevNo, "ptr" , $pCam , "int" , 20) Local $vCam = DllStructGetData($tCam , 1) $CamInfo = $vCam & @CRLF Return $CamInfo EndFunc If CountWebcams() > 0 Then For $DevNo = 0 to CountWebcams() -1 MsgBox(0,'Number ' & $DevNo,GetWebcamName($DevNo)) Next EndIf Snapshot(1) Func Snapshot($Index) DllCall($_escapi_Dll,"none:cdecl","doCapture", "int", $Index) Do $return = DllCall($_escapi_Dll,"int:cdecl","isCaptureDone", "int", $Index) sleep(100) Until $return[0] = 1 EndFunc ;Display frame $hBMP = _WinAPI_CreateBitmap($Width, $Height , 1 , 32 , $pTargetBuf) Local $hImage = _GDIPlus_BitmapCreateFromHBITMAP($hBMP) _GDIPlus_GraphicsDrawImageRect($hGraphics, $hImage, 0, 0, $Width, $Height) _GDIPlus_BitmapDispose($hImage) _WinAPI_DeleteObject($hBMP) While 1 Local $msg = GUIGetMsg() If $msg = $GUI_EVENT_CLOSE Then ExitLoop sleep(50) WEnd ;Clean up $return = DllCall($_escapi_Dll,"none:cdecl","deinitCapture", "int", $device) DllClose($_escapi_Dll) _GDIPlus_GraphicsDispose($hGraphics) _GDIPlus_Shutdown() GUIDelete($hwnd)
Werty Posted March 15, 2014 Posted March 15, 2014 Thanks for this I'm finally getting full 30fps from my webcam no matter the lighting, it updates fast without waiting for auto white balance to settle, so much smoother than avicap. Word of warning though, be sure to keep a SLEEP() in there somethere, as without the webcam becomes very hot, I only noticed as I'm using a webcam module salvaged from an old laptop, and converted it into an external usb cam, so just hold the module in my hand, and it burned hot without a SLEEP(), but with a small Sleep(10) it ran cool again. Some guy's script + some other guy's script = my script!
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now