所需要硬件及软件环境:

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 functionmtx.unlock();return;}
}int main()
{//读图thread t1(captureThread);t1.join();//已经读图captureOpen = true;//并行处理thread t2(processingThread, image);t2.join();return 0;
}

Python代码:

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'):breakif __name__=='__main__':p1=threading.Thread(target=Receive)p2 = threading.Thread(target=Display)p1.start()p2.start()

参考

OpenCV 之 网络摄像头 - 飞鸢逐浪 - 博客园

解决Python OpenCV 读取IP摄像头(RTSP等)出现error while decoding的问题_darkeyers的博客-CSDN博客

[常用工具] OpenCV获取网络摄像头实时视频流相关推荐

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

    1.RTSP协议 RTSP (Real Time Streaming Protocol),是一种语法和操作类似 HTTP 协议,专门用于音频和视频的应用层协议. 和 HTTP 类似,RTSP 也使用 ...

  2. C#通过OpenCv获取网络摄像头(IP摄像头)拍摄到的视频

    @TOC 本文介绍 本文介绍利用C#获取IP摄像头拍摄到的实时视频 说在前面 首先需要一台支持rtsp协议的网络摄像头(购买的时候会有说明,或者问客服) 环境:visual studio 2017 网 ...

  3. 利用opencv获取网络摄像头数据并显示报错 select() timeout

    opencv官网demo-Capture Video from Camera : import numpy as np import cv2 as cv cap = cv.VideoCapture(0 ...

  4. 网络摄像头python_Python OpenCV 调用网络摄像头

    OpenCV调用摄像头 环境 python:python3.6 摄像头:网络摄像头 Python库:openCV # -*- coding: utf-8 -*- # @author leone # @ ...

  5. OpenCV 调用网络摄像头

    OpenCV调用摄像头 环境 python:python3.6 摄像头:网络摄像头 Python库:openCV # -*- coding: utf-8 -*-# @author leone # @d ...

  6. ROS系列——ONVIF Device Test Tool测试工具获取网络摄像头的rtsp

    ROS系列--ONVIF Device Test Tool测试工具获取网络摄像头的rtsp 1.说明 2.ONVIF Device Test Tool工具下载及安装 3.连接网络摄像头 4.获取视频测 ...

  7. 使用Python,OpenCV实现图像和实时视频流中的人脸模糊和马赛克

    使用Python,OpenCV实现图像和实时视频流中的人脸模糊和人脸马赛克 1. 效果图 2. 原理 2.1 什么是人脸模糊,如何将其用于人脸匿名化? 2.2 执行人脸模糊/匿名化的步骤 3. 源码 ...

  8. opencv 打开网络摄像头

    闲着没事从同学那里找到了个openwrt   ,突然间想起来OPENCV可以很轻松的打开自带的摄像头,刚开始学习OPENCV 打开过若干次笔记本的摄像头,OPENCV能否打开网络摄像头呢?在百度上搜资 ...

  9. 使用ONVIF Device Test Tool获取网络摄像头的音/视频

    软/硬件准备 1.一个网络摄像头(IPC),品牌必须支持ONVIF协议,具体哪些品牌支持不作为本教程介绍的重点,大家可自行度娘,我知道的有品牌大华和海康威视; 2.ONVIF Device Test ...

最新文章

  1. go语言linux环境配置nginx,搭建wss
  2. Cloud for Customer UI designer自动生成的一些模型
  3. linux 查看网卡是否万兆_linux 如何查看网卡带宽
  4. 原生xgboost与sklearn里的xgboost
  5. Spring5+CXF整合开发REST之一次坑旅
  6. 第六章 ---- 面向对象(三)
  7. Nginx学习---Nginx的详解_【all】
  8. php实现排序,PHP实现各种排序
  9. 北理计算机考研复试经验贴
  10. azure java sdk_用于 Azure 媒体服务的 Java SDK 使用入门 | Microsoft Docs
  11. Day-4 三国演义目录爬取,requests请求,bs4数据分析的应用
  12. 江湖之事(一)之WPS office 与 MS office 第一篇
  13. pygame 窗口标题和图标设置
  14. 网络服务器是指带有大容量硬盘的计算机,中国人民大学网络教育201812统考计算机模拟题...
  15. ws2812C驱动示例主控芯片为HC32F460系列
  16. 16.【Linux】window和linux下文件格式相互转换
  17. 用C#+Selenium+ChromeDriver 生成我的咕咚跑步路线地图
  18. ACL 2021 | ChineseBERT:香侬科技提出融合字形与拼音信息的中文预训练模型
  19. IDEA安装插件提示was not installed: Cannot download解决办法
  20. python爬虫网页超链接_Python爬虫获取网页上的链接

热门文章

  1. 奇迹私服服务器端npc修改,奇迹教程-奇迹EX802 NPC商店修改教程与NPC编号查询
  2. 机器视觉系统硬件1:光源
  3. 最笨的方法打印出Linux系统 可爱的企鹅图标
  4. wxapkg反编译后的数据_反编译微信小程序
  5. 深入到系统组件是否白盒测试_南京豪之诺软件测试:白盒、黑盒、灰盒优缺点(知识普及)...
  6. SoundTouch 变速不变调
  7. 【网易算法提前批】平分物品
  8. 浪潮服务器设置断电后自启
  9. telnet服务器端口
  10. 苹果x怎么投屏到电视_苹果手机怎么连接、投屏电视?一招解决,看完涨知识了...