总结两种使用OpenCv连接海康相机播放视频画面方法(demo)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 总结两种使用OpenCv连接海康相机播放视频画面方法(demo)

情况一:项目和相机在同一网段


  创建.py文件命名为:Config,构造一个通过数据库查询相机的ip,username, password 的类,方便连取相机时获取相机的ip,username, password问题。


Config.py具体如下所示:

import pymysql
class BaseSet():
    # 连接数据库基础参数
    def __init__(self):
        # 连接数据库
        self.conn = pymysql.connect(host='localhost'  # 连接名称,默认127.0.0.1
                                    , user='root'  ## 用户名
                                    , passwd='root'  # 密码
                                    , port=3306  # 端口,默认为3306
                                    , db='camera'  # 数据库名称
                                    , charset='utf8'  # 字符编码
                                    )
        self.cur = self.conn.cursor()  # 生成游标对象
        # Sql语句
        self.ConstructionSql = 'SELECT ip,username, password FROM cameras'
    def GetCamIDInfo(self):
        try:
            self.cur.execute(self.ConstructionSql)  # 执行插入的sql语句
            return self.cur.fetchall()
        except:
            self.conn.commit()  # 提交到数据库执

 创建.py文件命名为demo,这里将是你链接相机播放视频画面的核心部分了,这里我们将涉及多进程读取相机播放视频画面.

import multiprocessing
from Config import BaseSet
import cv2
def GetInfolIST():
    Config = BaseSet()
    IpList = []
    UsernameList = []
    PasswordList = []
    for ip, username, password in Config.GetCamIDInfo():
        IpList.append(ip)
        UsernameList.append(username)
        PasswordList.append(password)
    return IpList, UsernameList, PasswordList
def SaveFrams(username, password, ip):
    rtsp = "rtsp://%s:%s@%s:554/cam/realmonitor?channel=1&subtype=1" % (username, password, ip)
    cap = cv2.VideoCapture(rtsp)
    if cap.isOpened():
        ret, frame = cap.read()  # read_latest_frame() 替代 read()
        if ret:
            print("Can receive frame. Starting ..")
            cv2.imshow("video-%s" %ip, frame)
        else:
            cap.release()
if __name__ == '__main__':
    IpList, UsernameList, PasswordList = GetInfolIST()
    while True:
        p = multiprocessing.Pool(5)
        r_list = []
        for username, password, ip in zip(UsernameList, PasswordList, IpList):
            r_list.append(p.apply_async(SaveFrams, args=(username, password, ip)))
        p.close()
        for r in r_list:
            r.get()


情况二:项目和相机不在同一网段


这里我们沿用情况一中获取ip,username, password结果,更改为获取相机indexcode。这里文件命名为: ConfigMysql.py 代码部分如下:

import pymysql
class BaseSetMySql():
    # 连接数据库基础参数
    def __init__(self):
        # 连接数据库
        self.conn = pymysql.connect(host='localhost'  # 连接名称,默认127.0.0.1
                                    , user='root'  ## 用户名
                                    , passwd='root'  # 密码
                                    , port=3306  # 端口,默认为3306
                                    , db='CamIndexcode'  # 数据库名称
                                    , charset='utf8'  # 字符编码
                                    )
        self.cur = self.conn.cursor()  # 生成游标对象
        # Sql语句
        self.Sql = 'SELECT indexcode FROM indexcodes'
    # 获取摄像机编码
    def GetCamID(self):
        try:
            self.cur.execute(self.Sql)  # 执行插入的sql语句
            CamID = self.cur.fetchall()
            return CamID
        except:
            self.conn.commit()  # 提交到数据库执


创建ConfigRTSP.py文件用来通过indexcode发送请求获取RTSP

import requests
class BaseSetRTSP():
    def __init__(self):
        self.UrlIndexCode = 'http://localhost:8090/Hikvision/previewURLs'
    # 获取RTSP
    def GetRTSP(self, CamId):
        data = {'cameraIndexCode': CamId}
        RestData = requests.post(self.UrlIndexCode, data=data)
        RestDataDict = RestData.json()
        RTSP = None
        RightInfo = "rtsp" in str(RestDataDict)
        if RightInfo is True:
            Data_RestDataDict = ((eval(RestDataDict['data']))['data'])
            RTSP = Data_RestDataDict['url']
        return RTSP


