海康工业相机常用参数修改以及使用OpenCV-Python采集图像

  • 一、调节相机参数
    • 1.调节曝光时间
    • 2.修改图像尺寸和像素格式
    • 3.保存参数
  • 二、Python采集成opencv可识别格式,并用opencv显示

最近需要工业摄像头给之前的python项目做采集任务,于是选了海康的工业相机,对于单纯做采集任务而不想深究的人来说看繁杂的开发文档很麻烦,所以把这两天的工作总结一下,希望能对后面用海康相机的新手有帮助。


一、调节相机参数

用海康的MVS就可以调节参数。

1.调节曝光时间

接好相机打开MVS,在右边常用属性里就可以修改曝光时间。我用的这款MV-CE060-10UC相机默认参数下的亮度很低,需要很长的曝光时间,但要注意曝光时间太长会影响帧率。


2.修改图像尺寸和像素格式

在图像处理里就可以改变采集图像的尺寸,如果是彩色摄像头默认的像素格式是Bayer RG8要改为RGB8否则用本例程采集的图像就是灰度图像。



修改像素格式后会有一定的颜色失真,可以去常用属性里打开自动增益和伽马矫正。

3.保存参数

改完参数之后可以打开用户集控制保存参数。

保存配置并启用相同的配置。

二、Python采集成opencv可识别格式,并用opencv显示

要先把官方提供的MvImport文件夹复制到自己的工程文件夹下,彩色相机要修改像素格式不然就会显示灰度图像,

