OpenCV获取网络摄像头实时视频流

这篇具有很好参考价值的文章主要介绍了OpenCV获取网络摄像头实时视频流。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

参考文章:

  • [常用工具] OpenCV获取网络摄像头实时视频流_opencv网络摄像头
  • [常用工具] OpenCV获取网络摄像头实时视频流_opencv网络摄像头_落痕的寒假的博客-CSDN博客

方式一: 使用VideoCapture读取视频流

在使用OpenCv处理视频时,无论是视频文件还是摄像头画面,都要使用VideoCapture类来进行每一帧图像的处理。当我们使用视频文件作为参数时,OpenCv则打开视频文件,进行每一帧画面的读取。当我们传递摄像机编号时,OpenCv则打开相机,实时读取相机画面。
获取VideoCaptrue实例:

# 读取视频文件
cv2.VideoCapture('video.mp4')
# 打开摄像机
cv2.VideoCapture(0)

使用VideoCapture读取海康RTSP流

RTSP流

在使用OpenCv进行计算机视觉处理时,我们很多时候需要连接外部相机,如海康威视。监控相机的常见视频传输协议有:RTSP、RTMP(以RTSP为主)
RTSP与RTMP比较:

  •     RTSP:低时延,实现难度大,适合视频聊天和视频监控
  •     RTMP:低时延,实现难度大,适合视频聊天和视频监控

目前市面上的相机大多以RTSP流协议为主。
在读取海康相机时,需要使用VideoCapture读取RTSP流协议的内容,而不是通过相机编号直接读取。

"""
海康相机rtsp格式:rtsp://[username]:[password]@[ip]:[port]/[codec]/[channel]/[subtype]/av_stream
        username: 用户名。例如admin。
        password: 密码。例如12345。
        ip: 为设备IP。例如 192.0.0.64。
        port: 端口号默认为554,若为默认可不填写。
        codec:有h264、MPEG-4、mpeg4这几种。
        channel: 通道号,起始为1。例如通道1,则为ch1。
        subtype: 码流类型,主码流为main,辅码流为sub。
"""

使用VideoCapture读取RTSP流示例:

# 使用rtsp流打开相机
def open_camera(username: str, password: str, ip: str, port: int):
    """
    使用rtsp流打开相机
    rtsp格式:rtsp://[username]:[password]@[ip]:[port]/[codec]/[channel]/[subtype]/av_stream
        username: 用户名。例如admin。
        password: 密码。例如12345。
        ip: 为设备IP。例如 192.0.0.64。
        port: 端口号默认为554,若为默认可不填写。
        codec:有h264、MPEG-4、mpeg4这几种。
        channel: 通道号,起始为1。例如通道1,则为ch1。
        subtype: 码流类型,主码流为main,辅码流为sub。
    :return:相机是否打开,相机
    """
    try:
        # 使用rtsp流打开相机
        cam = cv2.VideoCapture(f'rtsp://{username}:{password}@{ip}:{port}/h264/ch1/main/av_stream')
        return True, cam

    except cv2.error:
        # 捕获cv异常
        # 打开相机失败
        return False, None

优化后代码:

import queue
import threading

import cv2


class CameraThread(threading.Thread):
    # 保存实例化相机,通过实例化相机操作相机
    camera = None
    # 保存每一帧从rtsp流中读取到的画面
    queue_image = queue.Queue(maxsize=10)

    # 线程体是否循环执行标志
    flag_run = False

    # 相机线程调用函数
    def run(self) -> None:
        while self.flag_run:
            try:
                # 捕获异常,避免读取视频操作因异常而退出
                # 相机实例存在,判断相机是否打开
                if self.camera.is_opened():
                    # 相机已打开,读取相机内容
                    ret, frame = self.camera.read()
                    if not ret or frame is None:
                        # 读取相机内容失败
                        break
                    if ret:
                        # 将内容添加到队列中
                        # 判断队列是否满
                        if self.queue_image.full():
                            # 队列满,队头出队
                            self.queue_image.get()
                            # 队尾添加数据
                            self.queue_image.put(frame)
                        else:
                            # 队尾添加数据
                            self.queue_image.put(frame)
            except cv2.error as error:
                # 捕获cv异常
                # 因为子线程会一直调用该程序,可对捕获到的异常不进行处理
                print(error)
                pass

            except Exception as error:
                # 捕获Exception异常
                print(error)
                pass

    # setter:设置相机的camera对象
    def set_camera(self, camera):
        """
        设置相机的camera对象
        """
        # 设置相机的camera
        self.camera = camera

    # 获取队列中的RGB图像
    def get_image(self):
        """
        获取队列中的RGB图像
        :return: img: RGB图像
        """
        # 读取队列中的图片
        img = self.queue_image.get()
        # img为None,读取失败,队列还未获取到图片
        while img is None:
            # 一直读取图片,直到读取图片成功
            img = self.queue_image.get()
        # 返回读取到的内容
        return img

    # 停止运行
    def run_stop(self):
        self.flag_run = False

    # 开始运行
    def run_start(self):
        self.flag_run = True


