vb.net - 使用EmguCV从IP摄像机捕获帧

标签 vb.net visual-studio opencv aforge emgucv

也许标题使用了很多次,但是我在Google上找到的任何答案都为我提供了正确的答案,因此我将在这里解释我的问题:

我有一台IP摄像机,使用它自己的程序可以很好地工作,因此我知道该摄像机可以正常工作。我已将IP摄像机设置为具有静态IP,因此它始终具有相同的IP地址。我成功使用以下方法从网络摄像头拍摄了照片:

Dim image As Image(Of Bgr, Byte) = capturez.QueryFrame()

而且我知道QueryFrame()方法有3种使用方式:
Dim image As Image(Of Bgr, Byte) = capturez.QueryFrame()
Dim image As Image(Of Bgr, Byte) = capturez.QueryFrame(int)
Dim image As Image(Of Bgr, Byte) = capturez.QueryFrame(string)

我正在尝试这样做:
Dim image As Image(Of Bgr, Byte) = capturez.QueryFrame("rtsp://192.168.1.3/img/video.sav")

许多人说这可行,但对我而言不行。我在其他论坛上也看到过:
Dim image As Image(Of Bgr, Byte) = capturez.QueryFrame("rtsp://user:pass@192.168.1.3/img/video.sav")

如果IP摄像机附加了用户名和密码(我的情况),但仍然无法使用。

我得到的错误是:
'不能在Emgu.CV.Image(Of Emgu.CV.Image(Of Emgu.CV.Structure.Bgr,Byte)中转换类型为emgu.CV.Image(Of Emgu.CV.Structure.Gray,Byte)的值)'

我不知道为什么会收到此错误。我认为我得到这个是因为Capture.QueryFrame()正在使用Emgu.CV.Structure.Gray类型进行捕获,并且无法将其转换为另一个捕获,但是我不知道我是否正确。

如果我是对的,我不知道如何保存Capture.QueryFrame()拍摄的图像

如果我做错了,那么我不知道为什么会收到该错误。

我见过其他人使用这样的东西:
Dim image As Image(Of Bgr, Byte) = capturez.QueryFrame("http://192.168.1.3:port/img/video.sav")

但是IP摄像机未通过Internet连接。它通过LAN直接连接到我的计算机。我已经配置了计算机的IPv4配置和IP摄像机的设置,以使其能够在没有Internet连接的情况下工作,并且正如我之前所说,它正在使用自己的程序工作。

希望您掌握了了解我的问题所需的所有详细信息。如果没有,请告诉我,我尝试用另一种方式解释。

继续:我有一个IP摄像机,我想用它拍照(不是视频流,当我决定这样做时,只拍照),我正在使用Emgu 2.4.0,Visual Basic和VS2012。我不知道如何使用QueryFrame()方法

最后,如果可能的话,有人可以告诉我这意味着什么
../img/video.sav

每个人都在字符串中?这是我的计算机必须具有的目录或类似目录吗?

