海康威视网络摄像头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相关推荐

  1. 【错误记录】PyCharm 运行 Python 程序报错 ( PEP 8: W292 no newline at end of file )

    文章目录 一.报错信息 二.解决方案 一.报错信息 PyCharm 运行 Python 程序报错 : PEP 8: W292 no newline at end of file 二.解决方案 在每个 ...

  2. 安装python37路径报错_解决pycharm安装python库报错问题

    最近在玩微信图灵机器人,不过我安装有一些库,安装报错,上网找了很久,总结有两种方法,记录一下 方法一: 手动安装,直接到官网你需要的python库下载到本地, 放在安装python路径,C:\User ...

  3. python 等号报错_Python学习----Python基础

    Python基础 一.数据类型和变量 1.在Python中,等号=是赋值语句,可以把任意数据类型赋值给变量,同一个变量可以反复赋值,而且可以是不同类型的变量. 例如: a =520# a是整数prin ...

  4. 【错误记录】Mac 中 IntelliJ IDEA 运行 Python 程序报错 ( “Python“ 因为出现问题而无法打开 )

    文章目录 一.报错信息 二.解决方案 一.报错信息 先安装了 Pytnon3.10.0 版本 , 然后有安装了 Python3.6.3 版本 , 安装完成后 , IntelliJ IDEA 中就出现如 ...

  5. 【错误记录】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' ...

  6. 【Python 脚本报错】AttributeError:‘module‘ has no attribute ‘xxx‘的解决方法

    1.出现的问题 最近在编写Python脚本过程中遇到一个问题比较奇怪: File "/home/anirrudh/.virtualenvs/ml4t2/local/lib/python2.7 ...

  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 ...

  8. 无法启动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 在网上查询了 ...

  9. [故障解决]图文: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 ...

  10. 【错误记录】执行 Python 程序报错 ( NameError: name ‘reload‘ is not defined )

    文章目录 一.报错信息 二.解决方案 一.报错信息 在 Windows 的 cmd 命令行运行 python 脚本时 , 报如下错误 : 执行 python ApkTool.py -analyse - ...

最新文章

  1. java 启动某个类_java – Spring Boot – 如何指定备用启动类? (多个入口点)
  2. 父类的静态方法能否被子类重写?
  3. Android Material Design之在RecyclerView中嵌套CardView实现
  4. 求100以内质数或者更多
  5. 找出无序数组最小的K个数(基于快排,效率高)
  6. 新中大银色快车数据恢复
  7. 实现一个简易的教师管理系统(一)
  8. Tesseract OCR图片提取中文并转换为Excel的示例(附Python代码)
  9. 【阿里云高校计划】在线Linux学习
  10. 二、lintcode刷题记录--二叉树的路径和
  11. Comparator--比较器
  12. 网络视频录像机地址无法修改如何解决
  13. HTTP Status 404错误解析
  14. R语言读取 xlsx 和xls 文件
  15. 顺序表基本操作实现(详细)
  16. shopNC二次开发必备知识
  17. 金融信创开门红丨神州信息分布式核心上线三连发!
  18. 最新代雅阁噪音测试软件,全新雅阁噪音测试
  19. android手机刷ios6,管你iOS6还是WP8 市场Android强机盘点
  20. webpack 打包警告超出文件大小

热门文章

  1. utorrent linux安装路径,CentOS6 64位 下安装 utorrent howto BT
  2. 防火墙技术基础思维导图(Xmind)
  3. 《计算机的心智:操作系统之哲学管理》读书笔记——原文摘录
  4. 2018画下总结,2019展望未来
  5. [ 笔记 ] 计算机网络安全_7_虚拟专网技术
  6. shopify是什么?
  7. 空气质量实时监控平台
  8. Linux 命令find,tar,ps,grep,sed,awk
  9. 测试之路 pytest接口自动化框架扩展-GUI窗口
  10. python中成绩分析函数_自学Python笔记:用Python做成绩分析(1)