python 海康威视ipc抓图

在上两篇博客中,我们实现了移动侦测,这篇文章,我们继续进行抓图。

大概流程就是  发现移动侦测-->启动抓图。

1.了解海康威视抓图机制

海康威视的抓图分两种情况,一种是预览抓图,这种一般来说是在预览时,我们进行抓图,如果自己进行解码,可以使用opencv的代码保存帧,非自己解码时,为NET_DVR_CapturePictureBlock相关方法进行抓图。无论何种方式,都需要在执行之前调用NET_DVR_RealPlay_V40方法,在该方法的回调函数中,调用预览抓图。

关于python下的预览、opencv解码、我有时间会单独整理篇博客

因为我们之前的使用的移动侦测并没有进行预览,因此不适用该方式

我们这里使用第二种,设备抓图,该抓图不需要启动预览,直接抓图。

相关海康威视sdk函数NET_DVR_CaptureJPEGPicture以及NET_DVR_CaptureJPEGPicture_NEW

2.NET_DVR_CaptureJPEGPicture

该方法直接保存成本地jpg文件。

在调用该方法的过程中,需要使用一个结构体参数,

NET_DVR_JPEGPARA

我们首先定义该参数

class NET_DVR_JPEGPARA(Structure):
    _fields_ = [
        ("wPicSize", c_uint16),
        ("wPicQuality", c_uint16)
    ]

直接调用该方法即可

    def cap_jpeg(self,userid,filepath):
        jpegpara = NET_DVR_JPEGPARA.NET_DVR_JPEGPARA()
        jpegpara.wPicSize = 5
        jpegpara.wPicQuality = 0
        addr_jpg = byref(jpegpara)
        filepath_bytes = bytes(filepath, "ascii")
        return HKAdapter.hksdk.NET_DVR_CaptureJPEGPicture(userid,c_long(1), addr_jpg, 
                                                            filepath_bytes)

3.NET_DVR_CaptureJPEGPicture_NEW

该方法返回一个jfif的图像编码数组。同样,比较简单,稍稍注意char * 类型参数作为输出时,在ctypes中,应该使用create_string_buffer()类型数据作为参数

    def cap_img_buffer(self,userid):
        jpegpara = NET_DVR_JPEGPARA.NET_DVR_JPEGPARA()
        jpegpara.wPicSize = 5
        jpegpara.wPicQuality = 0
        addr_jpg = byref(jpegpara)

        pbuff = create_string_buffer(1024*1024)
        #point_sJpegPicBuffer = POINTER(sJpegPicBuffer)
        if HKAdapter.hksdk.NET_DVR_CaptureJPEGPicture_NEW(userid,c_long(1), addr_jpg, pbuff,1024*1024,0):
            print("cap success")
            return 0,pbuff
        else:
            print("cap error {}".format(HKAdapter.hksdk.NET_DVR_GetLastError()))
            return HKAdapter.hksdk.NET_DVR_GetLastError(),None

然后在调用抓图的位置,处理pbuff这个jifi图像编码即可

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值