Python调用海康威视网络摄像头进行远程人脸识别

Python调用网络摄像头

RTSP (Real Time Streaming Protocol),是一种语法和操作类似 HTTP 协议,专门用于音频和视频的应用层协议。 和 HTTP 类似,RTSP 也使用 URL 地址。摄像机传输数据用的是码流,高清网络摄像机产品编码器都会产生两个编码格式,称为主码流和子码流,即双码流技术。双码流能实现本地和远程传输的两种不同的带宽码流需求,本地传输可以用主码流,能获得更清晰的存储录像,远程传输就因为带宽限制的原因,而使用子码流来获得流畅的图像和录像。不同摄像头厂家的RTSP协议地址有所不同,查找到各大厂家的协议格式如下:

海康:

rtsp://[username]:[password]@[ip]:[port]/[codec]/[channel]/[subtype]/av_stream
#1) username  用户名,常用 admin
#2) password  密码,常用 12345
#3) ip        摄像头IP,如 192.0.0.64
#4) port      端口号,默认为 554,可以不写
#5) codec     视频编码模式,有 h264、MPEG-4、mpeg4 等,可以不写
#6) channel   通道号,起始为1,例如通道1,则为 ch1
#7) subtype   码流类型,主码流为 main,辅码流为 sub

大华:

rtsp://[username]:[password]@[ip]:[port]/cam/realmonitor?[channel=1]&[subtype=1] 
#1) username、password、ip、port 同上
#2) channel  通道号,起始为1,例如通道2,则为 channel=2
#3) subtype  码流类型,主码流为0(即 subtype=0),辅码流为1(即 subtype=1)

宇视:

rtsp://{用户名}:{密码}@{ip}:{port}/video1/2/3#1)video1/2/3表示主码流,子码流,三码流(可以不用)
#2)其他一样

Python调用海康威视网络摄像头并实时显示的例程如下:

import cv2

cap = cv2.VideoCapture("rtsp://admin:a123456789@121.248.50.30/h264/ch1/main/av_stream")
while True:
    ret, frame = cap.read()
    cv2.imshow("Video", frame)
    cv2.waitKey(1)

画面显示效果良好,传输25fps 1920×1080的复合流相比海康威视官方监视平台约有1s的时延。

调用网络摄像头进行人脸检测与人脸识别

调用Python模块face_recognition进行基于网络摄像头的人脸识别功能开发,face_recognition基于dlib中的深度学习模型,用Labeled Faces in the Wild人脸数据集进行测试,有高达99.38%的准确率,但对亚洲人脸的识别准确率尚待提升。

face_recognition模块能够基于本地摄像头实现人脸识别并流畅地显示画面,但网络摄像头添加了人脸检测和人脸识别功能后,画面延迟和卡顿现象十分严重,解决措施:1. 降低人脸检测和人脸识别的频率,每0.2秒进行一次人脸检测,每2秒进行一次人脸识别;2. 采用多线程,将远程视频画面的获取与人脸检测识别分开处理,效果有所改善。

最终代码:

import os
import cv2
import queue
import threading
import face_recognition
import numpy as np

q = queue.Queue()


# 线程1获取网络摄像头图像
def Receive():
    print("Start Reveive")
    cap = cv2.VideoCapture("rtsp://admin:a123456789@121.248.50.30/h264/ch1/main/av_stream")
    ret, frame = cap.read()
    q.put(frame)
    while ret:
        ret, frame = cap.read()
        q.put(frame)


# 线程2进行人脸检测识别并显示
def Display():
    print("Start Displaying")

    # 加载人脸数据库并学习
    database_path = "./Face_Database/"
    filenames = os.listdir(database_path)

    image_set = []
    known_face_names = []
    known_face_encodings = []

    for filename in filenames:
        image_set.append(face_recognition.load_image_file(database_path + filename))
        known_face_names.append(filename.split(".")[0])

    for image in image_set:
        known_face_encodings.append(face_recognition.face_encodings(image)[0])

    # 检测识别人脸及显示
    face_locations = []
    face_names = []
    count = 0
    while True:
        if not q.empty():
            count += 1

            frame = q.get()
            small_frame = cv2.resize(frame, (0, 0), fx=0.25, fy=0.25)
            rgb_small_frame = small_frame[:, :, ::-1]

            # 每0.2秒进行一次人脸检测
            if count % 5 == 0:
                face_locations = face_recognition.face_locations(rgb_small_frame)

            # 每2秒进行一次人脸识别
            if count % 50 == 0:
                face_encodings = face_recognition.face_encodings(rgb_small_frame, face_locations)
                face_names = []

                for face_encoding in face_encodings:

                    matches = face_recognition.compare_faces(known_face_encodings, face_encoding, tolerance=0.48)
                    name = "Unknown"

                    face_distances = face_recognition.face_distance(known_face_encodings, face_encoding)
                    best_match_index = np.argmin(face_distances)

                    if matches[best_match_index]:
                        name = known_face_names[int(best_match_index)]

                    face_names.append(name)

            # 显示人脸定位框及姓名
            for (top, right, bottom, left), name in zip(face_locations, face_names):
                top *= 4
                right *= 4
                bottom *= 4
                left *= 4

                cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 2)
                cv2.rectangle(frame, (left, bottom - 35), (right, bottom), (0, 0, 255), cv2.FILLED)
                cv2.putText(frame, name, (left + 6, bottom - 6), cv2.FONT_HERSHEY_DUPLEX, 1.0, (255, 255, 255), 1)

            cv2.imshow('Video', frame)

            if cv2.waitKey(1) & 0xFF == ord('q'):
                break