如果有帮助,我将方法放在尝试进行此捕获的位置。在其中,我试图捕获一个帧,并在PictureBox中将图像的白色显示为白色,其余的显示为黑色:
 Private Sub StartButtonTimer_Tick() Handles StartButtonTimer.Tick
    Dim X As Integer
    Dim Y As Integer

    If timeLeft > 0 Then
        timeLeft -= 1
        timeLabel.Text = timeLeft & " seconds"

        'DLE prueba tomar foto después del tiempo especificado - pongo a negro el fondo del picturebox
        PictureBox1.BackColor = Color.Black
    Else

        'DLE prueba tomar foto después del tiempo especificado - hago foto de lo que ve la camara
        Dim img As Image(Of Bgr, Byte) = capturez.QueryFrame()


        For X = 0 To img.Width - 1
            For Y = 0 To img.Height - 1
                Dim pixelColor As Bgr = img(Y, X)

                If (pixelColor.Blue >= 200 And pixelColor.Blue <= 255) And
                   (pixelColor.Green >= 200 And pixelColor.Green <= 255) And
                   (pixelColor.Red >= 200 And pixelColor.Red <= 255) Then
                    pixelColor.Blue = 255
                    pixelColor.Green = 255
                    pixelColor.Red = 255
                    img(Y, X) = pixelColor
                Else
                    pixelColor.Blue = 0
                    pixelColor.Green = 0
                    pixelColor.Red = 0
                    img(Y, X) = pixelColor
                End If
            Next
        Next
        StartButtonTimer.Stop()
        PictureBox1.Image = img.ToBitmap
        startButton.Enabled = True
        SetParameters.Enabled = True
        SetDefaultTimeButton.Enabled = True
        SetForm()
    End If

    'Old frame is overwritten so that the most current image is always ready to retrieve
    Dim image As Image(Of Bgr, Byte) = capturez.QueryFrame()


End Sub

非常感谢您的帮助!我为此感到疯狂!

编辑:
在AForge库和论坛中进行了一些研究,我看到了这个线程,一个人在其中解释了他如何使用该库从IP摄像机拍摄图像。我已经在计算机上安装了用于其他项目的库,但是我不知道可以将这些库用于我的目的。

这是线程:
http://emgu.com/forum/viewtopic.php?t=4199

我去了那里,看到了他建议看的项目,并且在Samples目录中找到了一个名为Player的项目,该项目使用此方法打开摄像机的url以显示正在观看的内容:
// Open MJPEG URL
    private void openMJPEGURLToolStripMenuItem_Click( object sender, EventArgs e )
    {
        URLForm form = new URLForm( );

        form.Description = "Enter URL of an MJPEG video stream:";
        form.URLs = new string[]
            {
                "http://195.243.185.195/axis-cgi/mjpg/video.cgi?camera=4",
                "http://195.243.185.195/axis-cgi/mjpg/video.cgi?camera=3",
            };

        if ( form.ShowDialog( this ) == DialogResult.OK )
        {
            // create video source
            MJPEGStream mjpegSource = new MJPEGStream( form.URL );

            // open it
            OpenVideoSource( mjpegSource );
        }
    }

我正在研究它的工作方式,但我不明白为什么它会以这种方式使用这些行:
"http://195.243.185.195/axis-cgi/mjpg/video.cgi?camera=4",
"http://195.243.185.195/axis-cgi/mjpg/video.cgi?camera=3",

我的意思是,我知道我必须将摄像机的URL放在此示例的URL中。在我的情况下,我的IP摄像机是192.168.1.3,因此它必须如下所示:
"http://192.168.1.3/axis-cgi/mjpg/video.cgi?camera=4"

但是,关于其余部分,我的意思是:
.../axis-cgi/mjpg/video.cgi?camera=4

他们为什么要放这个?我不知道如何在相机中找到此信息。我只有一台通过IP连接的摄像机,所以我该放在哪里?这是我必须创建的目录或类似的目录吗?

