PDA

View Full Version : یک کلاس برای ارتباط با WebCam



CodeMasterX
چهارشنبه 30 خرداد 1386, 01:35 صبح
Public Class iCam
#Region "Api/constants"

Private Const WS_CHILD As Integer = &H40000000
Private Const WS_VISIBLE As Integer = &H10000000
Private Const SWP_NOMOVE As Short = &H2S
Private Const SWP_NOZORDER As Short = &H4S
Private Const WM_USER As Short = &H400S
Private Const WM_CAP_DRIVER_CONNECT As Integer = WM_USER + 10
Private Const WM_CAP_DRIVER_DISCONNECT As Integer = WM_USER + 11
Private Const WM_CAP_SET_VIDEOFORMAT As Integer = WM_USER + 45
Private Const WM_CAP_SET_PREVIEW As Integer = WM_USER + 50
Private Const WM_CAP_SET_PREVIEWRATE As Integer = WM_USER + 52
Private Const WM_CAP_GET_FRAME As Long = 1084
Private Const WM_CAP_COPY As Long = 1054
Private Const WM_CAP_START As Long = WM_USER
Private Const WM_CAP_STOP As Long = (WM_CAP_START + 68)
Private Const WM_CAP_SEQUENCE As Long = (WM_CAP_START + 62)
Private Const WM_CAP_SET_SEQUENCE_SETUP As Long = (WM_CAP_START + 64)
Private Const WM_CAP_FILE_SET_CAPTURE_FILEA As Long = (WM_CAP_START + 20)

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Short, ByVal lParam As String) As Integer
Private 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
Private 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 Declare Function BitBlt Lib "GDI32.DLL" (ByVal hdcDest As IntPtr, ByVal nXDest As Integer, ByVal nYDest As Integer, ByVal nWidth As Integer, ByVal nHeight As Integer, ByVal hdcSrc As IntPtr, ByVal nXSrc As Integer, ByVal nYSrc As Integer, ByVal dwRop As Int32) As Boolean

#End Region

Private iDevice As String
Private hHwnd As Integer
Private lwndC As Integer

Public iRunning As Boolean

Private CamFrameRate As Integer = 15
Private OutputHeight As Integer = 240
Private OutputWidth As Integer = 360

Public Sub resetCam()
'resets the camera after setting change
If iRunning Then
closeCam()
Application.DoEvents()

If setCam() = False Then
MessageBox.Show("Errror Setting/Re-Setting Camera")
End If
End If

End Sub

Public Sub initCam(ByVal parentH As Integer)
'Gets the handle and initiates camera setup
If Me.iRunning = True Then
MessageBox.Show("Camera Is Already Running")
Exit Sub
Else

hHwnd = capCreateCaptureWindowA(iDevice, WS_VISIBLE Or WS_CHILD, 0, 0, OutputWidth, CShort(OutputHeight), parentH, 0)


If setCam() = False Then
MessageBox.Show("Error setting Up Camera")
End If
End If
End Sub

Public Sub setFrameRate(ByVal iRate As Long)
'sets the frame rate of the camera
CamFrameRate = CInt(1000 / iRate)

resetCam()

End Sub

Private Function setCam() As Boolean
'Sets all the camera up
If SendMessage(hHwnd, WM_CAP_DRIVER_CONNECT, CShort(iDevice), CType(0, String)) = 1 Then
SendMessage(hHwnd, WM_CAP_SET_PREVIEWRATE, CShort(CamFrameRate), CType(0, String))
SendMessage(hHwnd, WM_CAP_SET_PREVIEW, 1, CType(0, String))
Me.iRunning = True
Return True
Else
Me.iRunning = False
Return False
End If
End Function

Public Function closeCam() As Boolean
'Closes the camera
If Me.iRunning Then
closeCam = CBool(SendMessage(hHwnd, WM_CAP_DRIVER_DISCONNECT, 0, CType(0, String)))
Me.iRunning = False
End If
End Function

Public Function copyFrame(ByVal src As PictureBox, ByVal rect As RectangleF) As Bitmap
If iRunning Then
Dim srcPic As Graphics = src.CreateGraphics
Dim srcBmp As New Bitmap(src.Width, src.Height, srcPic)
Dim srcMem As Graphics = Graphics.FromImage(srcBmp)