创建ConfigFrame.py用来播放视频画面,代码如下:

import uuid
import cv2
import os
os.environ["OPENCV_FFMPEG_CAPTURE_OPTIONS"] = "rtsp_transport;udp"
class BaseSetSaveFrame():
    def __init__(self):
        pass
    # 
    def PlayFrame(self, CAMID, RTSP):
    cap = cv2.VideoCapture(rtsp)
    if cap.isOpened():
        ret, frame = cap.read()  # read_latest_frame() 替代 read()
        if ret:
            print("Can receive frame. Starting ..")
            cv2.imshow("video-%s" %CAMID, frame)
        else:
            cap.release()

**接下来就是调用上面的类进行获取相机画面了,在此之前需要将上述的三个文件放置在一个名为ImagesConfig的文件夹中。调用代码如下:

import multiprocessing
from ImagesConfig.ConfigMysql import BaseSetMySql
from ImagesConfig.ConfigRTSP import BaseSetRTSP
from ImagesConfig.ConfigSaveFrame import BaseSetSaveFrame
# 整体流程:播放裸土图像
def PlayCamsImgs():
    ConfigMysql = BaseSetMySql()
    ConfigRTSP = BaseSetRTSP()
    AllCamId = ConfigMysql.GetCamID()
    for CamIdName in AllCamId:
        ListCamIds = list(CamIdName)
        CamId = ' '.join(str(i) for i in ListCamIds)
        RTSP = ConfigRTSP.GetRTSPCamId)
        if RTSP is not None:
            print("正在连接此RTSP:", RTSP)
            ConfigSaveFrame = BaseSetSaveFrame()
            ConfigSaveFrame.PlayFrame(CamId, RTSP)
if __name__ == '__main__':
    PlayCamsImgs()




相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
18天前
|
计算机视觉
OpenCV基础demo
OpenCV基础demo
|
11天前
|
算法 计算机视觉
如何判断点在多边形内部:OpenCV--cv2.pointPolygonTest()方法详解
如何判断点在多边形内部:OpenCV--cv2.pointPolygonTest()方法详解
|
18天前
|
SQL 计算机视觉
OpenCV常用操作demo
OpenCV常用操作demo
|
1月前
|
机器学习/深度学习 TensorFlow 算法框架/工具
OpenCV读取tensorflow 2.X模型的方法:将SavedModel转为frozen graph
【2月更文挑战第22天】本文介绍基于Python的tensorflow库,将tensorflow与keras训练好的SavedModel格式神经网络模型转换为frozen graph格式,从而可以用OpenCV库在C++等其他语言中将其打开的方法~
OpenCV读取tensorflow 2.X模型的方法:将SavedModel转为frozen graph
|
1月前
|
前端开发 Java Maven
java集成opencv(不踩坑),实现人脸检测小demo(含上传人像图片识别接口),windows,IDEA,Springboot
java集成opencv(不踩坑),实现人脸检测小demo(含上传人像图片识别接口),windows,IDEA,Springboot
295 0
|
1月前
|
存储 传感器 算法
相机标定系列---opencv相关标定算子
相机标定系列---opencv相关标定算子
|
1月前
|
存储 新制造 C#
Baumer工业相机堡盟工业相机如何使用OpenCV实现相机图像的显示(C#)
Baumer工业相机堡盟工业相机如何使用OpenCV实现相机图像的显示(C#)
36 1
|
1月前
|
监控 API 计算机视觉
OpenCV这么简单为啥不学——2、逐帧播放视频(VideoCapture函数、waitKey函数、0xFF == ord(‘1‘))
OpenCV这么简单为啥不学——2、逐帧播放视频(VideoCapture函数、waitKey函数、0xFF == ord(‘1‘))
40 0
|
1月前
|
机器学习/深度学习 传感器 算法
带你了解OpenCV4工业缺陷检测的六种方法
带你了解OpenCV4工业缺陷检测的六种方法
66 0
|
1月前
|
机器学习/深度学习 传感器 算法
OpenCV4工业缺陷检测的六种方法
OpenCV4工业缺陷检测的六种方法
144 0