【Python】基于Python和Qt的海康威视相机开发

news2024/11/26 22:54:51

文章目录

  • 0 前期教程
  • 1 前言
  • 2 例程解析
  • 3 图像获取
  • 4 其他问题与解决办法
  • 5 使用到的python包

0 前期教程

  • 【项目实践】海康威视工业相机SDK开发小白版入门教程(VS2015+OpenCV4.5.1)

1 前言

  此前写了一篇基于C++开发海康威视相机的博客,貌似看的人还挺多,收藏量比较高,但其实当时就知道其实海康威视相机还可以使用python开发,但当时python水平不高,也没有深入了解,趁此机会,好好总结一下用python开发的一些要点。

2 例程解析

  上面的前期教程在资料查找部分已经讲得很清楚了,这里就不再赘述。重点看一下官方提供python例程:

在这里插入图片描述

这个路径下,只有MvImport文件夹是需要导入的库文件,其他的都是某个功能对应的例程,前面两个BasicDemo是比较完善的例程,有图形界面。

  先随便找一个例程看看:

在这里插入图片描述
重点是红框中的内容,可以看到这个例程其实包含了MvCameraControl_class这个包,而这个包是在上面提到的MvImport文件夹下,所以在import前要先用append包含进这个路径。

  但是这样使用会存在一个问题,那就是如果在VS Code中开发,这样是不能通过静态检查的,也就没有了代码提示,用起来很不方便;而且从源码交互方面来说,这样要求运行这个代码的必须要有MVS环境,这个是很不优雅的。所以建议将MvImport文件夹复制到项目目录下,然后以from MvImport.MvCameraControl_class import *这样的形式来导入包,这样不仅不再需要append路径操作,而且静态检查也能通过,代码提示也有了。

  再来看看MvImport文件夹下的文件:

在这里插入图片描述

这里需要注意的是,如果将MvImport文件夹放到项目目录下,那么该目录下的文件在import同文件夹脚本时,要注意不能使用本文件的相对路径,而要使用项目的相对路径!! 这样才能静态检查通过。
  另外还有这个导入的dll文件,使用的是绝对路径,感觉不够优雅,而且可移植性不强,还是建议将dll文件复制到项目目录下,但是这里需要注意的是,这里实际调用的dll文件不止这一个,所以还是把整个文件夹都复制进去,所以最后项目的整体结构如下:

project_direction:
	|-- project.py
	|-- ........
	|-- MvImport
	|   |-- CameraParams_const.py
	|   |-- CameraParams_header.py
	|   |-- MvCameraControl_class.py
	|   |-- MvErrorDefine_const.py
	|   |-- PixelType_header.py
	|   |-- Win64_x64
	|   |   |-- MvCameraControl.dll
	|   |   |-- .......

然后在导入包时,所有的脚本均以项目目录为起点,以相对路径的形式导入包,这样不仅对静态检查有利,对后续导出执行程序也有很大帮助。

3 图像获取

  按照上面的步骤,配好了项目结构,接下来就是编程了。由于官方给的代码注释比较全面,这里就不再赘述了,主要是搞清楚相机的运行流程,然后按照官方给的例程和手册一步一步来就问题不大。
  这里记录一个在使用过程中遇到的问题,那就是取图部分。根据官方的手册,取图主要有两种方式,如下图所示:
在这里插入图片描述

分别是 MV_CC_GetOneFrameTimeout()MV_CC_GetImageBuffer()这两种方式,根据官网提供的文档,使用后者的效率更高,但是问题在于官方提供的python 例程当中,

在这里插入图片描述

_MV_FRAME_OUT_这个结构体下pBufAddr数据类型错了,这种表示方法使得该变量只有一个unsigned char类型,应该还需要乘上该字节的长度,但是由于相机的分辨率是可以自定义的,且不同相机型号分辨率不同,因此这里才没有设置乘数为多少。

  总之因为这个原因,如果使用 MV_CC_GetImageBuffer()这个函数来读取图像数据,只能得到一个字节,其实也就是空值。所以这里才使用MV_CC_GetOneFrameTimeout()这种方式来读取图像数据,或者修改上面的代码,但这样牵一发动全身,不好掌握。
  而且官方给出的BasicDemo例程也是基于MV_CC_GetOneFrameTimeout()来取图,所以这里建议优先采用后者,具体的使用方式建议参考BasicDemo例程。