方式二: 所需要硬件及软件环境:

python 3/OpenCV3.4 or C++11/OpenCV3.4

1 RTSP协议

RTSP (Real Time Streaming Protocol),是一种语法和操作类似 HTTP 协议,专门用于音频和视频的应用层协议。 和 HTTP 类似,RTSP 也使用 URL 地址。同时我们也要了解到摄像机传输数据用的是码流,高清网络摄像机产品编码器都会产生两个编码格式,称为主码流和子码流。这就叫双码流技术。目的是用于解决监控录像的本地存储和网络传输的图像的质量问题。双码流能实现本地和远程传输的两种不同的带宽码流需求,本地传输可以用主码流,能获得更清晰的存储录像,远程传输就因为带宽限制的原因,而使用子码流来获得流畅的图像和录像。通过RTSP协议传输不同的码流,但是各大摄像头厂家的RTSP协议地址不大一样。通常你只要知道摄像头IP地址,用户名密码就行了。

海康的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协议地址如下: 

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协议地址如下:

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

2 OpenCV中读取网络摄像头

OpenCV读取网络摄像头很简单,直接用url设定rtsp地址,用VideoCapture读取视频就行了。但是RTSP有些许问题,所以在最后通过TCP传输协议上承载RTSP,保证稳定性。就在rtsp地址后面加?tcp

    String url = "rtsp://admin:123456@114.114.114.114/ch1-s1?tcp";
    //海康
    //"rtsp://admin:123456@114.114.114.114/ch1-s1?tcp"
    //大华
    //“rtsp://admin:123456@114.114.114.114/cam/realmonitor?channel=1&subtype=1?tcp”
    //宇视
    //"rtsp://admin:123456@114.114.114.114/video1?tcp"
 
    VideoCapture cap(url);
    Mat frame;
    cap>>frame;

但是直接按上面的方法来读取视频,会出问题,通常都是error while decoding,读不了码流,也就是读到一半就失败。这个会导致程序异常。

这是由于OpenCV中FFMPEG Lib对在rtsp协议中的H264 vidos不支持或者OpenCV版本太低,所以处理办法就是自己写两个不同的线程单独去处理接收每一帧的图像,然后另一个线程处理这每一帧的图像。思路如下:使用队列,基于pthread类采取先入先出策略,在一个线程中开始接收数据,在另一个线程中处理逐帧数据。

这样就可以实时获得网络摄像头数据啦,获得Mat格式图像,具体代码如下:

 C++代码:
 

 
//并行
#include <thread>
//互斥访问
#include <mutex>
 
 
//是否打开视频
bool captureOpen = false;
//读取的每张图像
Mat image;
VideoCapture capture;
 
//网络链接地址
String url = "rtsp://admin:123456@114.114.114.114/ch1-s1?tcp";
 
//加锁器
mutex mtx;
//是否读图成功
bool imgready = false;
 
/**
 * @brief 读图
 * 
 * @return Mat 
 */
Mat captureThread()
{
	if (captureOpen == false || image.empty())
	{
		//打开图像
		capture.open(url);
	}
	while (1)
	{
		//加锁
		mtx.lock();
 
		capture >> image;
		//读图成功
		imgready = true;
 
		//解锁
		mtx.unlock();
 
		return image;
	}
}
 
/**
 * @brief 处理函数
 * 
 * @param image 输入图像
 */
void processingThread(Mat image)
{
	//如果读图成功
	if (imgready)
	{
		//如果图像为空
		if (image.empty())
		{
			return;
		}
		mtx.lock();
		//你的处理函数
        //your function
		mtx.unlock();
		return;
	}
}
 
 
int main()
{
	//读图
	thread t1(captureThread);
	t1.join();
	//已经读图
	captureOpen = true;
	//并行处理
	thread t2(processingThread, image);
	t2.join();
 
	return 0;
}

Python代码:文章来源地址https://www.toymoban.com/news/detail-428111.html

import cv2
import queue
import time
import threading
q=queue.Queue()
 
def Receive():
    print("start Reveive")
    cap = cv2.VideoCapture("rtsp://admin:admin_123@172.0.0.0")
    ret, frame = cap.read()
    q.put(frame)
    while ret:
        ret, frame = cap.read()
        q.put(frame)
 
 
