也许标题已被使用了很多次,但我在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
答案 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
您将指定要使用的相机。字符串的其余部分是制造商提供的网址。
我希望有人帮助我,我已经花了很多时间在此,我非常骄傲地得到它,如果有人有任何问题,而且我有可能使用,请不要犹豫在这条线上问我或通过直接的消息。
感谢大家!