参考链接


//更新:
貌似使用MV_CC_GetImageBuffer()也是可以正常取图的,需要使用ctypes这个包里面的一些操作,可以参考这个链接。

4 其他问题与解决办法

  • 使用网口转USB模块连接到电脑无法识别设备
    需要明确的是,网口转USB相当于是一个有线网卡,没有连接到互联网,也就不具有DHCP功能,因此需要手动给这个网卡分配一个IP地址,这个IP地址在相机看来就是电脑的IP地址,这样相机就能正常找到电脑,即电脑也能找到相机了,另外,二者的IP最好在同一网段,即第三位相同。

  • MVS中识别到相机,但运行Python程序没有识别到,报错no data, ret = 80000007
    这可能是因为防火墙的原因,不妨切换一下所连接WiFi的属性,比如公用还是专用(原来公用的换成专用,原来专用的换成公用):
    在这里插入图片描述
    总之最后保证python.exe公用和专用防火墙都允许,如下图所示:
    在这里插入图片描述

    参考链接

5 使用到的python包

  在开发过程中,使用到很多比较“底层”的包,有点新奇,这里附上一些学习链接。

  • msvcrt:输入交互,参考链接
  • threading:多线程
    • Lock类详解
    • Thread类用法详解
  • ctypes:架起c/c++和python之间的桥梁
    • 官方教程
    • link1
    • link2
    • link3
    • link4

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/780218.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

设计模式结构型——享元模式

目录 什么是享元模式 享元模式的实现 享元模式的特点 什么是享元模式 享元模式(Flyweight Pattern)是一种结构型设计模式,享元模式中的“享元”指被共享的单元,享元模式通过复用对象,以达到节省内存的目的。要求能够…

[数学建模] [2019年A 模拟练习][层次分析法、熵值法、多目标优化、主成分分析法] 4. 深圳居民健康水平评估与测控模型研究

1、前言 2019年“深圳杯”数学建模挑战赛A题 原题,这个是当时学校内部校赛所作,为了拿到参加国赛名额,也权当是做一个简单的练手。 本次练习属于综合评判类,常用的方法无非 层次分析法、熵值法、多目标优化、主成分分析法 等&am…

简单了解内存泄漏(C++)

文章目录 定义举例内存泄漏的危害内存泄漏的种类如何避免内存泄漏 定义 内存泄漏是指在程序运行过程中,申请的内存空间没有被正确释放或回收,导致这些内存无法再次使用的情况。简而言之,内存泄漏就是程序中已经分配的内存没有被及时释放&…

APP抓包-代理转发绕过反代理+Xposed绕过证书校验

某牛牛安卓app防抓包 夜神模拟器打开牛牛,出现网络连接失败等情况。明明网络一切正常,为什么会这样呢? 因为牛牛设置了反代理,而我开启了代理 burp也无任何牛牛的数据包产生 关闭代理之后牛牛就正常了,可恶的牛牛啊&am…

Localizing Moments in Video with Natural Language论文笔记

0.文献地址 2017 Localizing Moments in Video with Natural Language 1.摘要 提出了Moment Context Network(MCN)有效地定位视频中的自然语言查询又提出了唯一识别对应时刻的文本描述的数据集DiDeMo 2.引言 作者提出了问题如果查询特定的时间段&am…

算法竞赛备赛之经典数据结构训练提升,暑期集训营培训

1.链表与邻接表:树与图的存储 我们将结构体和指针结合来实现链表 struct Node {int val;Node * next; }; ​ new Node;//这样创建结点是相当慢的 我们算法主要是用数组来模拟链表,这样效率会高一些。 数组模拟单链表 邻接表:存储图和树 实…

Spring Cloud【实现用户鉴权(什么是JWT、JWT原理、用户微服务、JWT工具类、用户服务实现JWT鉴权)】(八)

目录 Gateway解决如何允许跨域 服务网关Gateway实现用户鉴权_什么是JWT 服务网关Gateway实现用户鉴权_JWT原理 服务网关Gateway实现用户鉴权_用户微服务 服务网关Gateway实现用户鉴权_JWT工具类 服务网关Gateway实现用户鉴权_用户服务实现JWT鉴权 Gateway解决如何允许跨域…

5分钟开发一个AI论文抓取和ChatGPT提炼应用

