如何从Axis网络摄像机访问或获取BMP中的当前图像



我面临着从IP摄像机访问帧的问题。我使用的是Axis M1013相机,我想执行各种操作,如颜色检测和物体检测。我可以调用相机,但我不知道如何获取当前图像,以便对其执行其他操作。

这是我的代码:

private void Play_btn_Click(object sender, EventArgs e)
{
    //viewIPCamera();
    AMC1.MediaURL = "169.254.103.123//axis-cgi/mjpg/video.cgi";;
    AMC1.MediaUsername = "root";
    AMC1.MediaPassword = "password";
    AMC1.MediaType = "mjpeg";
    AMC1.Play();

那么,我如何从网络摄像头获取当前图像呢?

Axis相机使用ONVIF标准,也许可以尝试类似的方法。

using Ozeki.Media.IPCamera;
using Ozeki.Media.MediaHandlers.Video;
using Ozeki.Media.Video.Controls;
using Ozeki.Media.MediaHandlers;

public partial class Snapshot {
    private SnapshotHandler _snapshotHandler;
    private void CreateSnapShot(string path) {
                var date = DateTime.Now.Year + "y-" + DateTime.Now.Month + "m-" + DateTime.Now.Day + "d-" +
                           DateTime.Now.Hour + "h-" + DateTime.Now.Minute + "m-" + DateTime.Now.Second + "s";
                string currentpath;
                if (String.IsNullOrEmpty(path))
                    currentpath = date + ".jpg";
                else
                    currentpath = path + "\" + date + ".jpg";
                var snapShotImage = _snapshotHandler.TakeSnapshot().ToImage();
                snapShotImage.Save(currentpath, System.Drawing.Imaging.ImageFormat.Jpeg);
    }

}

这个链接可以让你开始:

如何创建ONVIF Ip相机快照

如果您真的需要使用Axis SDK,这可能会有所帮助。

object myBuffer;
int myBufferSize;
AMC1.GetCurrentImage(0, out myBuffer, out myBufferSize) ;
byte[] returningBytes = new byte[myBufferSize];
//Add JPEG header to new byte array
returningBytes[0] =  Convert.ToByte(255);
returningBytes[1] = Convert.ToByte(216);
returningBytes[2] = Convert.ToByte(255);
returningBytes[3] = Convert.ToByte(224);
returningBytes[4] = Convert.ToByte(0);
returningBytes[5] = Convert.ToByte(16);
returningBytes[6] = Convert.ToByte(74);
returningBytes[7] = Convert.ToByte(70);
returningBytes[8] = Convert.ToByte(73);
returningBytes[9] = Convert.ToByte(70);
//Copy actual image into new byte array
Buffer.BlockCopy(myBuffer as Array, 10, returningBytes, 10, myBufferSize - 10);

returningBytes现在是一个合适的字节数组,可以保存到数据库或转换为内存流来填充图片框。请注意,我确实按照OP的要求使用了jpeg而不是bmp。

最新更新