# -- coding: utf-8 --import sys
import numpy as np
import cv2sys.path.append(r".\MvImport")
from MvCameraControl_class import *def Enum_device(tlayerType, deviceList):"""ch:枚举设备 | en:Enum devicenTLayerType [IN] 枚举传输层 ,pstDevList [OUT] 设备列表"""ret = MvCamera.MV_CC_EnumDevices(tlayerType, deviceList)if ret != 0:print("enum devices fail! ret[0x%x]" % ret)sys.exit()if deviceList.nDeviceNum == 0:print("find no device!")sys.exit()print("Find %d devices!" % deviceList.nDeviceNum)for i in range(0, deviceList.nDeviceNum):mvcc_dev_info = cast(deviceList.pDeviceInfo[i], POINTER(MV_CC_DEVICE_INFO)).contentsif mvcc_dev_info.nTLayerType == MV_GIGE_DEVICE:print("\ngige device: [%d]" % i)# 输出设备名字strModeName = ""for per in mvcc_dev_info.SpecialInfo.stGigEInfo.chModelName:strModeName = strModeName + chr(per)print("device model name: %s" % strModeName)# 输出设备IDnip1 = ((mvcc_dev_info.SpecialInfo.stGigEInfo.nCurrentIp & 0xff000000) >> 24)nip2 = ((mvcc_dev_info.SpecialInfo.stGigEInfo.nCurrentIp & 0x00ff0000) >> 16)nip3 = ((mvcc_dev_info.SpecialInfo.stGigEInfo.nCurrentIp & 0x0000ff00) >> 8)nip4 = (mvcc_dev_info.SpecialInfo.stGigEInfo.nCurrentIp & 0x000000ff)print("current ip: %d.%d.%d.%d\n" % (nip1, nip2, nip3, nip4))# 输出USB接口的信息elif mvcc_dev_info.nTLayerType == MV_USB_DEVICE:print("\nu3v device: [%d]" % i)strModeName = ""for per in mvcc_dev_info.SpecialInfo.stUsb3VInfo.chModelName:if per == 0:breakstrModeName = strModeName + chr(per)print("device model name: %s" % strModeName)strSerialNumber = ""for per in mvcc_dev_info.SpecialInfo.stUsb3VInfo.chSerialNumber:if per == 0:breakstrSerialNumber = strSerialNumber + chr(per)print("user serial number: %s" % strSerialNumber)def enable_device(nConnectionNum):"""设备使能:param nConnectionNum: 设备编号:return: 相机, 图像缓存区, 图像数据大小"""# ch:创建相机实例 | en:Creat Camera Objectcam = MvCamera()# ch:选择设备并创建句柄 | en:Select device and create handle# cast(typ, val),这个函数是为了检查val变量是typ类型的,但是这个cast函数不做检查,直接返回valstDeviceList = cast(deviceList.pDeviceInfo[int(nConnectionNum)], POINTER(MV_CC_DEVICE_INFO)).contentsret = cam.MV_CC_CreateHandle(stDeviceList)if ret != 0:print("create handle fail! ret[0x%x]" % ret)sys.exit()# ch:打开设备 | en:Open deviceret = cam.MV_CC_OpenDevice(MV_ACCESS_Exclusive, 0)if ret != 0:print("open device fail! ret[0x%x]" % ret)sys.exit()# ch:探测网络最佳包大小(只对GigE相机有效) | en:Detection network optimal package size(It only works for the GigE camera)if stDeviceList.nTLayerType == MV_GIGE_DEVICE:nPacketSize = cam.MV_CC_GetOptimalPacketSize()if int(nPacketSize) > 0:ret = cam.MV_CC_SetIntValue("GevSCPSPacketSize", nPacketSize)if ret != 0:print("Warning: Set Packet Size fail! ret[0x%x]" % ret)else:print("Warning: Get Packet Size fail! ret[0x%x]" % nPacketSize)# ch:设置触发模式为off | en:Set trigger mode as offret = cam.MV_CC_SetEnumValue("TriggerMode", MV_TRIGGER_MODE_OFF)if ret != 0:print("set trigger mode fail! ret[0x%x]" % ret)sys.exit()# 从这开始,获取图片数据# ch:获取数据包大小 | en:Get payload sizestParam = MVCC_INTVALUE()memset(byref(stParam), 0, sizeof(MVCC_INTVALUE))# MV_CC_GetIntValue,获取Integer属性值,handle [IN] 设备句柄# strKey [IN] 属性键值,如获取宽度信息则为"Width"# pIntValue [IN][OUT] 返回给调用者有关相机属性结构体指针# 得到图片尺寸,这一句很关键# payloadsize,为流通道上的每个图像传输的最大字节数,相机的PayloadSize的典型值是(宽x高x像素大小),此时图像没有附加任何额外信息ret = cam.MV_CC_GetIntValue("PayloadSize", stParam)if ret != 0:print("get payload size fail! ret[0x%x]" % ret)sys.exit()nPayloadSize = stParam.nCurValue# ch:开始取流 | en:Start grab imageret = cam.MV_CC_StartGrabbing()if ret != 0:print("start grabbing fail! ret[0x%x]" % ret)sys.exit()#  返回获取图像缓存区。data_buf = (c_ubyte * nPayloadSize)()#  date_buf前面的转化不用,不然报错,因为转了是浮点型return cam, data_buf, nPayloadSizedef get_image(data_buf, nPayloadSize):"""获取图像:param data_buf::param nPayloadSize::return: 图像"""# 输出帧的信息stFrameInfo = MV_FRAME_OUT_INFO_EX()# void *memset(void *s, int ch, size_t n);# 函数解释:将s中当前位置后面的n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s# memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法# byref(n)返回的相当于C的指针右值&n,本身没有被分配空间# 此处相当于将帧信息全部清空了memset(byref(stFrameInfo), 0, sizeof(stFrameInfo))# 采用超时机制获取一帧图片,SDK内部等待直到有数据时返回,成功返回0ret = cam.MV_CC_GetOneFrameTimeout(data_buf, nPayloadSize, stFrameInfo, 1000)if ret == 0:print("get one frame: Width[%d], Height[%d], nFrameNum[%d]" % (stFrameInfo.nWidth, stFrameInfo.nHeight, stFrameInfo.nFrameNum))else:print("no data[0x%x]" % ret)image = np.asarray(data_buf)  # 将c_ubyte_Array转化成ndarray得到(3686400,)image = image.reshape((stFrameInfo.nHeight, stFrameInfo.nWidth, -1))  # 根据自己分辨率进行转化return imagedef close_device(cam, data_buf):"""关闭设备:param cam::param data_buf:"""# ch:停止取流 | en:Stop grab imageret = cam.MV_CC_StopGrabbing()if ret != 0:print("stop grabbing fail! ret[0x%x]" % ret)del data_bufsys.exit()# ch:关闭设备 | Close deviceret = cam.MV_CC_CloseDevice()if ret != 0:print("close deivce fail! ret[0x%x]" % ret)del data_bufsys.exit()# ch:销毁句柄 | Destroy handleret = cam.MV_CC_DestroyHandle()if ret != 0:print("destroy handle fail! ret[0x%x]" % ret)del data_bufsys.exit()del data_bufif __name__ == "__main__":# 获得设备信息deviceList = MV_CC_DEVICE_INFO_LIST()tlayerType = MV_GIGE_DEVICE | MV_USB_DEVICE# ch: 枚举设备 | en:Enum device# nTLayerType[IN] 枚举传输层 ,pstDevList[OUT] 设备列表Enum_device(tlayerType, deviceList)# 获取相机和图像数据缓存区cam, data_buf, nPayloadSize = enable_device(0)  # 选择第一个设备while True:image = get_image(data_buf, nPayloadSize)image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)  # 默认是BRG,要转化成RGB,颜色才正常cv2.namedWindow("image", cv2.WINDOW_NORMAL)cv2.imshow("image", image)if cv2.waitKey(1) & 0xFF == ord('q'):cv2.destroyAllWindows()break# 关闭设备close_device(cam, data_buf)