Dim HDC1 As IntPtr = srcPic.GetHdc
Dim HDC2 As IntPtr = srcMem.GetHdc

BitBlt(HDC2, 0, 0, CInt(rect.Width), _
CInt(rect.Height), HDC1, CInt(rect.X), CInt(rect.Y), 13369376)

copyFrame = CType(srcBmp.Clone(), Bitmap)

'Clean Up
srcPic.ReleaseHdc(HDC1)
srcMem.ReleaseHdc(HDC2)
srcPic.Dispose()
srcMem.Dispose()
Else
MessageBox.Show("Camera Is Not Running!")
End If
End Function

Public Function FPS() As Integer
Return CInt(1000 / (CamFrameRate))
End Function

End Class

art2000ir
شنبه 02 تیر 1386, 10:54 صبح
با تشکر
این کلاس برای هر نوع دوربین که قابل اتصال به کامپیوتر باشد قابل احرا می باشد؟

DAMAVAND
شنبه 02 تیر 1386, 12:08 عصر
فرقی نمیکنه از چه دوربینی استفاده میکنید!!
فقط حتما باید قبل از استفاده درایور شو نصب کنید.

CodeMasterX
یک شنبه 03 تیر 1386, 07:43 صبح
درسته، هر Camera Device که روی ویندوز نصب شده باشه با توابع Cap میتونن کنترل بشن که معمولا وب کم ها و دوربین ها فیلم برداری خونگی هست.

mehdi_RM
جمعه 19 بهمن 1386, 13:27 عصر
چطوری میشه تصویر وب کم رو تو شبکه lan برای کامپیوتر دیگه ای به طور زنده فرستاد؟
باید چه چیزائی رو یاد گرفت ؟

arashkey
جمعه 19 بهمن 1386, 19:46 عصر
می شه یکم بیشتر در مورد این کلاس توضیح بدید
و نحوه استفاده از اون رو بگید

arashkey
سه شنبه 23 بهمن 1386, 22:24 عصر
اگه می شه کسی که تونسته از این کلاس استفاده کنه لطفا یک نمونه پروژه از اون قرار بده.
به این شکل برای من غیر قابل استفاده است

arashkey
سه شنبه 07 خرداد 1387, 11:22 صبح
این یک نمونه از استفاده از این کلاس
فقط موضوع مهم اینه که در کلاسی که شما تعریف کردید نباید متغییر iRunning به صورت Public تعریف می شد( چون این متغییر از بیرون کلاس نباید مقدار دهی بشود(این متغییر برای چک کرد متصل شدن وب کم و وصل شدن به آن استفاده می شود)) حال من آنرا به شکل زیر تغییر دادم (در نمونه خودم این کلاس را با اجازه شما تغییر دادم)


Public ReadOnly Property Running() As Boolean
Get
Return iRunning
End Get

End Property


در قسمت ضمیمه نمونه پروژه ای که خودم تونستم ازش استفاده کنم رو می گزارم
در ضمن در تابع Public Sub initCam(ByVal parentH As Integer ورودی یعنی parentH دارد که باید به آن یک هندلر ورودی بدهید .
من هندلر مربوطه را از یک panel دریافت کردم( pnlHandle.Handle) . دوستان در صورت نیاز می توانند، این هندلر را از خود فرم دریافت کند.( me.Handle )

در صورتی که دوستان نمونه بهتری ساختند آنرا نیز ارسال کنند تا من هم استفاده ببرم

mehdi_RM
پنج شنبه 16 خرداد 1387, 21:48 عصر
جناب arashkey
من برنامه شما رو گرفتم ولي تصوير وب كم رو نشون نميده
فقط عكس سياه نشون مي ده
البته دستگاه من دوربين فيلم برداري usb خور هستش
علتش چيه كه نشون نميده؟

arashkey
یک شنبه 26 خرداد 1387, 18:30 عصر
من این رو با وب کم لب تاپم امتحان کردم و تقریبا درست کار کرد (سایزش درست نبود)
ولی دیگه از این کلاس استفاده نمی کنم
چون یه برنامه آماده تو codeproject پیدا کردم که کارم رو راه انداخت
می گردم لینکش رو براتون می گزارم

si6arp
یک شنبه 11 مهر 1389, 09:30 صبح
با سلام
اقا یه همچین کلاسی واسه سیشارپ ندارید ؟