海康机器人:工业相机SDK二次开发

本文详细介绍了海康机器人的一款M12工业相机,包括其功能特性、订货型号MV-CB060-10UC-S,以及如何通过USB3.0接口进行操作,涉及SDK安装步骤、相机控制和取流示例,使用了OpenCV进行二次开发。
摘要由CSDN通过智能技术生成

介绍

海康机器人官网链接:海康机器人-让机器更智能,让智能更普惠
根据购买设备的型号下载用户说明书

本人使用的是一款USB接口的M12工业相机

功能特性

  • 支持自动或手动调节增益、曝光时间、白平衡、Gamma、LUT校正等

  • 彩色相机植入优异的图像插值算法,更好的颜色还原

  • 通过USB3.0接口供电并传输数据

  • 兼容USB3 Vision协议和GenlCam标准,可接入第三方软件平台

订货型号

MV-CB060-10UC-S

外形尺寸

image.png

 产品参数

型号型号MV-CB060-10UC-S
名称600万像素USB 3.0板级相机,IMX178, 彩色, M12口, V4
性能传感器类型CMOS,卷帘快门
传感器型号IMX178
像元尺寸2.4 µm×2.4 µm
靶面尺寸1/1.8"
分辨率3072 × 2048
最大帧率60.9 fps @ 3072 × 2048 Bayer RG 8
动态范围66 dB
信噪比41.5 dB
增益0 dB ~ 24 dB
曝光时间8 μs ~ 1 sec
快门模式支持自动曝光、手动曝光、一键曝光以及 Global Reset、 Trigger Rolling
黑白/彩色彩色
像素格式Mono 8/10/12
Bayer RG 8/10/10Packed/12/12Packed
YUV422Packed, YUV422_YUYV_Packed
RGB 8,BGR 8
Binning支持1 × 1,2 × 2
下采样支持1 × 1,2 × 2,4 × 4
镜像支持水平镜像、垂直镜像
电气特性数据接口USB 3.0
数字I/O2路双向可配置非隔离IO(Line2,Line5)
供电支持USB 3.0供电
典型功耗1.8 W@5 VDC
结构镜头接口M12-Mount
外形尺寸35 mm × 35 mm × 8.6 mm
重量约 43.5 g
温度工作温度0~50℃,储藏温度-30~70℃
湿度20%~80%RH无冷凝
一般规范软件MVS或者兼容USB3 Vision协议的第三方软件
操作系统Windows XP/7/10/11 32/64bits,Linux 32/64bits
协议/标准USB3 Vision,GenlCam
认证CE,RoHS,KC

软件安装步骤

SDK安装

服务支持”>“下载中心”>“机器视觉”中下载MVS客户端安装包及SDK开发包

Ubuntu18.04系统安装

下载安装压缩包,并解压

查看README如下

说明:

树莓派 armhf架构,jetson 选aarch64,pc 机选x86_64,i386是32位pc。

armhf和aarch64区别就是armhf是armv7架构,如树莓派。aarch64是armv8架构,如jetson nano。

arm-none只有Samples,没有编译好的bin,也没有dpkg包,海康也没有提供源码,所以用不上。
 

实际安装:

方法1:

根据自己的系统选择解压相应的压缩包,打开INSTALL查看安装步骤

方法2:

或者使用deb的方式安装,方便卸载。tar和deb安装都可以

sudo dpkg -i MVS-2.1.2_x86_64_20221208.deb
# 删除用以下命令
sudo dpkg -r mvs

如下图所示:

编译demo1

source ~/.bashrc
cd /opt/MVS/Samples/64/GrabImage
make
./GrabImage

python+opencv:二次开发SDK

项目目录结构

其中MVImport从安装目录中拷贝,如下图所示,GrabImage_opencv.py:自定义代码(基于python+OpenCV实现取流,显示、保存视频等),util用于放入自定义的其他功能性脚本

相机控制步骤

相机控制分成枚举、打开、参数设置、关闭,销毁句柄五个步骤

主代码GrabImage_opencv.py

# -- coding: utf-8 --
"""
2023.03.14
author:alian
function  海康威视摄像头取流
总结海康相机的取流步骤如下:
1 枚举
2 打开
3 参数设置
4 取流
5 关闭
6 销毁句柄
"""
import sys
import threading
import os
import termios
import time
import cv2
import numpy as np
from ctypes import *

sys.path.append("/opt/MVS/Samples/64/Python/MvImport")  # 导入相应SDK的库,实际安装位置绝对路径
from MvImport.MvCameraControl_class import *


def creat_video():  # 创建视频
    time_stamp = time.time()
    video_name = time.strftime("%Y%m%d%H%M%S", time.localtime(time_stamp))
    writer = cv2.VideoWriter("%s.mp4" % video_name, cv2.VideoWriter_fourcc(*"mp4v"), 30, (img_w, img_h))
    return writer,time_stamp


