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 cv2

class MessageItem(object):
    # 用于封装信息的类,包含图片和其他信息
    def __init__(self, frame, message):
        self._frame = frame
        self._message = message

    def getFrame(self):
        # 图片信息
        return self._frame

    def getMessage(self):
        # 文字信息,json格式
        return self._message


class 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_type
        self.isWorking = False
        self.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 = box
        self.isWorking = True

    def track(self, frame):
        '''
        开启追踪
        '''
        message = None
        if 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) & 0xFF
        if (_key == ord('n')):
            gCapStatus, gFrame = gVideoDevice.read()
        if (_key == ord('y')):
            break

        cv2.imshow("pick frame", gFrame)

    # 框选感兴趣区域region of interest
    cv2.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) & 0xFF
            if (_key == ord('q')) | (_key == 27):
                break
            if (_key == ord('r')):
                # 用户请求用初始ROI
                print("用户请求用初始ROI")
                gTracker = Tracker(tracker_type="KCF")
                gTracker.initWorking(gFrame, gROI)

        else:
            print("捕获帧失败")
            quit()

 


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


你可能感兴趣的:(ROS,python,opencv,计算机视觉,网络,目标跟踪)