if __name__ == '__main__':
    p1 = threading.Thread(target=Receive)
    p2 = threading.Thread(target=Display)
    p1.start()
    p2.start()
  • 5
    点赞
  • 117
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
### 回答1: 要在Windows下使用Python调用海康威视网络摄像头SDK,可以按照以下步骤操作: 1. 安装海康威视网络摄像头SDK:首先,从海康威视官方网站下载并安装最新版本的SDK。确保SDK与你的Python版本兼容。 2. 设置环境变量:打开控制面板,进入系统属性,点击“高级系统设置”,选择“环境变量”。在系统变量中,找到“Path”变量,并将SDK的安装路径添加到该变量中。这样Python才能找到SDK的库文件。 3. 安装Python海康威视SDK库:通过pip安装Python海康威视SDK库,可以在命令提示符中运行以下命令: ``` pip install hikvisionapi ``` 这样就能将海康威视SDK库安装到Python环境中。 4. 使用Python调用SDK:在Python脚本中导入SDK库并使用其中的函数和类来调用摄像头功能。例如,你可以使用SDK提供的函数初始化摄像头设备、打开视频流、进行图像处理等操作。 需要注意的是,在使用SDK之前,你需要先了解SDK提供的函数和类的使用方法。可以参考SDK的官方文档或样例代码来了解如何正确地调用SDK的各项功能。 总之,通过安装SDK、设置环境变量、安装Python的SDK库,并使用Python脚本来调用SDK的函数和类,你就能在Windows下使用Python调用海康威视网络摄像头SDK了。 ### 回答2: 在Windows操作系统下,可以使用Python调用海康威视网络摄像头SDK来实现摄像头的控制和影像数据的获取。下面是一个简单的示例代码: 首先,确保已经安装了Python和相应的海康威视网络摄像头SDK。 ```python # 导入相关库 from ctypes import * # 加载SDK的动态链接库 hk_sdk = cdll.LoadLibrary('hk_sdk.dll') # 设置登录参数 addr = b'IP地址' # 摄像头的IP地址 port = 8000 # 摄像头的端口号 user = b'用户名' # 登录用户名 password = b'密码' # 登录密码 # 登录摄像头 login_info = hk_sdk.NET_DVR_USER_LOGIN_INFO() # 定义登录信息结构体 login_info.sDeviceAddress = addr # 摄像头的IP地址 login_info.wPort = port # 摄像头的端口号 login_info.sUserName = user # 登录用户名 login_info.sPassword = password # 登录密码 login_info.cbLoginResult = None # 登录结果回调函数 login_info.pUser = None # 用户参数 lUserID = hk_sdk.NET_DVR_Login_V40(byref(login_info), None) # 调用登录函数,获取登录ID # 检查登录是否成功 if lUserID < 0: print('设备登录失败') hk_sdk.NET_DVR_Cleanup() # 释放资源 else: print('设备登录成功') # 进行相关操作,如实时预览或录像等 # 登出摄像头 hk_sdk.NET_DVR_Logout_V30(lUserID) hk_sdk.NET_DVR_Cleanup() # 释放资源 ``` 以上代码首先通过`cdll.LoadLibrary()`函数加载SDK的动态链接库。然后创建一个`NET_DVR_USER_LOGIN_INFO`结构体,并设置登录参数,包括IP地址、端口号、用户名和密码。接着调用`NET_DVR_Login_V40()`函数进行登录,并获取登录ID。如果登录成功,则可以进行相关操作,如实时预览或录像等。最后,调用`NET_DVR_Logout_V30()`函数登出摄像头,并使用`NET_DVR_Cleanup()`函数释放资源。 需要注意的是,具体的操作和功能需根据海康威视网络摄像头SDK的文档进行相关配置和调用
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值