海康工业相机:MV-CE100-30GC摄像头的调用及图片保存 - python实现

图像采集
主动取流流程

[外链图片转存失败(img-2ArVqlQx-1569375161683)(1569307427855.png)]

回调出流流程图

[外链图片转存失败(img-9wCAjxBR-1569375161684)(1569307456216.png)]

手册上是通过C语言实现的:

海康调用C语言的动态链接库实现的python库

在这里插入图片描述
这些库文件在海康威视的MVS软件安装包里面,找一找就能找到。

本次实现了主动取流

  1. 通过MV_CC_EnumDevices(MV_USB_DEVICE, device_list)搜索存在的USB设备。

  2. 获取设备信息cast(device_list.pDeviceInfo[int(show_device_num)], POINTER(MV_CC_DEVICE_INFO)).contents

  3. 创建句柄cam = MvCamera()

  4. 获得设备的句柄cam.MV_CC_CreateHandle(device_info)

  5. 打开设备cam.MV_CC_OpenDevice(MV_ACCESS_Exclusive, 0)

  6. 获得设备的参数存在MVCC_INTVALUE()这个结构里面,cam.MV_CC_GetIntValue(“PayloadSize”, camera_int_param)

  7. 获取图片的存储大小,还有长度

    image_data_size = (c_ubyte * camera_int_param.nCurValue)()image_data_length = camera_int_param.nCurValue
    
         
         
    • 1
  8. 开始抓流

    grab_ret = cam.MV_CC_StartGrabbing()
    
         
         
    • 1
  9. 图片信息存在下面的结构中

    frame_info = MV_FRAME_OUT_INFO_EX()
    memset(byref(frame_info), 0, sizeof(frame_info))
    
         
         
    • 1
    • 2
  10. 获取流

    cam.MV_CC_GetOneFrameTimeout(image_data_size, image_data_length, frame_info, 1000)
    
         
         
    • 1
  11. 将图片格式转一转

    			   nRGBSize = frame_info.nWidth * frame_info.nHeight
                    convert_param = MV_CC_PIXEL_CONVERT_PARAM()
                    memset(byref(convert_param), 0, sizeof(convert_param))
                    convert_param.nWidth = frame_info.nWidth
                    convert_param.nHeight = frame_info.nHeight
                    convert_param.pSrcData = image_data_size
                    convert_param.nSrcDataLen = frame_info.nFrameLen
                    convert_param.enSrcPixelType = frame_info.enPixelType
                    convert_param.enDstPixelType = frame_info.enPixelType
                    convert_param.pDstBuffer = (c_ubyte * nRGBSize)()
                    convert_param.nDstBufferSize = nRGBSize
                    ret = cam.MV_CC_ConvertPixelType(convert_param)
    
         
         
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
  12. img_buff = (c_ubyte * convert_param.nDstLen)()
    cdll.msvcrt.memcpy(byref(img_buff), convert_param.pDstBuffer, convert_param.nDstLen)
    img = np.array(img_buff, dtype=np.int8)
    Img = img.reshape(1024, 1280)
    Img = cv.flip(Img, -1)
    Img = cv.flip(Img, -1)
    
         
         
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  13. 整体代码如下:

# _*_coding:UTF-8_*_
# 当前系统用户: LISICHENG   
# 当前系统日期:2019/7/29   
# 当前系统时间:13:55   
# 创建文件的IDE名称:PyCharm
import cv2 as cv
import numpy as np
from MvImport.CameraParams_const import *
from MvImport.CameraParams_header import *
from MvImport.MvCameraControl_header import *
from MvImport.MvCameraControl_class import *
from MvImport.MvErrorDefine_const import *
from MvImport.PixelType_const import *
from MvImport.PixelType_header import *

class AccessToImages():

def FindDevices(self):
    device_list = MV_CC_DEVICE_INFO_LIST()
    find_device_ret = MvCamera.MV_CC_EnumDevices(MV_USB_DEVICE, device_list)
    if find_device_ret == 0:
        return device_list
    else:
        return False

def GetImages(self, show_device_num, device_list):
    i = 0
    if show_device_num <= device_list.nDeviceNum:
        device_info = cast(device_list.pDeviceInfo[int(show_device_num)], POINTER(MV_CC_DEVICE_INFO)).contents
        cam = MvCamera()
        handle_ret = cam.MV_CC_CreateHandle(device_info)
        if handle_ret != 0:
            print("创建句柄失败")
        # 打开设备
        open_device = cam.MV_CC_OpenDevice(MV_ACCESS_Exclusive, 0)
        if open_device != 0:
            print('开启失败')

        # 获取相机int型节点值  "PayloadSize" 为当前节点得名称,一帧节点的大小
        camera_int_param = MVCC_INTVALUE()
        int_value_ret = cam.MV_CC_GetIntValue("PayloadSize", camera_int_param)
        if int_value_ret != 0:
            print('获取图像信息失败')
        image_data_size = (c_ubyte * camera_int_param.nCurValue)()
        image_data_length = camera_int_param.nCurValue
        # 开始抓流
        grab_ret = cam.MV_CC_StartGrabbing()
        if grab_ret != 0:
            print('抓起流失败')
        # 获取数据大小

        # 下面将获得每一帧的图像
        while True:
            frame_info = MV_FRAME_OUT_INFO_EX()
            memset(byref(frame_info), 0, sizeof(frame_info))

            frame_ret = cam.MV_CC_GetOneFrameTimeout(image_data_size, image_data_length, frame_info, 1000)
            if frame_ret != 0:
                print('获取帧信息失败')

            nRGBSize = frame_info.nWidth * frame_info.nHeight
            convert_param = MV_CC_PIXEL_CONVERT_PARAM()
            memset(byref(convert_param), 0, sizeof(convert_param))
            convert_param.nWidth = frame_info.nWidth
            convert_param.nHeight = frame_info.nHeight
            convert_param.pSrcData = image_data_size
            convert_param.nSrcDataLen = frame_info.nFrameLen
            convert_param.enSrcPixelType = frame_info.enPixelType
            convert_param.enDstPixelType = frame_info.enPixelType
            convert_param.pDstBuffer = (c_ubyte * nRGBSize)()
            convert_param.nDstBufferSize = nRGBSize
            ret = cam.MV_CC_ConvertPixelType(convert_param)
            if ret != 0:
                print("convert pixel fail! ret[0x%x]" % ret)
                del image_data_size
                sys.exit()
            img_buff = (c_ubyte * convert_param.nDstLen)()
            cdll.msvcrt.memcpy(byref(img_buff), convert_param.pDstBuffer, convert_param.nDstLen)
            img = np.array(img_buff, dtype=np.int8)
            Img = img.reshape(1024, 1280)
            Img = cv.flip(Img, -1)
            Img = cv.flip(Img, -1)
            cv.imshow('img' + str(show_device_num), Img)
            cv.waitKey(25)
 if __name__ == '__main__':

a = AccessToImages()
device_list = a.FindDevices()
if a:
    a.GetImages(0, device_list)
# print(device_list.nDeviceNum)
  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值