使用代码访问海康相机

我的项目结构如下:

我构造了多个文件,分别列出来。

1、ini文件

bash 复制代码
[camera]
ip = 192.168.1.64
username = admin
password = 123456qwer

# 主码流(高清)
rtsp_main = rtsp://admin:123456qwer@192.168.1.64:554/Streaming/Channels/101

# 子码流(流畅)
rtsp_sub = rtsp://admin:123456qwer@192.168.1.64:554/Streaming/Channels/102

# 抓拍接口(最高画质)
snapshot_url = http://192.168.1.64/ISAPI/Streaming/channels/1/picture

# 智能事件流(移动侦测、越界、入侵等)
event_stream = http://192.168.1.64/ISAPI/Event/notification/alertStream

2、utils文件

bash 复制代码
import datetime
import os

def timestamp():
    """返回当前时间戳字符串,用于文件命名"""
    return datetime.datetime.now().strftime("%Y%m%d_%H%M%S")

def ensure_dir(path):
    """确保目录存在"""
    if not os.path.exists(path):
        os.makedirs(path)

3、camera文件

python 复制代码
import cv2
import requests
import configparser
from requests.auth import HTTPDigestAuth
from utils import timestamp, ensure_dir


class Camera:
    """海康摄像头控制类:RTSP、抓拍、事件流"""

    def __init__(self, ini_path="camera.ini"):
        # 读取配置文件
        config = configparser.ConfigParser()
        config.read(ini_path, encoding="utf-8")

        cam = config["camera"]
        self.ip = cam["ip"]
        self.username = cam["username"]
        self.password = cam["password"]
        self.rtsp_main = cam["rtsp_main"]
        self.rtsp_sub = cam["rtsp_sub"]
        self.snapshot_url = cam["snapshot_url"]
        self.event_stream = cam["event_stream"]

    # ---------------------------------------------------------
    # 1. RTSP 视频流
    # ---------------------------------------------------------
    def get_rtsp_stream(self, use_main=True):
        """生成器:持续返回视频帧"""
        url = self.rtsp_main if use_main else self.rtsp_sub
        cap = cv2.VideoCapture(url)

        if not cap.isOpened():
            raise RuntimeError("RTSP 打不开,请检查网络或账号密码")

        while True:
            ret, frame = cap.read()
            if not ret:
                print("RTSP 断流,尝试重连...")
                cap.release()
                cap = cv2.VideoCapture(url)
                continue

            yield frame

    # ---------------------------------------------------------
    # 2. 抓拍高清图片
    # ---------------------------------------------------------
    def snapshot(self, save_dir="captures"):
        """抓拍一张高清图并保存"""
        ensure_dir(save_dir)
        filename = f"{save_dir}/capture_{timestamp()}.jpg"

        resp = requests.get(
            self.snapshot_url,
            auth=HTTPDigestAuth(self.username, self.password),
            timeout=5
        )

        if resp.status_code == 200:
            with open(filename, "wb") as f:
                f.write(resp.content)
            return filename
        else:
            raise RuntimeError(f"抓拍失败:{resp.status_code}")

    # ---------------------------------------------------------
    # 3. 监听智能事件(移动侦测、越界、入侵等)
    # ---------------------------------------------------------
    def listen_events(self):
        """监听事件流,实时返回 XML 字符串"""
        resp = requests.get(
            self.event_stream,
            auth=HTTPDigestAuth(self.username, self.password),
            stream=True,
            timeout=60
        )

        if resp.status_code != 200:
            raise RuntimeError("事件流订阅失败")

        boundary = resp.headers.get("Content-Type").split("boundary=")[-1]
        buffer = b""

        for chunk in resp.iter_content(chunk_size=4096):
            if not chunk:
                continue

            buffer += chunk

            # 判断是否包含完整事件
            if boundary.encode() in buffer:
                parts = buffer.split(boundary.encode())
                for part in parts[:-1]:
                    if b"<EventNotificationAlert" in part:
                        xml_start = part.find(b"<EventNotificationAlert")
                        xml_end = part.find(b"</EventNotificationAlert>") + len("</EventNotificationAlert>")
                        xml_data = part[xml_start:xml_end].decode()

                        yield xml_data

                buffer = parts[-1]

4、main文件(主文件)

python 复制代码
from camera import Camera
import cv2

cam = Camera()

# ---------------------------------------------------------
# 1. 显示 RTSP 视频流
# ---------------------------------------------------------
def demo_rtsp():
    for frame in cam.get_rtsp_stream(use_main=True):
        cv2.imshow("RTSP Main Stream", frame)
        if cv2.waitKey(1) == ord('q'):
            break

# ---------------------------------------------------------
# 2. 抓拍一张高清图
# ---------------------------------------------------------
def demo_snapshot():
    path = cam.snapshot()
    print("抓拍成功:", path)

# ---------------------------------------------------------
# 3. 监听智能事件(移动侦测、越界、入侵等)
# ---------------------------------------------------------
def demo_events():
    print("开始监听事件流...")
    for xml in cam.listen_events():
        print("收到事件:")
        print(xml)
        print("-" * 50)


# ---------------------------------------------------------
# 主入口
# ---------------------------------------------------------
if __name__ == "__main__":
    # demo_rtsp()
    demo_snapshot()
    # demo_events()

当我们运行主文件的时候,选择具体的函数,就可以运行了。

相关推荐
OAK中国_官方13 小时前
OAK相机 IMU 和外壳标定
数码相机
FrameNotWork14 小时前
HarmonyOS 6.0 相机开发——拍照与录像
数码相机·华为·harmonyos
song1502653729816 小时前
M12 X-Code 8芯 PoE 相机/远程IO 针脚定义完整详解
数码相机
田里的水稻2 天前
FA_数字相机成像原理、分级和分类
运维·数码相机·机器人·自动驾驶
gaosushexiangji3 天前
基于多视角高速成像与体素建模的特斯拉线圈放电电弧三维重建实验研究
数码相机
神经智研社3 天前
ROS2-16章:机器人仿真软件Gazebo
数码相机
szxinmai主板定制专家4 天前
基于ZYNQ UltraScale+ MPSOC的超高清红外-可见光融合成像相机设计
数码相机·相机
飞凌嵌入式4 天前
工业无死角视觉方案:RV1126B平台AVS全景拼接+目标检测
人工智能·数码相机·目标检测
Helen_cai5 天前
OpenHarmony 图片选择 & 相册相机工具封装 ImagePickerUtil(API23)
数码相机·华为·harmonyos
最爱老式锅包肉5 天前
HarmonyOS技术精讲-Camera Kit(相机服务)第7篇:闪光灯控制技术
数码相机·华为·harmonyos