使用EmguCV

时间:2017-04-06 11:23:33

标签: 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.Structure.Gray,Byte)的值无法在Emgu.CV.Image中转换(Of Emgu.CV.Image(Of Emgu.CV.Structure.Bgr,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摄像机没有通过互联网连接。它通过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来显示它正在观看的内容: / p>

// 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",

我的意思是,我知道我必须把相机的网址放在这个例子的网址中。在我的情况下,我的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

1 个答案:

答案 0 :(得分:0)

最后编辑 - 解决方案: 嗨,大家好!最后,我得到了我的问题的解决方案,所以如果有人能看到这个问题,我会在这里发布。

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

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

我已经阅读了很多关于此的内容,我的结论是这个网址是由制造商指定的,通常是在相机的数据表中指定的,所以它既不是发明的网址,也不是图像存储的文件夹。要查看示例,您可以在下面的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")

对于我做的下一个问题:

  

如果我是对的,我不知道如何保存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,因为您存储的是位图图像(我不确定这一点,所以如果有人可以确认,我会根据需要编辑它)

关于我在这里说的话:

  

但是IP摄像机没有通过互联网连接。它通过LAN连接到我的电脑。我已经配置了我的计算机的IPv4配置,以及我的IP摄像机的设置,使其在没有Internet连接的情况下工作,正如我之前所说,它正在使用自己的程序。

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

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

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

关于下一个问题:

  

要完成,如果有可能,有人可以告诉我这意味着什么

../img/video.sav

上面已经解释过,我解释过这一行是制造商提供的网址的一部分。

关于我在这里问的问题:

  

我去了那里,我看到了他建议看到的项目,我在Samples目录中找到了一个名为Player的项目,它使用这种方法打开摄像机的url来显示它正在观看的内容: / p>

我最后并不需要它,但如果有人拥有更多的相机,那么显示在那里的代码可能很有用,所以使用这个网址:

"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

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

我希望有人帮助我,我已经花了很多时间在此,我非常骄傲地得到它,如果有人有任何问题,而且我有可能使用,请不要犹豫在这条线上问我或通过直接的消息。

感谢大家!