使用代码访问海康相机

我的项目结构如下:

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

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()

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

相关推荐
格林威1 小时前
面阵相机 vs 线阵相机:堡盟与海康相机选型差异全解析 附C++ 实战演示
开发语言·c++·人工智能·数码相机·计算机视觉·视觉检测·工业相机
三维频道1 天前
工业级三维扫描实测:汽车灯具复杂结构件的全尺寸 3D 测量方案分析
java·人工智能·python·数码相机·3d·汽车·汽车轻量化制造
杀生丸学AI1 天前
【动态重建】SparseCam4D:基于稀疏相机实现时空一致的4D重建技术
数码相机·aigc·扩散模型·图像编辑·视觉大模型·点云分割
爱吃巧克力的程序媛1 天前
计算机图形学---如何理解模型矩阵、视图矩阵、投影矩阵
数码相机·线性代数·矩阵
轻口味1 天前
HarmonyOS 6 轻相机应用开发4:物品分类功能实现
数码相机·分类·harmonyos
格林威2 天前
堡盟Baumer VCX系列工业相机供电与触发:网口(GigE) vs USB3.0
开发语言·人工智能·数码相机·计算机视觉·视觉检测·工业相机·高速相机
格林威2 天前
面阵相机 vs 线阵相机:堡盟与海康相机选型差异全解析 附Python实战演示
开发语言·人工智能·python·数码相机·计算机视觉·视觉检测·工业相机
格林威2 天前
面阵相机 vs 线阵相机:堡盟与大恒相机选型差异全解析 附C++ 实战演示
开发语言·c++·人工智能·数码相机·计算机视觉·视觉检测·工业相机
Godspeed Zhao2 天前
具身智能中的传感器技术35——RGB-D相机0
人工智能·科技·数码相机·具身智能
格林威3 天前
面阵相机 vs 线阵相机:堡盟与Basler选型差异全解析 +C# 实战演示
开发语言·人工智能·数码相机·计算机视觉·c#·视觉检测·工业相机