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 怎么配置代码

如果要使用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)相关推荐

  1. [Rtsp]海康网络摄像头基于RTSP协议的windows平台监控

    [Rtsp]海康网络摄像头基于RTSP协议的windows平台监控 基于RTSP协议的windows平台监控. 1.  基于RTSP协议的windows平台监控. 1.1 选取海康网络摄像头(支持RT ...

  2. 海康网络摄像头忘记密码_不要忘记网络性能

    海康网络摄像头忘记密码 Amazon released a famous statement in the late 2000s stating that every hundred millisec ...

  3. 海康网络摄像头实时视频预览(流媒体转码推流 red5,nginx-rtmp,ffmpeg)

    海康网络摄像头实时视频预览(流媒体转码推流 red5,nginx-rtmp,ffmpeg) 实现思路 获取摄像头rtsp流→流媒体拉流转码推流成rtmp流(网页具备flash可播放)→根据rtmp流地 ...

  4. 多路海康网络摄像头数据实时回调(采用软解码方式)

    由于项目中需要访问多路海康摄像头的原始图像进行相关处理,搜索了大量的博客,对于多路海康摄像头回调都没有写的很清楚明白,看到此博客的你,静下心来研读下面的内容,你将会很容易调取多路海康网络摄像头. (1 ...

  5. ubuntu 使用opencv 获取海康网络摄像头视频流

    1. 前言 之前在windows平台下使用opencv获取海康网络摄像头的视频流,但是不管怎么设置都无法登录摄像头,导致无法获取摄像头的视频流,但是换到ubuntu又正常了,主要是设置rtsp的格式, ...

  6. 海康工业相机镜头阴影矫正LSC

    海康工业相机镜头阴影矫正LSC 前言 海康工业相机SDK LSC算法矫正接口 SDK下载获取 代码流程简介 LSC标定文件生成 LSC矫正 矫正耗时测试 图像效果对比 LensShadingCorre ...

  7. 对海康28181摄像头PS流解码的支持(一)

    背景 我们的项目是基于sip的IMS系统,需要添加对海康28181摄像头的支持,所以分为以下几步: 向海康摄像头发起点播请求,基于sip. PS流过来后,剥出h264流. 对h264流进行解码. 一. ...

  8. 海康工业网口相机组播功能

    海康工业网口相机组播功能 1.组播功能MVS演示 1.1网络拓扑图 1.2MVS功能演示 2.组播功能SDK接口调用实现 3.组播功能使用常见问题 什么是组播? 网口相机的组播功能可以实现多个PC对同 ...

  9. 海康sdk项目部署Linux系统时出现java.lang.UnstisfiedLinkError:jnidispatch(xxx)not found in resource path错误

    海康sdk项目部署Linux系统时出现java.lang.UnstisfiedLinkError:jnidispatch(xxx)not found in resource path错误 问题描述 解 ...

最新文章

  1. MySql cmd下的学习笔记 —— 有关建立数据库的操作(连接Mysql,建立数据库,删除数据库等等)...
  2. 【Canvas】如何用Canvas绘制折线图
  3. 「回血赠书」Python入门书单,新年全力扬帆
  4. 谷歌浏览器的笔记在哪里_selenium学习笔记之启动谷歌浏览器
  5. 回调函数原理及应用实例
  6. c语言php环境搭建,c语言从入门到放弃php从入门到放弃系列-01php环境的搭建
  7. iPhone X (XS XR XSMAX)如何根据状态栏上的图标 获取设备的联网状态(不是单个应用的)
  8. python爬微博个人信息_新浪微博数据爬取Part 1:用户个人信息
  9. Zabbix5系列-使用温湿度传感器监控机房温湿度 (二十)
  10. chromium的下载和编译(流程详解)
  11. HP惠普笔记本Microsoft ACPI Compliant System未知设备的解决办法
  12. 计算机网络期末实验考试题目+总结(用的是CISCO软件~~)
  13. 技术人员如何做晋升答辩?
  14. python实时读取日志_paramiko使用tail实时获取服务器的日志输出详解
  15. 2022-12-03:部门工资最高的员工。以下数据Max 和 Jim 在 IT 部门的工资都是最高的,Henry 在销售部的工资最高。sql语句如何写? 输出结果如下: department emp
  16. Android 数据存储之SQLite数据库
  17. Linux的学习笔记(学习于尚硅谷)
  18. 【JESD204系列】六、加解扰模块的设计原理
  19. 计算机系统的用户包括( ),2012年计算机一级MSoffice试题及答案解析(39)
  20. VisionPro与C# 界面显示视觉结果图像

热门文章

  1. java初学者学习顺序--流程
  2. luogu P2762 太空飞行计划问题(最大权闭合图)
  3. 前端HTML5视频_谷粒音乐实战-张晓飞-专题视频课程
  4. DSP芯片CSL的使用
  5. adjusted closing price股票的调整后价格
  6. Java的GUI编程---AWT介绍
  7. 为什么程序员的业余项目大多都死了?
  8. linux shell cut sed
  9. 土地利用数据分类过程教学/土地利用分类/遥感解译/地理数据获取
  10. JavaSE进阶回顾第三天-异常