1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > Python调用安民威视 海康威视等网络摄像头方法(并实现KCF目标追踪和代码)

Python调用安民威视 海康威视等网络摄像头方法(并实现KCF目标追踪和代码)

时间:2020-01-16 09:19:12

相关推荐

Python调用安民威视 海康威视等网络摄像头方法(并实现KCF目标追踪和代码)

一、利用OpenCv调用网络摄像头

核心:调取网络摄像头的核心是利用rtsp通道来获取网络摄像头的信息流。

(1)首先需要将电脑网络与摄像头网络处于同一个局域网或交换机下。

(2)查询摄像头的用户名(未作修改的话一般为admin)

(3)查询摄像头的IP和htps(这两个一般会写在摄像头上或说明书上)

(4)通道直接设为1就可以了(只有一个摄像头的情况,多个的话1~10多试试几个)

import cv2#需要自己填入几个值:用户名、IP、htps、通道(一般为1)Capture = cv2.VideoCapture("rtsp:/用户名:@IP/htps/通道")_, frame = Capture.read()cv2.imshow(frame)

二、使用网络摄像头运行KCF追踪代码

直接上代码,如果上一步已经实现了的话,代码直接开用,只用修改以下上一步的几个地方就行了。追踪代码不是自己写的,是很久以前网上找的,找不到链接了,所以不标明出处了。

import cv2class MessageItem(object):# 用于封装信息的类,包含图片和其他信息def __init__(self, frame, message):self._frame = frameself._message = messagedef getFrame(self):# 图片信息return self._framedef getMessage(self):# 文字信息,json格式return self._messageclass Tracker(object):'''追踪者模块,用于追踪指定目标'''def __init__(self, tracker_type="BOOSTING", draw_coord=True):'''初始化追踪器种类'''# 获得opencv版本(major_ver, minor_ver, subminor_ver) = (cv2.__version__).split('.')self.tracker_types = ['BOOSTING', 'MIL', 'KCF', 'TLD', 'MEDIANFLOW', 'GOTURN']self.tracker_type = tracker_typeself.isWorking = Falseself.draw_coord = draw_coord# 构造追踪器if int(major_ver) < 3:self.tracker = cv2.Tracker_create(tracker_type)else:if tracker_type == 'BOOSTING':self.tracker = cv2.TrackerBoosting_create()if tracker_type == 'MIL':self.tracker = cv2.TrackerMIL_create()if tracker_type == 'KCF':self.tracker = cv2.TrackerKCF_create()if tracker_type == 'TLD':self.tracker = cv2.TrackerTLD_create()if tracker_type == 'MEDIANFLOW':self.tracker = cv2.TrackerMedianFlow_create()if tracker_type == 'GOTURN':self.tracker = cv2.TrackerGOTURN_create()def initWorking(self, frame, box):'''追踪器工作初始化frame:初始化追踪画面box:追踪的区域'''if not self.tracker:raise Exception("追踪器未初始化")status = self.tracker.init(frame, box)if not status:raise Exception("追踪器工作初始化失败")self.coord = boxself.isWorking = Truedef track(self, frame):'''开启追踪'''message = Noneif self.isWorking:status, self.coord = self.tracker.update(frame)if status:message = {"coord": [((int(self.coord[0]), int(self.coord[1])),(int(self.coord[0] + self.coord[2]), int(self.coord[1] + self.coord[3])))]}if self.draw_coord:p1 = (int(self.coord[0]), int(self.coord[1]))p2 = (int(self.coord[0] + self.coord[2]), int(self.coord[1] + self.coord[3]))cv2.rectangle(frame, p1, p2, (255, 0, 0), 2, 1)message['msg'] = "is tracking"return MessageItem(frame, message)if __name__ == '__main__':# 初始化视频捕获设备gVideoDevice = cv2.VideoCapture("rtsp://用户名:@IP/htps/1")gCapStatus, gFrame = gVideoDevice.read()# 选择 框选帧print("按 n 选择下一帧,按 y 选取当前帧")while True:if (gCapStatus == False):print("捕获帧失败")quit()_key = cv2.waitKey(0) & 0xFFif (_key == ord('n')):gCapStatus, gFrame = gVideoDevice.read()if (_key == ord('y')):breakcv2.imshow("pick frame", gFrame)# 框选感兴趣区域region of interestcv2.destroyWindow("pick frame")gROI = cv2.selectROI("ROI frame", gFrame, False)if (not gROI):print("空框选,退出")quit()# 初始化追踪器gTracker = Tracker(tracker_type="KCF")gTracker.initWorking(gFrame, gROI)# 循环帧读取,开始跟踪while True:gCapStatus, gFrame = gVideoDevice.read()if (gCapStatus):# 展示跟踪图片_item = gTracker.track(gFrame)cv2.imshow("track result", _item.getFrame())if _item.getMessage():# 打印跟踪数据print(_item.getMessage())else:# 丢失,重新用初始ROI初始print("丢失,重新使用初始ROI开始")gTracker = Tracker(tracker_type="KCF")gTracker.initWorking(gFrame, gROI)_key = cv2.waitKey(1) & 0xFFif (_key == ord('q')) | (_key == 27):breakif (_key == ord('r')):# 用户请求用初始ROIprint("用户请求用初始ROI")gTracker = Tracker(tracker_type="KCF")gTracker.initWorking(gFrame, gROI)else:print("捕获帧失败")quit()

​​​​​​​大功告成!编写不易,大家成功后点个关注or赞谢谢~~

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。