# opencv转换显示
def work_thread_opencv(cam=0, pData=0, nDataSize=0,video_length=None):
    img_w = 1920
    img_h = 1080
    stFrameInfo = MV_FRAME_OUT_INFO_EX()
    memset(byref(stFrameInfo), 0, sizeof(stFrameInfo))
    # 定义视频对象输出,自定义一段时间后新建视频文件,时间间隔设置为video_length
    writer, time_stamp = creat_video()
    while True:
        ret = cam.MV_CC_GetOneFrameTimeout(pData, nDataSize, stFrameInfo, 1000)
        if ret == 0:
            print("get one frame: Width[%d], Height[%d], PixelType[0x%x], nFrameNum[%d]" % (
            stFrameInfo.nWidth, stFrameInfo.nHeight, stFrameInfo.enPixelType, stFrameInfo.nFrameNum))
            print(time.time()-time_stamp)
            # 设置视频采集时长不大于video_length(以小时为单位)
            if video_length!=None and time.time()-time_stamp > video_length*3600:
                writer.release()
                writer, time_stamp = creat_video()
            # 设置相机输出像素格式,用OpenCV显示和保存视频数据
            img = np.asarray(pData)  # 读取帧
            img = img.reshape(stFrameInfo.nHeight, stFrameInfo.nWidth, -1)
            img = cv2.resize(img,(img_w,img_h))
            img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
            import tkinter as tk  # 获取屏幕尺寸,用于随屏幕分辨率自适应显示
            root = tk.Tk()
            width = root.winfo_screenwidth()
            height = root.winfo_screenheight()
            root.destroy()
            cv2.imshow('View', cv2.resize(img, (width, height)))
            writer.write(img)  # 写入视频数据
            # 按Q退出
            if cv2.waitKey(24) & 0xFF == ord('q'):
                break
        else:
            print("no data[0x%x]" % ret)
    cv2.destroyAllWindows()  # 释放所有显示图像窗口
    sys.exit()

def press_any_key_exit():  # 任意按键退出程序
    fd = sys.stdin.fileno()
    old_ttyinfo = termios.tcgetattr(fd)
    new_ttyinfo = old_ttyinfo[:]
    new_ttyinfo[3] &= ~termios.ICANON
    new_ttyinfo[3] &= ~termios.ECHO
    termios.tcsetattr(fd, termios.TCSANOW, new_ttyinfo)
    try:
        os.read(fd, 7)
    except:
        pass
    finally:
        termios.tcsetattr(fd, termios.TCSANOW, old_ttyinfo)