def Display():
     print("Start Displaying")
     while True:
         if q.empty() !=True:
            frame=q.get()
            cv2.imshow("frame1", 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()

到了这里,关于OpenCV获取网络摄像头实时视频流的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 记录对接海康威视摄像头web端实时预览:Linux+ffmpeg+nginx转换RTSP视频流(完整版实现)

            需求:web端实现海康摄像头实时预览效果         由于市面上大部分网络摄像头都支持RTSP协议视频流,web端一般无法直接使用RTSP实现视频预览,本篇使用ffmpeg对视频流进行转换,最终实现web端实时预览。         工具介绍:ffmpeg、nginx、vue         介

    2024年01月25日
    浏览(56)
  • WSL2通过OpenCV调用并展示本机摄像头的RTSP视频流

    本篇博客的由来如上图哈哈,WSL2 相关安装教程可以参考我之前的博客:Win11安装WSL2和Nvidia驱动 更多文章欢迎来我的博客小站看呀,会有更多的技术细节~ ubuntu上请执行 或者编译安装 如果报错 Could NOT find OpenSSL ,安装如下依赖即可解决 下载解压 EasyDarwin Easydarwin是国内团队开

    2024年02月09日
    浏览(77)
  • Unity3d 获取场景中摄像头视频流,实现直播效果(无需代码)

    下面是具体操作流程:   1. 搭建服务器,选用github 一个开源的 node.js服务器。 下载地址GitHub - iizukanao/node-rtsp-rtmp-server: RTSP/RTMP/HTTP hybrid server,点击克隆,选择ZIP下载。  2. 下载node.js( 官网链接 Node.js)   选择下载最新版本,并根据提示一步步安装即可。 3.搭建服务器。 找到

    2023年04月08日
    浏览(42)
  • 网络摄像头-流媒体服务器-视频流客户端

    当涉及交通事件检测算法和摄像头视频数据处理时,涉及的代码案例可能会非常复杂,因为这涉及到多个组件和技术。以下是一个简单的Python代码示例,演示如何使用OpenCV库捕获摄像头视频流并进行实时车辆检测,这是一个常见的交通事件检测任务。请注意,这只是一个入门

    2024年02月09日
    浏览(65)
  • Qt推流程序自动生成网页远程查看实时视频流(视频文件/视频流/摄像头/桌面转成流媒体rtmp+hls+webrtc)

    推流程序将视频流推送到流媒体服务器后,此时就等待验证拉流播放,一般可以选择ffplay命令行播放或者vlc等播放器打开播放,也可以选择网页直接打开拉流地址播放,一般主流的浏览器都支持网页直接播放hls/m3u8/webrtc类型的视频流,而且推流的主要目的可能就是为了能够在

    2024年02月05日
    浏览(80)
  • WSL2 ubuntu子系统OpenCV调用本机摄像头的RTSP视频流做开发测试

    由于WSL2环境与主机系统隔离,访问本机摄像头是有限的,但是,可以通过第三方库或网络摄像头来解决这个问题,本文将本地摄像头通过rtsp流来给WSL2访问。 详见链接:https://blog.csdn.net/weixin_46119406/article/details/132271955?spm=1001.2014.3001.5501 Easydarwin是国内团队开发的开源流媒体框架

    2024年02月11日
    浏览(46)
  • YOLOV5-LITE实时目标检测(onnxruntime部署+opencv获取摄像头+NCNN部署)python版本和C++版本

    使用yolov5-lite自带的export.py导出onnx格式,图像大小设置320,batch 1 之后可以使用 onnxsim对模型进一步简化 onnxsim参考链接:onnxsim-让导出的onnx模型更精简_alex1801的博客-CSDN博客 这个版本的推理FPS能有11+FPS 这两处换成自己的模型和训练的类别即可:     parser.add_argument(\\\'--modelpa

    2024年02月04日
    浏览(51)
  • Java获取实时摄像头进行拍照(附源码)

    Java是一种通用编程语言,可以用来开发各种类型的应用程序,包括涉及图像处理和相机操作的应用程序。         要在Java中获取实时摄像头进行拍照,通常会借助一些 第三方库或API ,例如 OpenCV(Open Source Computer Vision Library) 或 Java Media Framework(JMF) 等。这些库和API提

    2024年01月25日
    浏览(45)
  • 如何获取当前摄像头实时画面(或说图片)

    可以使用所在平台提供的摄像头接口或第三方库来获取当前摄像头实时画面(或图片),具体实现方式可能因不同平台和库而异。以下是几个常见平台的示例方法: 在 Windows 平台上,可以使用 DirectShow 或 Media Foundation API 获取摄像头实时画面。 在 macOS 平台上,可以使用 AVFo

    2024年02月10日
    浏览(55)
  • Android实时获取摄像头画面传输至PC端

    最近在做一个PC端小应用,需要获取摄像头画面,但是电脑摄像头像素太低,而且位置调整不方便,又不想为此单独买个摄像头。于是想起了之前淘汰掉的手机,成像质量还是杠杠的,能不能把手机摄像头连接到电脑上使用呢?经过搜索,在网上找到了几款这类应用,但是都

    2024年02月12日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包