(202103更新)海康威视网络摄像头sdk python版 (报错排查) 移动物体检测 多通道海康威视网洛摄像头后台检测 海康威视网络摄像头Python SDK
海康威视网络摄像头Python SDK+移动物体位置检测
文末附 海康威视网络摄像头Python SDK 下载链接
本文参考博客
https://blog.csdn.net/c20081052/article/details/95082377
https://blog.csdn.net/pengpengloveqiaoqiao/article/details/89487049
注意:摄像头要在镜头上贴红外滤光片 过滤掉可见光
效果展示,已经过滤到大部分波长可见光,手在镜头前来回移动,红框即检测到移动物体的位置,并框出来(海康威视的摄像头可见光好像不能完全被滤光片过滤掉,但是可以过滤到投影机的画面或者屏幕的画面,不影响使用)
目录
1.将海康威视的C++ sdk 转化为 Python sdk
2.调用海康威视Python SDK
3.调用多个海康威视摄像头
4. 将多个摄像头画面拼接成一个
5.挨个摄像头透视变换
6. 透视变换完后再在拼接后的画面上做动态物体检测,参考博客
1.将海康威视的C++ sdk 转化为 Python sdk (本文已经处理完了)
如何将海康威视的C++ sdk 转化为 Python 可用的sdk ,请参考博主 ciky奇 的文章,链接如下
https://blog.csdn.net/c20081052/article/details/95082377 如果最后一步Python调用时遇到报错,尝试将所有相关的文件全部复制到Python工程的路径下
环境:
1. windows10 64位
2. opecv
3. python3
4.海康威视网络摄像头64位 C++ sdk
https://www.hikvision.com/cn/download_61.html
下载SDK_Win64
5.其他库文件:
5.1 opencv-python
5.2 numpy
5.3 multiprocessing (多进程使用)
本文已将海康威视C++ sdk转为Python sdk处理好,可以直接下载使用,文末网址分享
如果HKIPCamera 一直报错,找不到模块 ,首先 python 和 opencv要安装好,并且设置好环境变量,如果还是报错:
一般是缺少VC++库的运行时组件,两个方案:
1. 从微软官网下载VC++库的运行时组件:
此组件也可以解决其他项目上的很多疑难杂症
官网链接: https://visualstudio.microsoft.com/zh-hans/downloads/
2、下载一个DirectX修复工具
链接:https://pan.baidu.com/s/1thfI2SyCpQoToBxuwFnxuA
提取码:8aza
打开后点击 工具----> 选项---->扩展---->开始扩展
扩展完了以后,此时会默认选中同时更新C++,点击检测并修复,
如果缺少组件就会自动安装,如果已经安装了但是不是最新的,会自动更新,
等修复完了,再尝试运行Python程序
如果还是一直存在问题,请回头参考博文https://blog.csdn.net/c20081052/article/details/95082377一步一步重新操作
2.调用海康威视Python SDK
import cv2
import numpy as np
import HKIPcameradef get_cam_frame(ip, account, password):ip = str(ip) # 摄像头IP地址,要和本机IP在同一局域网name = str(account) # 管理员用户名pw = str(password) # 管理员密码HKIPcamera.init(ip, name, pw)while(True): fram = HKIPcamera.getframe() frame = np.array(fram)cv2.imshow('frame',frame)c = cv2.waitKey(10)if c == 27:break;HKIPcamera.release()if __name__ == '__main__':get_cam_frame('192.168.1.64', 'admin', '123456')
3.调用多个海康威视摄像头
调用多个摄像头需要用到多进程,多线程不起作用
在第一步的代码基础上修改一下
import cv2
import numpy as np
import HKIPcamera
from multiprocessing import Process, Queuedef get_cam_frame(frameName, ip, account, password):ip = str(ip) # 摄像头IP地址,要和本机IP在同一局域网name = str(account) # 管理员用户名pw = str(password) # 管理员密码HKIPcamera.init(ip, name, pw)while True:fram = HKIPcamera.getframe()frame = np.array(fram)cv2.imshow(frameName, frame)c = cv2.waitKey(10)if c == 27:break;HKIPcamera.release()if __name__ == '__main__':p0 = Process(target=get_cam_frame, args=('frame0', '192.168.1.64', 'admin', '123456',))p0.start()p1 = Process(target=get_cam_frame, args=('frame1', '192.168.1.65', 'admin', '123456',))p1.start()# 以此类推 p2 p3 ... pn
4. 将多个摄像头画面拼接成一个
再在上述的代码基础上修改
import cv2
import numpy as np
import HKIPcamera
from multiprocessing import Process, Queue
import os
import signaldef get_cam_frame(frameName, ip, account, password, n):ip = str(ip) # 摄像头IP地址,要和本机IP在同一局域网name = str(account) # 管理员用户名pw = str(password) # 管理员密码HKIPcamera.init(ip, name, pw)while True:fram = HKIPcamera.getframe()frame = np.array(fram)# 由于摄像头画面是1920*1080,多个拼接的话,画面会非常大,所有重置一下每个摄像头的画面frame = cv2.resize(frame, (768, 540), interpolation=cv2.INTER_CUBIC)n.put(frame)cv2.imshow(frameName, frame)c = cv2.waitKey(10)if c == 27:break;HKIPcamera.release()if __name__ == '__main__':q0 = Queue(3)p0 = Process(target=get_cam_frame, args=('frame0', '192.168.1.64', 'admin', '123456', q0,))p0.start()q1 = Queue(3)p1 = Process(target=get_cam_frame, args=('frame1', '192.168.1.65', 'admin', '12345', q1,))p1.start()while True:if p0.is_alive() and p1.is_alive():frame0 = q0.get()frame1 = q1.get()# 横着拼full_frame = np.hstack([frame0, frame1])# 竖着拼# full_frame = np.vstack([frame0, frame1])cv2.imshow('full_frame', full_frame)c = cv2.waitKey(10)if c==27:os.kill(p0.pid, signal.SIGTERM)os.kill(p1.pid, signal.SIGTERM)break;
5.挨个摄像头透视变换
如果不了解opencv-python透视变换函数的参数,请先看下此博客的透视变换函数介绍,链接如下:
https://blog.csdn.net/wsp_1138886114/article/details/83374333
import cv2
import numpy as np
import HKIPcamera
from multiprocessing import Process, Queue
import os
import signaldef get_cam_frame(frameName, ip, account, password, n):ip = str(ip) # 摄像头IP地址,要和本机IP在同一局域网name = str(account) # 管理员用户名pw = str(password) # 管理员密码HKIPcamera.init(ip, name, pw)while True:fram = HKIPcamera.getframe()frame = np.array(fram)# 由于摄像头画面是1920*1080,多个拼接的话,画面会非常大,所有重置一下每个摄像头的画面frame = cv2.resize(frame, (768, 540), interpolation=cv2.INTER_CUBIC)n.put(frame)cv2.imshow(frameName, frame)c = cv2.waitKey(10)if c == 27:break;HKIPcamera.release()#第一个摄像头透视变化的四个点
frame0_x0, frame0_y0, frame0_x1, frame0_y1, frame0_x2, frame0_y2, frame0_x3, frame0_y3 = 0, 0, 0, 0, 0, 0, 0, 0
#第二个摄像头透视变化的四个点
frame1_x0, frame1_y0, frame1_x1, frame1_y1, frame1_x2, frame1_y2, frame1_x3, frame1_y3 = 0, 0, 0, 0, 0, 0, 0, 0#简单来写,按照从第一个摄像头开始,鼠标每点击一次,获取一个点
#例如鼠标第一次点击,就等于给坐标frame0_x0, frame0_y0 赋值, 第二次点击就是给坐标frame0_x1, frame0_y1赋值,以此类推clickNum = 0def draw_point(event, x, y, flags, param):global frame0_x0, frame0_y0, frame0_x1, frame0_y1, frame0_x2, frame0_y2, frame0_x3, frame0_y3global frame1_x0, frame1_y0, frame1_x1, frame1_y1, frame1_x2, frame1_y2, frame1_x3, frame1_y3, clickNumif event == cv2.EVENT_LBUTTONDOWN:if clickNum == 0:frame0_x0 = xframe0_y0 = yelif clickNum == 1:frame0_x1 = xframe0_y1 = yelif clickNum == 2:frame0_x2 = xframe0_y2 = yelif clickNum == 3:frame0_x3 = xframe0_y3 = yelif clickNum == 4:frame1_x0 = xframe1_y0 = yelif clickNum == 5:frame1_x1 = xframe1_y1 = yelif clickNum == 6:frame1_x2 = xframe1_y2 = yelif clickNum == 7:frame1_x3 = xframe1_y3 = yclickNum += 1# 透视变换
def perspective_transform():global frame0, frame1, clickNumglobal frame0_x0, frame0_y0, frame0_x1, frame0_y1, frame0_x2, frame0_y2, frame0_x3, frame0_y3global frame1_x0, frame1_y0, frame1_x1, frame1_y1, frame1_x2, frame1_y2, frame1_x3, frame1_y3if clickNum==8:W_cols, H_rows = frame0.shape[:2]pts0_1 = np.float32([[frame0_x0, frame0_y0], [frame0_x1, frame0_y1],[frame0_x2, frame0_y2], [frame0_x3, frame0_y3]])pts0_2 = np.float32([[0, 0], [W_cols, 0], [0, H_rows], [W_cols, H_rows]])M0 = cv2.getPerspectiveTransform(pts0_1, pts0_2)frame0 = cv2.warpPerspective(frame0, M0, (W_cols, H_rows))# 这里的变换需要减去第一个摄像头的画面的宽度,768pts1_1 = np.float32([[frame1_x0-768, frame1_y0], [frame1_x1-768, frame1_y1],[frame1_x2-768, frame1_y2], [frame1_x3-768, frame1_y3]])pts1_2 = np.float32([[0, 0], [W_cols, 0], [0, H_rows], [W_cols, H_rows]])M1 = cv2.getPerspectiveTransform(pts1_1, pts1_2)frame1 = cv2.warpPerspective(frame1, M1, (W_cols, H_rows))if __name__ == '__main__':q0 = Queue(3)p0 = Process(target=get_cam_frame, args=('frame0', '192.168.1.64', 'admin', '123456', q0,))p0.start()q1 = Queue(3)p1 = Process(target=get_cam_frame, args=('frame1', '192.168.1.65', 'admin', '123456', q1,))p1.start()cv2.namedWindow('full_frame')# 鼠标点击事件cv2.setMouseCallback('full_frame', draw_point)while True:if p0.is_alive() and p1.is_alive():frame0 = q0.get()frame1 = q1.get()# 透视变换perspective_transform()# 透视变换完再拼接# 横着拼full_frame = np.hstack([frame0, frame1])# 竖着拼#full_frame = np.vstack([frame0, frame1])cv2.imshow('full_frame', full_frame)c = cv2.waitKey(10)if c==27:os.kill(p0.pid, signal.SIGTERM)os.kill(p1.pid, signal.SIGTERM)break;
6. 透视变换完后再在拼接后的画面上做动态物体检测,参考博客
https://blog.csdn.net/pengpengloveqiaoqiao/article/details/89487049
import cv2
import numpy as np
import HKIPcamera
from multiprocessing import Process, Queue
import os
import signaldef get_cam_frame(frameName, ip, account, password, n):ip = str(ip) # 摄像头IP地址,要和本机IP在同一局域网name = str(account) # 管理员用户名pw = str(password) # 管理员密码HKIPcamera.init(ip, name, pw)while True:fram = HKIPcamera.getframe()frame = np.array(fram)# 由于摄像头画面是1920*1080,多个拼接的话,画面会非常大,所有重置一下每个摄像头的画面frame = cv2.resize(frame, (768, 540), interpolation=cv2.INTER_CUBIC)n.put(frame)cv2.imshow(frameName, frame)c = cv2.waitKey(10)if c == 27:break;HKIPcamera.release()#第一个摄像头透视变化的四个点
frame0_x0, frame0_y0, frame0_x1, frame0_y1, frame0_x2, frame0_y2, frame0_x3, frame0_y3 = 0, 0, 0, 0, 0, 0, 0, 0
#第二个摄像头透视变化的四个点
frame1_x0, frame1_y0, frame1_x1, frame1_y1, frame1_x2, frame1_y2, frame1_x3, frame1_y3 = 0, 0, 0, 0, 0, 0, 0, 0#简单来写,按照从第一个摄像头开始,鼠标每点击一次,获取一个点
#例如鼠标第一次点击,就等于给坐标frame0_x0, frame0_y0 赋值, 第二次点击就是给坐标frame0_x1, frame0_y1赋值,以此类推clickNum = 0def draw_point(event, x, y, flags, param):global frame0_x0, frame0_y0, frame0_x1, frame0_y1, frame0_x2, frame0_y2, frame0_x3, frame0_y3global frame1_x0, frame1_y0, frame1_x1, frame1_y1, frame1_x2, frame1_y2, frame1_x3, frame1_y3, clickNumif event == cv2.EVENT_LBUTTONDOWN:if clickNum == 0:frame0_x0 = xframe0_y0 = yelif clickNum == 1:frame0_x1 = xframe0_y1 = yelif clickNum == 2:frame0_x2 = xframe0_y2 = yelif clickNum == 3:frame0_x3 = xframe0_y3 = yelif clickNum == 4:frame1_x0 = xframe1_y0 = yelif clickNum == 5:frame1_x1 = xframe1_y1 = yelif clickNum == 6:frame1_x2 = xframe1_y2 = yelif clickNum == 7:frame1_x3 = xframe1_y3 = yclickNum += 1# 透视变换
def perspective_transform():global frame0, frame1, clickNumglobal frame0_x0, frame0_y0, frame0_x1, frame0_y1, frame0_x2, frame0_y2, frame0_x3, frame0_y3global frame1_x0, frame1_y0, frame1_x1, frame1_y1, frame1_x2, frame1_y2, frame1_x3, frame1_y3if clickNum==8:W_cols, H_rows = frame0.shape[:2]pts0_1 = np.float32([[frame0_x0, frame0_y0], [frame0_x1, frame0_y1],[frame0_x2, frame0_y2], [frame0_x3, frame0_y3]])pts0_2 = np.float32([[0, 0], [W_cols, 0], [0, H_rows], [W_cols, H_rows]])M0 = cv2.getPerspectiveTransform(pts0_1, pts0_2)frame0 = cv2.warpPerspective(frame0, M0, (W_cols, H_rows))# 这里的变换需要减去第一个摄像头的画面的宽度,768pts1_1 = np.float32([[frame1_x0-768, frame1_y0], [frame1_x1-768, frame1_y1],[frame1_x2-768, frame1_y2], [frame1_x3-768, frame1_y3]])pts1_2 = np.float32([[0, 0], [W_cols, 0], [0, H_rows], [W_cols, H_rows]])M1 = cv2.getPerspectiveTransform(pts1_1, pts1_2)frame1 = cv2.warpPerspective(frame1, M1, (W_cols, H_rows))if __name__ == '__main__':q0 = Queue(3)p0 = Process(target=get_cam_frame, args=('frame0', '192.168.1.64', 'admin', '123456', q0,))p0.start()q1 = Queue(3)p1 = Process(target=get_cam_frame, args=('frame1', '192.168.1.65', 'admin', '123456', q1,))p1.start()cv2.namedWindow('full_frame')# 鼠标点击事件cv2.setMouseCallback('full_frame', draw_point)kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))fgbg = cv2.createBackgroundSubtractorMOG2()while True:if p0.is_alive() and p1.is_alive():frame0 = q0.get()frame1 = q1.get()# 透视变换perspective_transform()# 透视变换完再拼接# 横着拼full_frame = np.hstack([frame0, frame1])# 竖着拼#full_frame = np.vstack([frame0, frame1])fgmask = fgbg.apply(full_frame)mask = cv2.morphologyEx(fgmask, cv2.MORPH_OPEN, kernel)contours, _ = cv2.findContours(fgmask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)for c in contours:if 100 < cv2.contourArea(c) < 40000:x, y, w, h = cv2.boundingRect(c)cv2.rectangle(full_frame, (x, y), (x + w, y + h), (0, 0, 255))cv2.imshow('full_frame', full_frame)c = cv2.waitKey(10)if c==27:os.kill(p0.pid, signal.SIGTERM)os.kill(p1.pid, signal.SIGTERM)break;
最后再写个Json或者XML(我没写)保存一下透视变换的点位信息完整工程分享
链接:https://pan.baidu.com/s/1zHwWCW5dW-XR6a98RfEuew
提取码:6gfc
(202103更新)海康威视网络摄像头sdk python版 (报错排查) 移动物体检测 多通道海康威视网洛摄像头后台检测 海康威视网络摄像头Python SDK相关推荐
- 【错误记录】PyCharm 运行 Python 程序报错 ( PEP 8: W292 no newline at end of file )
文章目录 一.报错信息 二.解决方案 一.报错信息 PyCharm 运行 Python 程序报错 : PEP 8: W292 no newline at end of file 二.解决方案 在每个 ...
- 安装python37路径报错_解决pycharm安装python库报错问题
最近在玩微信图灵机器人,不过我安装有一些库,安装报错,上网找了很久,总结有两种方法,记录一下 方法一: 手动安装,直接到官网你需要的python库下载到本地, 放在安装python路径,C:\User ...
- python 等号报错_Python学习----Python基础
Python基础 一.数据类型和变量 1.在Python中,等号=是赋值语句,可以把任意数据类型赋值给变量,同一个变量可以反复赋值,而且可以是不同类型的变量. 例如: a =520# a是整数prin ...
- 【错误记录】Mac 中 IntelliJ IDEA 运行 Python 程序报错 ( “Python“ 因为出现问题而无法打开 )
文章目录 一.报错信息 二.解决方案 一.报错信息 先安装了 Pytnon3.10.0 版本 , 然后有安装了 Python3.6.3 版本 , 安装完成后 , IntelliJ IDEA 中就出现如 ...
- 【错误记录】Mac 中 IntelliJ IDEA 运行 Python 程序报错 ( pip 21.0 will drop support for Python 2.7 in January 20 )
文章目录 一.报错信息 二.解决方案 一.报错信息 在 [错误记录]Mac 中 IntelliJ IDEA 运行 Python 程序报错 ( No module named 'threadpool' ...
- 【Python 脚本报错】AttributeError:‘module‘ has no attribute ‘xxx‘的解决方法
1.出现的问题 最近在编写Python脚本过程中遇到一个问题比较奇怪: File "/home/anirrudh/.virtualenvs/ml4t2/local/lib/python2.7 ...
- Linux笔记(2)——导入python库报错“libgomp.so.1: version `GOMP_4.0‘ not found“
导入python库报错"libgomp.so.1: version `GOMP_4.0' not found" 问题描述 超算跑一个pytorch,出现如下错误 from torc ...
- 无法启动python 因为计算机中丢失,win7 64位 python启动报错:无法启动此程序,因为计算机中丢失api-ms-win-crt-process-l1-1-0.dll...
安装python3.7,安装成功后,在cmd窗口输入python检查是否安装成功,报错:无法启动此程序,因为计算机中丢失api-ms-win-crt-process-l1-1-0.dll 在网上查询了 ...
- [故障解决]图文:python启动报错:api-ms-win-crt-runtime-l1-1-0.dll丢失解决
python启动报错:api-ms-win-crt-runtime-l1-1-0.dll丢失解决 环境 Windows 7 SP1 x64 python3.6.1 报错 解决办法 1.下载VC red ...
- 【错误记录】执行 Python 程序报错 ( NameError: name ‘reload‘ is not defined )
文章目录 一.报错信息 二.解决方案 一.报错信息 在 Windows 的 cmd 命令行运行 python 脚本时 , 报如下错误 : 执行 python ApkTool.py -analyse - ...
最新文章
- java 启动某个类_java – Spring Boot – 如何指定备用启动类? (多个入口点)
- 父类的静态方法能否被子类重写?
- Android Material Design之在RecyclerView中嵌套CardView实现
- 求100以内质数或者更多
- 找出无序数组最小的K个数(基于快排,效率高)
- 新中大银色快车数据恢复
- 实现一个简易的教师管理系统(一)
- Tesseract OCR图片提取中文并转换为Excel的示例(附Python代码)
- 【阿里云高校计划】在线Linux学习
- 二、lintcode刷题记录--二叉树的路径和
- Comparator--比较器
- 网络视频录像机地址无法修改如何解决
- HTTP Status 404错误解析
- R语言读取 xlsx 和xls 文件
- 顺序表基本操作实现(详细)
- shopNC二次开发必备知识
- 金融信创开门红丨神州信息分布式核心上线三连发!
- 最新代雅阁噪音测试软件,全新雅阁噪音测试
- android手机刷ios6,管你iOS6还是WP8 市场Android强机盘点
- webpack 打包警告超出文件大小
热门文章
- utorrent linux安装路径,CentOS6 64位 下安装 utorrent howto BT
- 防火墙技术基础思维导图(Xmind)
- 《计算机的心智:操作系统之哲学管理》读书笔记——原文摘录
- 2018画下总结,2019展望未来
- [ 笔记 ] 计算机网络安全_7_虚拟专网技术
- shopify是什么?
- 空气质量实时监控平台
- Linux 命令find,tar,ps,grep,sed,awk
- 测试之路 pytest接口自动化框架扩展-GUI窗口
- python中成绩分析函数_自学Python笔记:用Python做成绩分析(1)