编辑:
关于上述内容,在进一步研究之后,我发现其余的url指定了存储图像的路径。在尝试找到相机离开图像的路径后,我无法找到它,也无法找到用户指南,也无法通过互联网进行浏览。我找不到该路径=(。有人对如何找到它有想法吗?

非常感谢!!

我使用的工具:EmguCV 2.4.0,vs2012,IP摄像机:ETROVISION EV6131HW,Visual Basic

最佳答案

最后编辑-解决方案:
嗨,大家好!最终,我得到了所有问题的解决方案,因此,如果有人认为此功能有用,我将其发布在此处。

关于我的第一个问题,我在哪里询问方法QUeryFrame()中的网址:

Dim image As Image(Of Bgr, Byte) = capturez.QueryFrame("rtsp://192.168.1.3/img/video.sav")

我已经阅读了很多有关此内容的结论,我的结论是该URL是由制造商指定的,通常是在摄像机的数据表中指定的,因此它既不是发明的URL,也不是存储图像的文件夹。要查看示例,您可以在下面的网址中看到不同相机使用的某些网址:

Link for url of different cameras

因此,仅在变量的声明内编写摄像机的指定URL,就足以实现与摄像机的连接。我是通过使用Axis相机并检查其数据表来实现的。就我而言,是这个网址:
Dim capturez As Capture
capturez = New Capture("rtsp://192.168.0.90/axis-media/media.amp?videocodec=H264")

对于下一个问题,我做了:

If I am right, I dont know how to save that image taken by the Capture.QueryFrame()



这很容易。 QueryFrame方法返回的图像必须存储在Image类型的变量中,如下所示:
Dim img As Image(Of Bgr, Byte) = capturez.QueryFrame
    PictureBox1.Image = img.ToBitmap()

    'If you want to store the image of the PictureBox
    PictureBox1.Image.Save("f:\picture.bmp")

    'If you want to store the image stored in the variable img
    imageToProcess.Save("f:\picture.bmp")

存储的文件必须具有扩展名.bmp,因为您存储的是位图图像(对此我完全不确定,因此如果有人可以确认,我将在需要时进行编辑)

关于我在这里说的话:

But the IP camera is not connected by internet. It is connected by LAN, directly to my computer. I have configured the IPv4 config of my computer, and the settings of my IP camera, to make it works without an Internet connection, and as I said before, it is working using its own program.



无需将相机或计算机连接到互联网即可实现此目的。当然,您可以使用互联网来完成此操作,但是如果您将相机连接到计算机的同一网络中,或者通过以太网电缆直接连接而无需使用交换机或路由器,则只需更改您的IP地址即可计算机或摄像机的IP地址,以使它们在同一网络中工作(对于计算机,则使用静态IP)。例如:

IP地址PC:192.168.0.2
IP摄像机:192.168.0.3

您可以使用相机制造商提供的软件在其设置中更改相机的IP地址,并通过转到PC的网络和共享中心来更改相机的IP地址。

关于下一个问题:

To finish, if it is possible, could someone tell me what means that


../img/video.sav

上面已经回答了这一点,在这里我解释说这行是制造商提供的URL的一部分。

关于我在这里问的问题:

I went there and I have seen the projects he suggest to see, and I have found in the Samples directory, a project called Player, which use this method to open the url of a camera to display what is it watching:



我终于不需要了,但是如果某人拥有多台摄像机,那里显示的代码可能会很有用,因此使用以下网址:
"http://195.243.185.195/axis-cgi/mjpg/video.cgi?camera=4",
"http://195.243.185.195/axis-cgi/mjpg/video.cgi?camera=3"

在这一部分:
?camera=3

您将指定要使用的相机。字符串的其余部分是制造商提供的URL。

我希望有人帮助我,我为此花了很多时间,我很高兴得到它,因此,如果有人有任何疑问,我愿意,不要犹豫,向我询问此信息或直接发送消息。

谢谢大家!

关于vb.net - 使用EmguCV从IP摄像机捕获帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43253764/

相关文章:

visual-studio - 我如何在 Visual Studio 2012 中以两种方式(dll 和 lib)一起构建项目

c++ - 微软 Visual C++ 2012 : cannot find basic stuff

c++ - 从数组创建或 reshape OpenCV 3 channel 垫

c# - 用户在 GridView.DataBind 调用期间单击会导致 ArgumentException

c++ - CUDA 使用 CMake 在 x86 中卡住构建

vb.net - 用一行代码设置一组控件可见?

c++ - cmake 不适用于 Raspberry Pi 2

python - OpenCV Python-用背景色替换 mask

vb.net - 使用 VB 计算字符串的数学表达式

javascript - 如何使用 "old"(HTML5 之前)HTML 控制 html select 元素中的可见项目?