【问题标题】:Capture still image from webcam (DirectSHowLib, VB.NET)从网络摄像头捕获静止图像(DirectSHowLib、VB.NET)
【发布时间】:2017-07-27 14:59:59
【问题描述】:

我很惭愧,但无论如何我还是会问:从默认尺寸和颜色深度的网络摄像头拍摄照片最直接的方法是什么?

我开始玩 DirectShowLib 但我一无所知...谁能给我指导?

Imports DirectShowLib

Public Class Form1

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        PictureBox1.Image = Nothing

        Dim Cam As DsDevice = DsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice).FirstOrDefault

        If Cam IsNot Nothing Then

            Stop
            ' ... what now?

        End If

    End Sub

End Class

【问题讨论】:

    标签: vb.net webcam directshow video-capture directshow.net


    【解决方案1】:

    DirectShowLib 的samples DxSnap、DxWebCam (C#) 展示了如何从网络摄像头进行捕捉。那里还有 VB.NET DxLogoVB,它做了不同的事情,但如果你还寻找一些 DriectShow.NET + VB.NET 示例代码,它仍然很好。

    DxWebCam:

    一个穷人的网络摄像头程序。此应用程序作为 Win32 服务运行。
    它获取捕获图的输出,将其转换为 JPEG 流 文件,并通过 TCP/IP 将其发送到客户端应用程序。

    DxSnap:

    使用 DirectShow 从捕获的静止引脚拍摄快照 请注意,MS 鼓励您为此使用 WIA,但如果 您想使用 DirectShow 和 C# 进行操作,方法如下。

    请注意,此示例仅适用于输出未压缩的设备 视频为 RBG24。这将包括大多数网络摄像头,但可能是零电视调谐器。

    【讨论】:

    • 我尝试运行 DxSnap,每次运行时计算机都会发出哔哔声,就好像我从 USB 中移除了网络摄像头一样。无法弄清楚出了什么问题,抱歉。
    • 总的来说,我的观点是该库正在尝试使用示例项目。即使它们似乎没有开箱即用,也值得研究它们。代码给出了如何实现捕获相关任务的提示。
    • 是的,我认为你是对的,但是……只有我或其他人觉得需要 200 行代码才能从 .NET 4.5 中的网络摄像头拍摄一张照片很离谱吗?
    【解决方案2】:

    好的,我能做的最好的事情取决于 AForge.ControlsAForge.Video.DirectShow 并且正在使用此代码,我打算对其进行改进(这是一个粗略的划痕 - 但会拍照):

    Public Class Form1
        Private Sub Test() Handles Me.Load
            Dim rf As New RolleiFlex
            PictureBox1.Image = rf.Click
        End Sub
    End Class
    
    Public Class RolleiFlex
    
        Public Sub New()
            Dim vDevices = New AForge.Video.DirectShow.FilterInfoCollection(FilterCategory.VideoInputDevice)
            Devices = vDevices.Cast(Of FilterInfo).Select(
                Function(fi) New Device With {
                .Name = fi.Name,
                .MonikerString = fi.MonikerString}).ToArray
            SelectedDevice = Devices.FirstOrDefault
            vDevices = Nothing
        End Sub
    
        Public Devices As Device()
    
        Public Property SelectedDevice As Device
    
        Public Class Device
            Public Property Name As String
            Public Property MonikerString As String
        End Class
    
        Public Function Click() As Bitmap
            Dim retBmp As Bitmap
            Dim camera As New AForge.Controls.VideoSourcePlayer
            camera.VideoSource = New VideoCaptureDevice(SelectedDevice.MonikerString)
            camera.Start()
            Do
                retBmp = camera.GetCurrentVideoFrame
                If retBmp Is Nothing Then Threading.Thread.Sleep(100)
            Loop While retBmp Is Nothing
            camera.Stop()
            camera.Dispose()
            camera = Nothing
            Return retBmp
        End Function
    
    End Class
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-09
      • 1970-01-01
      • 2013-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多