参考文章:

链接: 利用python加opencv与海康工业相机交互。(得到供opencv处理的数据).

海康工业相机常用参数修改以及使用OpenCV-Python采集图像相关推荐

  1. Opencv如何打开使用海康工业相机

    文章转载:python语言下使用opencv接口cv2.VideoCapture()接口调用海康机器人工业相机 一.Opencv接口 使用 opencv 的官方接口 VideoCapture() 接口 ...

  2. 海康工业相机SDK + OpenCV实例(4):相机参数设置详解

    海康工业相机SDK + OpenCV实例(4): 相机参数设置详解 文章目录 海康工业相机SDK + OpenCV实例(4): 相机参数设置详解 前言 一.相机参数基本接口 二.自动曝光时间调整亮度 ...

  3. 海康工业相机SDK+OpenCV实例(2):RawDataFormatConvert详解

    海康工业相机SDK+OpenCV实例(2): RawDataFormatConvert详解 文章目录 海康工业相机SDK+OpenCV实例(2): RawDataFormatConvert详解 前言 ...

  4. 海康机器人工业相机常用参数功能设置与获取(持续更新全-C语言)

    海康机器人工业相机常用参数功能设置与获取(C语言) 前言 相机属性树 1.设备控制/DeviceControl 1.1相机序列号获取/DeviceSerialNumber 1.2相机自定义命名设置与获 ...

  5. Python调用海康工业相机:包含相机参数修改、彩色原图显示(不失真)

    [引言] 海康相机作为目前工业检测.视觉定位等领域应用较为广泛的国产品牌相机,其搭配有一套专用视觉软件VM,而在完成具有复杂场景.复杂任务的科研项目时依靠其VM算法平台提供的视觉算法往往无法满足项目要 ...

  6. 海康工业相机LabVIEW二次开发——修改参数、存图

    最近使用LabVIEW对海康机器人的工业相机进行二次开发,没有专门介绍LabVIEW的开发手册,本文就简单的写一写单相机取图显示以及存图的开发步骤. 如果各位是直接使用IMAQdx开发的,可以直接下载 ...

  7. 海康工业相机功能模块-参数保存、加载、批量复制参数

    海康工业相机功能模块-参数保存与加载 前言 相机参数保存的快速方法 相机参数导入导出的操作方法 UserSetLoad 加载相机内部参数 FeatureLoad/FeatureSave FileAcc ...

  8. 海康工业相机参数设置与获取

    海康工业相机参数设置与获取 通用接口介绍 常见相机参数设置获取 Int型参数-图像宽度.图像高度 Enum型参数-图像格式.触发模式设置 float 型参数-曝光.增益设置 string型参数-用户名 ...

  9. python 海康工业相机二次开发 参数获取

    对于调用海康相机的整个流程,下面的这个博客说的很详细了,我一开始也是看的这个 python调用海康工业相机并用opencv显示(整体实现)_J&A~ing的博客-CSDN博客_python调用 ...

最新文章

  1. java 文件 加解密_Java实现文件的加密解密功能示例
  2. Apache Spark源码走读之16 -- spark repl实现详解
  3. 第五届新疆ACM H-虚无的后缀
  4. 转行学python后悔_月薪13k的我为什么要转行学Python?
  5. python监控程序执行_python如何监控PostgreSQL代码运行
  6. 面试题13. 机器人的运动范围
  7. CSDN10大博客栏目火热评选中
  8. 企业如何从大数据系统中获益
  9. php多线程扩展pthreads安装使用,swoole多进程,内置多进程
  10. mysql图形界面navicat的连接
  11. android 墓碑日志,关于清明节扫墓的日记
  12. shine 插件_《SHINE》正式上线|GBZ将你带入重重的紫色迷雾中
  13. [jruby] warbler 配置问题说明
  14. pytorch编写cuda/c++ extention 方法
  15. Android---App Widget(官方文档翻译)
  16. Strings、bytes and runes -- 就要学习 Go 语言
  17. 补交20145226蓝墨云班课 -- Arrays和String单元测试
  18. Manifest Permissions
  19. 【大陆ARS408毫米波雷达】一种利用串口解析雷达数据的方法
  20. Android学习笔记3---仿微信登录界面

热门文章

  1. 计算机地址空间是什么,物理地址空间是什么
  2. web物理引擎p2.js入门手册
  3. python format用法详解
  4. win10 安装office2016包激活(实操)
  5. linux 网络端口连通性命令汇总
  6. cmd 顺序启动服务_NTP时钟服务器部署以及时钟同步设置
  7. 最小二乘法的原理与要解决的问题
  8. golang chanel
  9. 新型冠状病毒肺炎预防宣传PPT模板-优页文档
  10. 架设Wikipedia的本地镜像