5分钟开发一个AI论文抓取和ChatGPT提炼应用 第一步 点击“即刻开始” -选择模板 python -修改标题 “AIPaper”,项目标识“AIPaper”,点击“创建项目” 第二步 在编程区域右侧AI区域,输入框输入以下内容: 请根据下面的内容&…

4.3 Bootstrap CSS编码规范

文章目录 Bootstrap CSS编码规范语法声明顺序不要使用 import媒体查询(Media query)的位置带前缀的属性单行规则声明简写形式的属性声明Less 和 Sass 中的嵌套注释class 命名选择器代码组织编辑器配置 Bootstrap CSS编码规范 语法 用两个空格来代替制表…

Autosar通信入门系列04-聊聊CAN通信的Basic-CAN与Full-CAN

本文框架 1. 概述2. 基本内容2.1 什么是Basic-CAN与Full-CAN?2.2 既生瑜何生亮? 3. 不同报文类型如何选择Basic-CAN与Full-CAN? 1. 概述 在CAN通信学习时我们经常会遇到或者听同事聊到Basic-CAN与Full-CAN,单从字面上很难理解两个…

计讯物联工业路由器基于5G LAN技术成为工业互联网发展的“加速器”

随着5G的成熟发展,其易部署、低时延、高可靠、大带宽、广连接的特性助力传统工业智能数字化转型,解决了传统工业的布线繁琐、通信环境复杂易造成干扰、对时延与稳定性更加敏感、移动通信的网络需求、海量设备互联等难题。然而,5G在工业制造领…

软件测试基础 - 自动化测试技术

目录 前言: 什么是自动化测试? 自动化测试的优势: 自动化测试的劣势: 适合实施测试自动化的项目: 推行自动化测试的阻力: 软件研发生命周期各个阶段的自动化测试技术 前言: 软件测试是一…

还在手动维护Yapi?

因前后端人员通过接口定义字段,返回值等对接时非常苦恼,没有一个很好的平台维护,后端每次迭代都要写开发文档,需求变化,多系统联调等,给前后端联调造成阻塞。 1、后端开发文档编写规范 1)文档…

DataWhale AI夏令营——机器学习

DataWhale AI夏令营——机器学习 学习记录一1. 异常值分析2. 单变量箱线图可视化3. 特征重要性分析 学习记录一 锂电池电池生产参数调控及生产温度预测挑战赛 已配置环境,跑通baseline,并在此基础上对数据进行了简单的分析。 1. 异常值分析 对训练集…

Python知识使用目录体系

Python知识使用目录体系 前记:开始以Get No.方式进行记录,知识体系的建立 Get No. No1: IDEA(Java主要编辑器)中添加Python插件;(就在此总目录中写,属于纪念开始) 附加:另外一个pycharm工具使用python工…

pyqt5中的控件

字体部分 学习如何加载本地字体a.tff import sys from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QPushButton from PyQt5.QtGui import QFont, QFontDatabaseclass MyWindow(QWidget):def __init__(self):super().__init__()self.button Noneself.label None…

【Java开发】 Mybatis-Plus 06:通用枚举功能

枚举类是开发时绕不开的话题, Mybatis-Plus 也提供了简便的枚举功能,快学起来吧~ 目录 1 版本区别 2 通用枚举功能实现 2.1 创建枚举类 2.2 实体类新增枚举字段 3 枚举字段测试 3.1 新增 ① 后台指定枚举 ② 前后端交互 3.2 查询 3.3 修改 ①…

递归排序算法快速排序的实现过程

快速排序(Insertion Sort)也是一种递归排序算法。 快速排序原理:先以列表中的任意一个数为基准(一般选头或尾),将列表分为左、右两个子列表。 左子列表的数要比基准数小,右子列表的数要比基准数大。然后继续把左子列表和右子列表按同样的方…

蓝桥杯专题-真题版含答案-【九宫幻方】【打鱼还是晒网】【阶乘尾数零的个数】【等差素数列】

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 👉关于作者 专注于Android/Unity和各种游…

【Java】重写compareTo()方法给对象数组排序

我们先给一个数组排序,我们肯定用的是Arrays.sort()方法: public class test2 {public static void main(String[] args) {int[] arr{3,5,4,6,9,8,1};System.out.println(Arrays.toString(arr));System.out.println("---------");Arrays.sort…