海康工业摄像头调用(linux基于python和opencv)
1.下载官网客户端(其中包含SDK)
官方网站
海康机器人-机器视觉-下载中心
安装deb文件
sudo dpkg -i deb文件名
2.运行客户端
cd /opt/MVS/bin/
./MVS.sh
如果连不上,看看是不是usb3.0的接口
3.调整参数
用客户端调整的参数,会默认的存在于配置中,每次打开都是一样,并且用其他代码调用时候同样也采用这种配置。
如果刚开始显示的非常黑,自动曝光和自动增益改成连续。
尤其注意像素格式,在使用opencv时候图像转换需要用到。
4.实际代码
该代码借鉴于
使用PYQT5打开海康威视工业相机并获取图像进行显示_暂未成功人士!的博客-CSDN博客_pyqt5 海康威视
import cv2
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import pyqtSignal
from PyQt5.QtGui import *
import numpy as np
import matplotlib.pyplot as plt
# from MvImport.MvCameraControl_header import MV_CC_DEVICE_INFO_LIST
from open_camera import Ui_MainWindow # 导入创建的GUI类
import sys
import threading
# import msvcrt
from ctypes import *
from PyQt5.Qt import *
from PIL import Image
# ImageTksys.path.append("../MvImport")
from MvCameraControl_class import *
import time
import osclass mywindow(QtWidgets.QMainWindow, Ui_MainWindow):sendAddDeviceName = pyqtSignal() # 定义一个添加设备列表的信号。deviceList = MV_CC_DEVICE_INFO_LIST()tlayerType = MV_GIGE_DEVICE | MV_USB_DEVICEg_bExit = Falsecamera_information = False #获取相机标志opencamera_flay = False #打开相机标志# ch:创建相机实例 | en:Creat Camera Objectcam = MvCamera()def __init__(self):super(mywindow, self).__init__()self.setupUi(self)# self.connect_and_emit_sendAddDeviceName()self.init()self.label.setScaledContents(True) # 图片自适应self.label_2.setScaledContents(True) # 图片自适应def init(self):#获取相机相信self.pushButton.clicked.connect(self.get_camera_information)# 打开摄像头self.pushButton_2.clicked.connect(self.openCamera)# 拍照self.pushButton_3.clicked.connect(self.taking_pictures)# 关闭摄像头self.pushButton_4.clicked.connect(self.closeCamera)# Connect the sendAddDeviceName signal to a slot.# self.sendAddDeviceName.connect(self.camera_information)# Emit the signal.# self.sendAddDeviceName.emit()# 获得所有相机的列表存入cmbSelectDevice中def get_camera_information(self):'''选择所有能用的相机到列表中,gige相机需要配合 sdk 得到。'''# 得到相机列表# tlayerType = MV_GIGE_DEVICE | MV_USB_DEVICE# ch:枚举设备 | en:Enum deviceret = MvCamera.MV_CC_EnumDevices(self.tlayerType, self.deviceList)if ret != 0:print("enum devices fail! ret[0x%x]" % ret)# QMessageBox.critical(self, '错误', '读取设备驱动失败!')# sys.exit()if self.deviceList.nDeviceNum == 0:QMessageBox.critical(self, "错误", "没有发现设备 ! ")# print("find no device!")# sys.exit()else:QMessageBox.information(self, "提示", "发现了 %d 个设备 !" % self.deviceList.nDeviceNum)# print("Find %d devices!" % self.deviceList.nDeviceNum)if self.deviceList.nDeviceNum == 0:return Nonefor i in range(0, self.deviceList.nDeviceNum):mvcc_dev_info = cast(self.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)self.camera_information = True# 打开摄像头。def openCamera(self, camid=0):if self.camera_information == True:self.g_bExit = False# ch:选择设备并创建句柄 | en:Select device and create handlestDeviceList = cast(self.deviceList.pDeviceInfo[int(0)], POINTER(MV_CC_DEVICE_INFO)).contentsret = self.cam.MV_CC_CreateHandle(stDeviceList)if ret != 0:# print("create handle fail! ret[0x%x]" % ret)QMessageBox.critical(self, "错误", "创建句柄失败 ! ret[0x%x]" % ret)# sys.exit()# ch:打开设备 | en:Open deviceret = self.cam.MV_CC_OpenDevice(MV_ACCESS_Exclusive, 0)if ret != 0:# print("open device fail! ret[0x%x]" % ret)QMessageBox.critical(self, "错误", "打开设备失败 ! 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 = self.cam.MV_CC_GetOptimalPacketSize()if int(nPacketSize) > 0:ret = self.cam.MV_CC_SetIntValue("GevSCPSPacketSize", nPacketSize)if ret != 0:# print("Warning: Set Packet Size fail! ret[0x%x]" % ret)QMessageBox.warning(self, "警告", "报文大小设置失败 ! ret[0x%x]" % ret)else:# print("Warning: Get Packet Size fail! ret[0x%x]" % nPacketSize)QMessageBox.warning(self, "警告", "报文大小获取失败 ! ret[0x%x]" % nPacketSize)# ch:设置触发模式为off | en:Set trigger mode as offret = self.cam.MV_CC_SetEnumValue("TriggerMode", MV_TRIGGER_MODE_OFF)if ret != 0:# print("set trigger mode fail! ret[0x%x]" % ret)QMessageBox.critical(self, "错误", "设置触发模式失败 ! ret[0x%x]" % ret)# sys.exit()# ch:获取数据包大小 | en:Get payload sizestParam = MVCC_INTVALUE()memset(byref(stParam), 0, sizeof(MVCC_INTVALUE))ret = self.cam.MV_CC_GetIntValue("PayloadSize", stParam)if ret != 0:# print("get payload size fail! ret[0x%x]" % ret)QMessageBox.critical(self, "错误", "获取有效负载大小失败 ! ret[0x%x]" % ret)# sys.exit()nPayloadSize = stParam.nCurValue# ch:开始取流 | en:Start grab imageret = self.cam.MV_CC_StartGrabbing()if ret != 0:# print("start grabbing fail! ret[0x%x]" % ret)QMessageBox.critical(self, "错误", "开始抓取图像失败 ! ret[0x%x]" % ret)# sys.exit()data_buf = (c_ubyte * nPayloadSize)()self.opencamera_flay = Truetry:hThreadHandle = threading.Thread(target=self.work_thread, args=(self.cam, data_buf, nPayloadSize))hThreadHandle.start()except:# print("error: unable to start thread")QMessageBox.critical(self, "错误", "无法启动线程 ! ")else:QMessageBox.critical(self, '错误', '获取相机信息失败!')return None# 关闭相机def closeCamera(self):if self.opencamera_flay == True:self.g_bExit = True# ch:停止取流 | en:Stop grab imageret = self.cam.MV_CC_StopGrabbing()if ret != 0:# print("stop grabbing fail! ret[0x%x]" % ret)QMessageBox.critical(self, "错误", "停止抓取图像失败 ! ret[0x%x]" % ret)# sys.exit()# ch:关闭设备 | Close deviceret = self.cam.MV_CC_CloseDevice()if ret != 0:# print("close deivce fail! ret[0x%x]" % ret)QMessageBox.critical(self, "错误", "停止设备失败 ! ret[0x%x]" % ret)# ch:销毁句柄 | Destroy handleret = self.cam.MV_CC_DestroyHandle()if ret != 0:# print("destroy handle fail! ret[0x%x]" % ret)QMessageBox.critical(self, "错误", "销毁处理失败 ! ret[0x%x]" % ret)self.label.clear() # 清除label组件上的图片self.label_2.clear() # 清除label组件上的图片self.label.setText("摄像头")self.label_2.setText("显示图片")self.camera_information = Falseself.opencamera_flay = Falseelse:QMessageBox.critical(self, '错误', '未打开摄像机!')return Nonedef work_thread(self, cam=0, pData=0, nDataSize=0):stFrameInfo = MV_FRAME_OUT_INFO_EX()memset(byref(stFrameInfo), 0, sizeof(stFrameInfo))while True:ret = cam.MV_CC_GetOneFrameTimeout(pData, nDataSize, stFrameInfo, 1000)if ret == 0:# pData = (c_ubyte * stFrameInfo.nWidth * stFrameInfo.nHeight* 2)()# # memmove(byref(pData), stFrameInfo.pBufAddr, stFrameInfo.stFameInfo.nWidth * stFrameInfo.nHeight*2)# data = np.frombuffer(pData, count=int(stFrameInfo.nWidth * stFrameInfo.nHeight*2),dtype=np.uint8)# image = data.reshape(stFrameInfo.nHeight ,stFrameInfo.nWidth,2)# image = cv2.cvtColor(image, cv2.COLOR_YUV2RGB_Y422)# self.image_show = QImage(image.data, stFrameInfo.nWidth, stFrameInfo.nHeight, QImage.Format_RGB888)image = np.asarray(pData) # 将c_ubyte_Array转化成ndarray得到(3686400,)# print(image.shape)image= image.reshape((2048,3072,3)) # 根据自己分辨率进行转化# image = image[0]# image = np.asarray(pData).reshape((stFrameInfo.nHeight, stFrameInfo.nWidth))# image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # 这一步获取到的颜色不对,因为默认是BRG,要转化成RGB,颜色才正常#image = cv2.cvtColor(image, cv2.COLOR_BAYER_GB2BGR) # Bayer格式(raw data)向RGB或BGR颜色空间的转换image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR) # print(image.shape)# pyrD1 = cv2.pyrDown(image) # 向下取样# pyrD2 = cv2.pyrDown(pyrD1) # 向下取样image_height, image_width, image_depth = image.shape # 读取图像高宽深度# self.image_show = QImage(image.data, image_width, image_height, image_width * image_depth,# QImage.Format_RGB888)self.image_show = QImage(image.data, image_width, image_height, image_width * image_depth,QImage.Format_RGB888) self.label.setPixmap(QPixmap.fromImage(self.image_show))if self.g_bExit == True:del pDatabreak#拍照def taking_pictures(self):if self.opencamera_flay == True:FName = fr"images/cap{time.strftime('%Y%m%d%H%M%S', time.localtime())}"print(FName)self.label_2.setPixmap(QtGui.QPixmap.fromImage(self.image_show))# self.showImage.save(FName + ".jpg", "JPG", 100)self.image_show.save('./1.bmp')else:QMessageBox.critical(self, '错误', '摄像机未打开!')return None#重写关闭函数def closeEvent(self, event):reply = QMessageBox.question(self,'提示',"确认退出吗?",QMessageBox.Yes | QMessageBox.No,QMessageBox.No)if reply == QMessageBox.Yes:event.accept()#用过sys.exit(0)和sys.exit(app.exec_()),但没起效果os._exit(0)else:event.ignore()if __name__ == '__main__':from PyQt5 import QtCoreQtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling) # 自适应分辨率app = QtWidgets.QApplication(sys.argv)window = mywindow()window.show()sys.exit(app.exec_())
界面显示,看上面链接里原作者的界面代码 。
我采用的是RGB格式的工业摄像头,其他格式的图像转化得再调整。
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
8月3日补充
问题:遇到每次重新通电,摄像头都得重新配置参数
解决:
1.先去软件客户端配置可以正常显示的配置例如连续曝光,连续白平衡等 这时候这种配置会默认保存在摄像头里
3.找到下面的案例文档,其中有个代码可以生成目前摄像头的参数。然后在自己的代码里导入
上面的cam.MV_CC_FeatureLoad()语句加入到自己代码中的 那个位置。
这样就不需要每次打开软件配置了
///
8月4日更新
询问厂家后,可以看到下面网址中的三种方式(亲测第一种只在软件中设置好了,重启也不需要配置)
海康工业相机功能模块-参数保存、加载、批量复制参数_青山笑我依旧在的博客-CSDN博客_海康相机保存配置
问题:使用YUV 422 怎么配置代码![](/assets/blank.gif)
如果要使用cv2.COLOR_YUV2RGB_Y422
就在软件中使用YUV 422 packed 一定要看好 不是 有括号那个。
然后代码改变
image= image.reshape(2048,3072,2) image = cv2.cvtColor(image, cv2.COLOR_YUV2RGB_Y422)
问题:一直出现段错误核心已转存
解决 感觉上是图像尺寸太大了,这样循环起来处理很可能跟不上,果然是这样
所以在上面的基础上
image= cv2.resize(image,(480,640))
改一下尺寸 ok!解决
海康工业摄像头调用(linux基于python和opencv)相关推荐
- [Rtsp]海康网络摄像头基于RTSP协议的windows平台监控
[Rtsp]海康网络摄像头基于RTSP协议的windows平台监控 基于RTSP协议的windows平台监控. 1. 基于RTSP协议的windows平台监控. 1.1 选取海康网络摄像头(支持RT ...
- 海康网络摄像头忘记密码_不要忘记网络性能
海康网络摄像头忘记密码 Amazon released a famous statement in the late 2000s stating that every hundred millisec ...
- 海康网络摄像头实时视频预览(流媒体转码推流 red5,nginx-rtmp,ffmpeg)
海康网络摄像头实时视频预览(流媒体转码推流 red5,nginx-rtmp,ffmpeg) 实现思路 获取摄像头rtsp流→流媒体拉流转码推流成rtmp流(网页具备flash可播放)→根据rtmp流地 ...
- 多路海康网络摄像头数据实时回调(采用软解码方式)
由于项目中需要访问多路海康摄像头的原始图像进行相关处理,搜索了大量的博客,对于多路海康摄像头回调都没有写的很清楚明白,看到此博客的你,静下心来研读下面的内容,你将会很容易调取多路海康网络摄像头. (1 ...
- ubuntu 使用opencv 获取海康网络摄像头视频流
1. 前言 之前在windows平台下使用opencv获取海康网络摄像头的视频流,但是不管怎么设置都无法登录摄像头,导致无法获取摄像头的视频流,但是换到ubuntu又正常了,主要是设置rtsp的格式, ...
- 海康工业相机镜头阴影矫正LSC
海康工业相机镜头阴影矫正LSC 前言 海康工业相机SDK LSC算法矫正接口 SDK下载获取 代码流程简介 LSC标定文件生成 LSC矫正 矫正耗时测试 图像效果对比 LensShadingCorre ...
- 对海康28181摄像头PS流解码的支持(一)
背景 我们的项目是基于sip的IMS系统,需要添加对海康28181摄像头的支持,所以分为以下几步: 向海康摄像头发起点播请求,基于sip. PS流过来后,剥出h264流. 对h264流进行解码. 一. ...
- 海康工业网口相机组播功能
海康工业网口相机组播功能 1.组播功能MVS演示 1.1网络拓扑图 1.2MVS功能演示 2.组播功能SDK接口调用实现 3.组播功能使用常见问题 什么是组播? 网口相机的组播功能可以实现多个PC对同 ...
- 海康sdk项目部署Linux系统时出现java.lang.UnstisfiedLinkError:jnidispatch(xxx)not found in resource path错误
海康sdk项目部署Linux系统时出现java.lang.UnstisfiedLinkError:jnidispatch(xxx)not found in resource path错误 问题描述 解 ...
最新文章
- MySql cmd下的学习笔记 —— 有关建立数据库的操作(连接Mysql,建立数据库,删除数据库等等)...
- 【Canvas】如何用Canvas绘制折线图
- 「回血赠书」Python入门书单,新年全力扬帆
- 谷歌浏览器的笔记在哪里_selenium学习笔记之启动谷歌浏览器
- 回调函数原理及应用实例
- c语言php环境搭建,c语言从入门到放弃php从入门到放弃系列-01php环境的搭建
- iPhone X (XS XR XSMAX)如何根据状态栏上的图标 获取设备的联网状态(不是单个应用的)
- python爬微博个人信息_新浪微博数据爬取Part 1:用户个人信息
- Zabbix5系列-使用温湿度传感器监控机房温湿度 (二十)
- chromium的下载和编译(流程详解)
- HP惠普笔记本Microsoft ACPI Compliant System未知设备的解决办法
- 计算机网络期末实验考试题目+总结(用的是CISCO软件~~)
- 技术人员如何做晋升答辩?
- python实时读取日志_paramiko使用tail实时获取服务器的日志输出详解
- 2022-12-03:部门工资最高的员工。以下数据Max 和 Jim 在 IT 部门的工资都是最高的,Henry 在销售部的工资最高。sql语句如何写? 输出结果如下: department emp
- Android 数据存储之SQLite数据库
- Linux的学习笔记(学习于尚硅谷)
- 【JESD204系列】六、加解扰模块的设计原理
- 计算机系统的用户包括( ),2012年计算机一级MSoffice试题及答案解析(39)
- VisionPro与C# 界面显示视觉结果图像