高分请教大家,如何用摄像头采集高分辨率的图片?
我现在用的是个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

解决方案 »

  1.   

    Private Const WM_USER As Integer = &H400
        Private Const WS_CHILD As Integer = &H40000000
        Private Const WS_VISIBLE As Integer = &H10000000
    这三个参数 改一下 就可以了吧,其余的参数 都是以这个位基础的WM_USER = &H400  换成 10进制 就是 1024能不能 改的 大一些 试试
      

  2.   

    谢谢楼上朋友,这样好像不可以,WM_USER 改了摄像头打不开,下面两个参数改了也不起作用。
    着急啊,有知道的朋友帮忙看看吧
      

  3.   

    仔细看下设备的sdk说明书,相信上面有讲的