if __name__ == "__main__":
    deviceList = MV_CC_DEVICE_INFO_LIST()
    tlayerType = MV_GIGE_DEVICE | MV_USB_DEVICE
    # 1 枚举设备 | en:Enum device
    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)

    nConnectionNum = 0
    # 2 打开
    # 2.1 创建相机实例 | en:Creat Camera Object
    cam = MvCamera()
    # ch:选择设备并创建句柄| en:Select device and create handle
    stDeviceList = cast(deviceList.pDeviceInfo[int(nConnectionNum)], POINTER(MV_CC_DEVICE_INFO)).contents
    ret = cam.MV_CC_CreateHandle(stDeviceList)
    if ret != 0:
        print("create handle fail! ret[0x%x]" % ret)
        sys.exit()
    # 2.2 打开设备 | en:Open device
    ret = cam.MV_CC_OpenDevice(MV_ACCESS_Exclusive, 0)
    if ret != 0:
        print("open device fail! ret[0x%x]" % ret)
        sys.exit()
    # 3 参数设置
    # 3.1 设置触发模式为off | en:Set trigger mode as off
    ret = cam.MV_CC_SetEnumValue("TriggerMode", MV_TRIGGER_MODE_OFF)
    if ret != 0:
        print("set trigger mode fail! ret[0x%x]" % ret)
        sys.exit()
    
    # 3.2 获取数据包大小 | en:Get payload size
    stParam = MVCC_INTVALUE()
    memset(byref(stParam), 0, sizeof(MVCC_INTVALUE))
    ret = cam.MV_CC_GetIntValue("PayloadSize", stParam)
    if ret != 0:
        print("get payload size fail! ret[0x%x]" % ret)
        sys.exit()
    nPayloadSize = stParam.nCurValue
    # 4 开始取流 | en:Start grab image
    ret = cam.MV_CC_StartGrabbing()
    if ret != 0:
        print("start grabbing fail! ret[0x%x]" % ret)
        sys.exit()
    # 将PayloadSize的uint数据转为可供numpy处理的数据,后面就可以用numpy将其转化为numpy数组格式。
    data_buf = (c_ubyte * nPayloadSize)()

    try:
        hThreadHandle = threading.Thread(target=work_thread_opencv, args=(cam, data_buf, nPayloadSize))
        hThreadHandle.start()
        hThreadHandle.join()
    except:
        print("error: unable to start thread")
    # 5 关闭
    # 5.1 停止取流 | en:Stop grab image
    ret = cam.MV_CC_StopGrabbing()
    if ret != 0:
        print("stop grabbing fail! ret[0x%x]" % ret)
        del data_buf
        sys.exit()

    # 5.2 关闭设备 | Close device
    ret = cam.MV_CC_CloseDevice()
    if ret != 0:
        print("close deivce fail! ret[0x%x]" % ret)
        del data_buf
        sys.exit()

    # 6 销毁句柄 | Destroy handle
    ret = cam.MV_CC_DestroyHandle()
    if ret != 0:
        print("destroy handle fail! ret[0x%x]" % ret)
        del data_buf
        sys.exit()
    del data_buf

  • 24
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 海康相机SDK海康威视公司提供的一套用于二次开发的软件开发工具包。使用海康相机SDK可以让开发者更加方便地集成和应用海康相机的功能。 首先,使用海康相机SDK进行C语言开发,需要先准备相应的开发环境,包括安装相机的驱动程序和SDK。安装完成后,可以通过编写C语言程序来调用SDK提供的接口实现相机的操作和控制。 在二次开发过程中,可以利用SDK提供的函数和接口,实现对相机的图像采集、图像处理、图像保存等功能。通过调用SDK提供的函数,可以实现相机参数的设置、视频流的获取、图像的采集和控制等操作。 此外,海康相机SDK还提供了一些实用的功能函数,比如图像导出、图像处理、图像匹配等,这些功能可以帮助开发者更加高效地处理相机的图像数据。 总之,海康相机SDK二次开发c可以实现对海康相机功能的深入应用和扩展。通过使用SDK提供的接口和函数,开发者可以方便地实现相机的各种操作和控制,实现更加丰富的相机应用。 ### 回答2: 海康相机SDK是一套用于二次开发的工具包,具有丰富的功能和接口,可以用于编写海康相机相关的应用程序。 开发海康相机SDK的C语言接口是一种常用的开发方式。通过使用C语言接口,开发者可以方便地与相机进行通信、控制和数据交换。 在二次开发海康相机SDK时,首先需要搭建开发环境。这包括安装相机SDK,配置开发工具,编译环境等。接下来,可以通过调用SDK提供的接口来实现自己想要的功能。例如,可以调用接口来连接相机、进行图像采集、设置相机参数、进行图像处理等操作。 在编写代码的过程中,需要熟悉SDK提供的接口文档,了解每个接口的功能和参数。同时,根据自己的需求,可以使用不同的接口进行代码编写。在编写代码时,需要注意接口的调用顺序和参数的设置,确保代码的正确性和稳定性。 除了基本的功能接口外,海康相机SDK还提供了其他的扩展功能。例如,可以通过SDK提供的接口来实现图像识别、运动检测、人脸识别等高级功能。 总之,通过使用海康相机SDK进行二次开发,可以快速而有效地开发出符合自己需求的相机应用程序。无论是进行图像采集、监控、人脸识别等应用,海康相机SDK都能提供强大的支持,为开发者节省时间和精力,实现更多的功能。 ### 回答3: 海康相机SDK是一套用于二次开发的工具包,主要针对海康相机进行开发。C语言是一种常用的编程语言,可以用于开发各种应用程序。通过使用海康相机SDK进行C语言二次开发,可以实现对相机的控制、图像采集、图像处理等功能。 首先,我们需要在开发环境中安装海康相机SDK,并配置好相应的开发工具。然后,我们可以使用C语言编写代码来调用SDK提供的接口函数,实现对相机的各种操作。这些接口函数包括相机的初始化、打开、关闭、设置参数、触发采集、获取图像数据等。 在进行二次开发时,我们可以根据具体需求选择适合的接口函数进行调用,实现自己想要的功能。例如,如果我们想要实现图像采集功能,可以使用SDK提供的接口函数来启动相机,设置采集参数,然后通过循环获取图像数据进行处理或保存。 此外,海康相机SDK还提供了一些辅助功能,如图像显示、图像保存、图像处理等。我们可以利用SDK提供的函数来实现这些功能,以满足自己的需求。 总之,通过海康相机SDK二次开发,我们可以使用C语言来控制海康相机,并实现各种功能。这为我们开发相机应用程序提供了丰富的工具和接口,并且可以根据具体需求进行定制。同时,掌握好C语言的基本语法和海康相机SDK的相关知识,对于进行二次开发将会有很大的帮助。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高亚奇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值