高分请教大家,如何用摄像头采集高分辨率的图片?
我现在用的是个1000万像素的摄像头,从网上找了个摄像头操作的类,但是在图像大小设置中最大只能设置到640*480,我现在至少需要1024*768或更高分辨率的图片,请问该如何操作呢,谢谢指教。程序是C#的,这个类是vb.net,和C#差不多Imports System
Imports System.Runtime.InteropServices
Imports System.Drawing
Imports System.Drawing.Image''' <summary>
''' 摄像头操作类预览
''' </summary>
''' <res></res>
Public Class Cam
Public Const WM_CAP_DLG_VIDEOFORMAT = WM_CAP_START + 41
Public Const WM_CAP_DLG_VIDEOSOURCE = WM_CAP_START + 42
Public Const WM_CAP_DLG_VIDEODISPLAY = WM_CAP_START + 43
Public Const WM_CAP_GET_VIDEOFORMAT = WM_CAP_START + 44
Public Const WM_CAP_SET_VIDEOFORMAT = WM_CAP_START + 45
Public Const WM_CAP_DLG_VIDEOCOMPRESSION = WM_CAP_START + 46 Private Const WM_USER As Integer = &H400
Private Const WS_CHILD As Integer = &H40000000
Private Const WS_VISIBLE As Integer = &H10000000
Private Const WM_CAP_START As Integer = WM_USER Private Const WM_CAP_STOP As Integer = WM_CAP_START + 68
Private Const WM_CAP_DRIVER_CONNECT As Integer = WM_CAP_START + 10
Private Const WM_CAP_DRIVER_DISCONNECT As Integer = WM_CAP_START + 11
Private Const WM_CAP_SAVEDIB As Integer = WM_CAP_START + 25 Private Const WM_CAP_GRAB_FRAME As Integer = WM_CAP_START + 60
Private Const WM_CAP_SEQUENCE As Integer = WM_CAP_START + 62
Private Const WM_CAP_FILE_SET_CAPTURE_FILEA As Integer = WM_CAP_START + 20
Private Const WM_CAP_SEQUENCE_NOFILE As Integer = WM_CAP_START + 63 Private Const WM_CAP_SET_OVERLAY As Integer = WM_CAP_START + 51
Private Const WM_CAP_SET_PREVIEW As Integer = WM_CAP_START + 50
Private Const WM_CAP_SET_CALLBACK_VIDEOSTREAM As Integer = WM_CAP_START + 6
Private Const WM_CAP_SET_CALLBACK_ERROR As Integer = WM_CAP_START + 2 Private Const WM_CAP_SET_CALLBACK_STATUSA As Integer = WM_CAP_START + 3
Private Const WM_CAP_SET_CALLBACK_FRAME As Integer = WM_CAP_START + 5
Private Const WM_CAP_SET_SCALE As Integer = WM_CAP_START + 53
Private Const WM_CAP_SET_PREVIEWRATE As Integer = WM_CAP_START + 52 Private hWndC As IntPtr
Private bStat As Boolean = False Private mControlPtr As IntPtr
Private mWidth As Integer
Private mHeight As Integer
Private mLeft As Integer
Private mTop As Integer Public Declare Function capCreateCaptureWindowA Lib "avicap32.dll" Alias "capCreateCaptureWindowA" _
(ByVal lpszWindowName As Byte(), ByVal dwStyle As Integer, ByVal x As Integer, _
ByVal y As Integer, ByVal nWidth As Integer, ByVal nHeight As Integer, ByVal hWndParent As IntPtr, _
ByVal nID As Integer) As IntPtr Public Declare Function capGetVideoFormat Lib "avicap32.dll" Alias "capGetVideoFormat" _
(ByVal hWnd As IntPtr, ByVal psVideoFormat As IntPtr, ByVal wSize As Integer) As Integer Public Declare Function SendMessage Lib "User32.dll" Alias "SendMessageA" _
(ByVal hWnd As IntPtr, ByVal wMsg As Integer, ByVal wParam As Integer, _
ByVal lParam As Integer) As Boolean ''' <summary>
''' 画面大小
''' </summary>
''' <returns></returns>
''' <res></res>
Function capDlgVideoFormat() As Boolean
capDlgVideoFormat = SendMessage(hWndC, WM_CAP_DLG_VIDEOFORMAT, 0, 0)
End Function ''' <summary>
''' 色彩校正
''' </summary>
''' <returns></returns>
''' <res></res>
Function capDlgVideoSource() As Boolean
capDlgVideoSource = SendMessage(hWndC, WM_CAP_DLG_VIDEOSOURCE, 0, 0)
End Function ''' <summary>
''' 视频显示
''' </summary>
''' <returns></returns>
''' <res></res>
Function capDlgVideoDisplay() As Boolean
capDlgVideoDisplay = SendMessage(hWndC, WM_CAP_DLG_VIDEODISPLAY, 0, 0)
End Function ''' <summary>
''' 视频压缩
''' </summary>
''' <returns></returns>
''' <res></res>
Function capDlgVideoCompression() As Boolean
capDlgVideoCompression = SendMessage(hWndC, WM_CAP_DLG_VIDEOCOMPRESSION, 0, 0)
End Function '''<summary>
'''初始化摄像头
'''</summary>
'''<param name="handle">控件的句柄</param>
'''<param name="left">开始显示的左边距</param>
'''<param name="top">开始显示的上边距</param>
'''<param name="width">要显示的宽度</param>
'''<param name="height">要显示的长度</param>
Public Sub New(ByVal handle As IntPtr, ByVal left As Integer, ByVal top As Integer, ByVal width As Integer, ByVal Height As Integer)
mControlPtr = handle
mWidth = width
mHeight = Height
mLeft = left
mTop = top
End Sub ''' <summary>
''' 开始显示图像
''' </summary>
''' <res></res>
Public Sub Start()
Try
If bStat Then
Return
End If
bStat = True
Dim lpszName(99) As Byte hWndC = capCreateCaptureWindowA(lpszName, WS_CHILD Or WS_VISIBLE, mLeft, mTop, mWidth, mHeight, mControlPtr, 0) If hWndC.ToInt32() <> 0 Then
SendMessage(hWndC, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0, 0)
SendMessage(hWndC, WM_CAP_SET_CALLBACK_ERROR, 0, 0)
SendMessage(hWndC, WM_CAP_SET_CALLBACK_STATUSA, 0, 0)
SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, 0, 0)
SendMessage(hWndC, WM_CAP_SET_SCALE, 1, 0)
SendMessage(hWndC, WM_CAP_SET_PREVIEWRATE, 66, 0)
SendMessage(hWndC, WM_CAP_SET_OVERLAY, 1, 0)
SendMessage(hWndC, WM_CAP_SET_PREVIEW, 1, 0)
End If
Return
Catch ex As Exception
MessageBox.Show(ex.ToString)
End Try
End Sub ''' <summary>
'''停止显示
'''</summary>
Public Sub Stop1()
Try
SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, 0, 0)
bStat = False
Catch ex As Exception
MessageBox.Show(ex.ToString)
End Try
End Sub '''<summary>
'''抓图
'''</summary>
'''<param name="path">要保存bmp文件的路径</param>
Public Sub GrabImage(ByVal path As String)
Try
Dim hBmp As IntPtr = Marshal.StringToHGlobalAnsi(path)
SendMessage(hWndC, WM_CAP_SAVEDIB, 0, hBmp.ToInt64())
Catch ex As Exception
MessageBox.Show(ex.ToString)
End Try
End Sub ''' <summary>
'''录像
'''</summary>
'''<param name="path">要保存avi文件的路径</param>
Public Sub Kinescope(ByVal path As String)
Try
Dim hBmp As IntPtr = Marshal.StringToHGlobalAnsi(path)
SendMessage(hWndC, WM_CAP_FILE_SET_CAPTURE_FILEA, 0, hBmp.ToInt64())
SendMessage(hWndC, WM_CAP_SEQUENCE, 0, 0)
Catch ex As Exception
MessageBox.Show(ex.ToString)
End Try
End Sub ''' <summary>
'''停止录像
'''</summary>
Public Sub StopKinescope()
Try
SendMessage(hWndC, WM_CAP_STOP, 0, 0)
Catch ex As Exception
MessageBox.Show(ex.ToString)
End Try
End Sub
End Class
我现在用的是个1000万像素的摄像头,从网上找了个摄像头操作的类,但是在图像大小设置中最大只能设置到640*480,我现在至少需要1024*768或更高分辨率的图片,请问该如何操作呢,谢谢指教。程序是C#的,这个类是vb.net,和C#差不多Imports System
Imports System.Runtime.InteropServices
Imports System.Drawing
Imports System.Drawing.Image''' <summary>
''' 摄像头操作类预览
''' </summary>
''' <res></res>
Public Class Cam
Public Const WM_CAP_DLG_VIDEOFORMAT = WM_CAP_START + 41
Public Const WM_CAP_DLG_VIDEOSOURCE = WM_CAP_START + 42
Public Const WM_CAP_DLG_VIDEODISPLAY = WM_CAP_START + 43
Public Const WM_CAP_GET_VIDEOFORMAT = WM_CAP_START + 44
Public Const WM_CAP_SET_VIDEOFORMAT = WM_CAP_START + 45
Public Const WM_CAP_DLG_VIDEOCOMPRESSION = WM_CAP_START + 46 Private Const WM_USER As Integer = &H400
Private Const WS_CHILD As Integer = &H40000000
Private Const WS_VISIBLE As Integer = &H10000000
Private Const WM_CAP_START As Integer = WM_USER Private Const WM_CAP_STOP As Integer = WM_CAP_START + 68
Private Const WM_CAP_DRIVER_CONNECT As Integer = WM_CAP_START + 10
Private Const WM_CAP_DRIVER_DISCONNECT As Integer = WM_CAP_START + 11
Private Const WM_CAP_SAVEDIB As Integer = WM_CAP_START + 25 Private Const WM_CAP_GRAB_FRAME As Integer = WM_CAP_START + 60
Private Const WM_CAP_SEQUENCE As Integer = WM_CAP_START + 62
Private Const WM_CAP_FILE_SET_CAPTURE_FILEA As Integer = WM_CAP_START + 20
Private Const WM_CAP_SEQUENCE_NOFILE As Integer = WM_CAP_START + 63 Private Const WM_CAP_SET_OVERLAY As Integer = WM_CAP_START + 51
Private Const WM_CAP_SET_PREVIEW As Integer = WM_CAP_START + 50
Private Const WM_CAP_SET_CALLBACK_VIDEOSTREAM As Integer = WM_CAP_START + 6
Private Const WM_CAP_SET_CALLBACK_ERROR As Integer = WM_CAP_START + 2 Private Const WM_CAP_SET_CALLBACK_STATUSA As Integer = WM_CAP_START + 3
Private Const WM_CAP_SET_CALLBACK_FRAME As Integer = WM_CAP_START + 5
Private Const WM_CAP_SET_SCALE As Integer = WM_CAP_START + 53
Private Const WM_CAP_SET_PREVIEWRATE As Integer = WM_CAP_START + 52 Private hWndC As IntPtr
Private bStat As Boolean = False Private mControlPtr As IntPtr
Private mWidth As Integer
Private mHeight As Integer
Private mLeft As Integer
Private mTop As Integer Public Declare Function capCreateCaptureWindowA Lib "avicap32.dll" Alias "capCreateCaptureWindowA" _
(ByVal lpszWindowName As Byte(), ByVal dwStyle As Integer, ByVal x As Integer, _
ByVal y As Integer, ByVal nWidth As Integer, ByVal nHeight As Integer, ByVal hWndParent As IntPtr, _
ByVal nID As Integer) As IntPtr Public Declare Function capGetVideoFormat Lib "avicap32.dll" Alias "capGetVideoFormat" _
(ByVal hWnd As IntPtr, ByVal psVideoFormat As IntPtr, ByVal wSize As Integer) As Integer Public Declare Function SendMessage Lib "User32.dll" Alias "SendMessageA" _
(ByVal hWnd As IntPtr, ByVal wMsg As Integer, ByVal wParam As Integer, _
ByVal lParam As Integer) As Boolean ''' <summary>
''' 画面大小
''' </summary>
''' <returns></returns>
''' <res></res>
Function capDlgVideoFormat() As Boolean
capDlgVideoFormat = SendMessage(hWndC, WM_CAP_DLG_VIDEOFORMAT, 0, 0)
End Function ''' <summary>
''' 色彩校正
''' </summary>
''' <returns></returns>
''' <res></res>
Function capDlgVideoSource() As Boolean
capDlgVideoSource = SendMessage(hWndC, WM_CAP_DLG_VIDEOSOURCE, 0, 0)
End Function ''' <summary>
''' 视频显示
''' </summary>
''' <returns></returns>
''' <res></res>
Function capDlgVideoDisplay() As Boolean
capDlgVideoDisplay = SendMessage(hWndC, WM_CAP_DLG_VIDEODISPLAY, 0, 0)
End Function ''' <summary>
''' 视频压缩
''' </summary>
''' <returns></returns>
''' <res></res>
Function capDlgVideoCompression() As Boolean
capDlgVideoCompression = SendMessage(hWndC, WM_CAP_DLG_VIDEOCOMPRESSION, 0, 0)
End Function '''<summary>
'''初始化摄像头
'''</summary>
'''<param name="handle">控件的句柄</param>
'''<param name="left">开始显示的左边距</param>
'''<param name="top">开始显示的上边距</param>
'''<param name="width">要显示的宽度</param>
'''<param name="height">要显示的长度</param>
Public Sub New(ByVal handle As IntPtr, ByVal left As Integer, ByVal top As Integer, ByVal width As Integer, ByVal Height As Integer)
mControlPtr = handle
mWidth = width
mHeight = Height
mLeft = left
mTop = top
End Sub ''' <summary>
''' 开始显示图像
''' </summary>
''' <res></res>
Public Sub Start()
Try
If bStat Then
Return
End If
bStat = True
Dim lpszName(99) As Byte hWndC = capCreateCaptureWindowA(lpszName, WS_CHILD Or WS_VISIBLE, mLeft, mTop, mWidth, mHeight, mControlPtr, 0) If hWndC.ToInt32() <> 0 Then
SendMessage(hWndC, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0, 0)
SendMessage(hWndC, WM_CAP_SET_CALLBACK_ERROR, 0, 0)
SendMessage(hWndC, WM_CAP_SET_CALLBACK_STATUSA, 0, 0)
SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, 0, 0)
SendMessage(hWndC, WM_CAP_SET_SCALE, 1, 0)
SendMessage(hWndC, WM_CAP_SET_PREVIEWRATE, 66, 0)
SendMessage(hWndC, WM_CAP_SET_OVERLAY, 1, 0)
SendMessage(hWndC, WM_CAP_SET_PREVIEW, 1, 0)
End If
Return
Catch ex As Exception
MessageBox.Show(ex.ToString)
End Try
End Sub ''' <summary>
'''停止显示
'''</summary>
Public Sub Stop1()
Try
SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, 0, 0)
bStat = False
Catch ex As Exception
MessageBox.Show(ex.ToString)
End Try
End Sub '''<summary>
'''抓图
'''</summary>
'''<param name="path">要保存bmp文件的路径</param>
Public Sub GrabImage(ByVal path As String)
Try
Dim hBmp As IntPtr = Marshal.StringToHGlobalAnsi(path)
SendMessage(hWndC, WM_CAP_SAVEDIB, 0, hBmp.ToInt64())
Catch ex As Exception
MessageBox.Show(ex.ToString)
End Try
End Sub ''' <summary>
'''录像
'''</summary>
'''<param name="path">要保存avi文件的路径</param>
Public Sub Kinescope(ByVal path As String)
Try
Dim hBmp As IntPtr = Marshal.StringToHGlobalAnsi(path)
SendMessage(hWndC, WM_CAP_FILE_SET_CAPTURE_FILEA, 0, hBmp.ToInt64())
SendMessage(hWndC, WM_CAP_SEQUENCE, 0, 0)
Catch ex As Exception
MessageBox.Show(ex.ToString)
End Try
End Sub ''' <summary>
'''停止录像
'''</summary>
Public Sub StopKinescope()
Try
SendMessage(hWndC, WM_CAP_STOP, 0, 0)
Catch ex As Exception
MessageBox.Show(ex.ToString)
End Try
End Sub
End Class
Private Const WS_CHILD As Integer = &H40000000
Private Const WS_VISIBLE As Integer = &H10000000
这三个参数 改一下 就可以了吧,其余的参数 都是以这个位基础的WM_USER = &H400 换成 10进制 就是 1024能不能 改的 大一些 试试
着急啊,有知道的朋友帮忙看看吧