#yyds干货盘点#

Posted sjingx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了#yyds干货盘点#相关的知识,希望对你有一定的参考价值。

宇视科技RTSP

rtsp://{用户名}:{xx}@{ip}:{port}/video1/2/3,分别对应主/辅/三码流;

比如:

rtsp://admin:admin@10.11.3.11:554/video1,就表示主码流;

rtsp://admin:admin@192.168.8.8:554/video2,表示子码流;

rtsp://admin:admin@192.168.8.8:554/video3,表示3码流;

opencv获取IP摄像头(IP-camera)实时视频流

如何通过网络摄像头(web camera)获取实时视频流,但是这种方法的缺陷就是摄像头和主机必须连在一起,那这种在室外部署的时候就会非常麻烦并且不安全,所以后来找了下用海康威视或者大华的监控摄像头,然后通过IP地址可以无线获取视频流,这样就实现了主机和摄像头分开,方便部署。

1.设备

这里用的是海康的鱼眼摄像头,型号是DS-2CD3955FWD-IWS,其实基本上能支持sdk二次开发的IP摄像头都可以。鱼眼摄像头相比普通的摄像头经过扭曲,因此在应用的时候一般需要进行反扭曲,这一步会造成比较大的延迟,因此没有不是特定需求的话尽量使用普通的就可以。

注:海康的萤石系列貌似并不能通过RTSP地址获取,而这里的方法需要用RTSP进行视频流获取,所以无法萤石系列就不在此列。

2.通过RTSP地址获取视频流

首先需要知道海康设备的RTSP地址,可以通过这里进行查看。

import cv2source = ""rtsp://admin:12345@192.168.1.64/Streaming/Channels/1"

: admin和12345分别是ip camera的用户名和xx,在浏览器上第一次登录摄像头的时候会进行设置;

192.168.1.64是摄像头的默认IP,在浏览器中输入即可进入登录页面(如下);

#yyds干货盘点#_服务端

Channels/1和Channels/2分别对应主码流和子码流地址,两者的分辨率不同。IP摄像头无法通过opencv调节分辨率,只能在海康的监控界面的配置进行设置(如下)。

#yyds干货盘点#_码流_02


这个网络摄像头需要一个客户端和服务端,客户端使用opencv捕捉摄像头,通过socket将图片流传输到服务端,服务端接受图片流,使用HTTPServer渲染生成一个简单的网页,将图片流用mjpeg的方式传输到浏览器中,这样就可以直接用浏览器来查看摄像头视频了。主要的实现方式就是这样的,下面详细介绍下。

安装依赖

首先需要在客户端安装opencv,安装方式可以Google下,这里就不再赘述了,服务端需要安装pillownumpy这两个模块。

实现代码

首先是客户端的代码:

import io
import socket
import struct
import time
import datetime
import cv2

client_socket = socket.socket()
client_socket.connect((服务端ip地址或域名, 8002))

connection = client_socket.makefile(wb)
try:
#打开摄像头
cap = cv2.VideoCapture(0)
while (1):
#读取图片
ret, frame = cap.read()
# cv2.imshow("capture", frame)
if cv2.waitKey(1) & 0xFF == ord(q):
break
#转换为jpg格式
img_str = cv2.imencode(.jpg, frame)[1].tostring()
#获得图片长度
s = struct.pack(<L, len(img_str))
# print(s)
#将图片长度传输到服务端
connection.write(s)
connection.flush()
# 传输图片流
connection.write(img_str)
connection.flush()

except Exception as e:
print(e)
finally:
connection.close()
client_socket.close()

简单说明下,将代码中的服务端ip地址或域名修改为你自己的,或者本地地址也可以。 下面是服务端的代码:
import socket
import struct
from PIL import Image
import numpy
import io
import logging
import socketserver
from threading import Condition
from http import server

server_socket = socket.socket()
# 绑定socket通信端口
server_socket.bind((0.0.0.0, 8002))
server_socket.listen(0)

connection = server_socket.accept()[0].makefile(rb)

PAGE = """\\
<html>
<head>
<title>camera MJPEG streaming demo</title>
</head>
<body>
<h1>PiCamera MJPEG Streaming Demo</h1>
<img src="stream.mjpg" />
</body>
</html>
"""


class StreamingOutput(object):
def __init__(self):
self.frame = None
self.buffer = io.BytesIO()
self.condition = Condition()

def write(self, buf):
if buf.startswith(b\\xff\\xd8):
self.buffer.truncate()
with self.condition:
self.frame = self.buffer.getvalue()
self.condition.notify_all()
self.buffer.seek(0)
return self.buffer.write(buf)


class StreamingHandler(server.BaseHTTPRequestHandler):
def do_GET(self):
if self.path == /:
self.send_response(301)
self.send_header(Location, /index.html)
self.end_headers()
elif self.path == /index.html:
content = PAGE.encode(utf-8)
self.send_response(200)
self.send_header(Content-Type, text/html)
self.send_header(Content-Length, len(content))
self.end_headers()
self.wfile.write(content)
elif self.path == /stream.mjpg:
self.send_response(200)
self.send_header(Age, 0)
self.send_header(Cache-Control, no-cache, private)
self.send_header(Pragma, no-cache)
self.send_header(Content-Type, multipart/x-mixed-replace; boundary=FRAME)
self.end_headers()
try:
while True:
#获得图片长度
image_len = struct.unpack(<L, connection.read(struct.calcsize(<L)))[0]
print(image_len)
if not image_len:
break

image_stream = io.BytesIO()
#读取图片
image_stream.write(connection.read(image_len))

image_stream.seek(0)
image = Image.open(image_stream)
cv2img = numpy.array(image, dtype=numpy.uint8)
imgbuffer = image_stream.getvalue()
#写入http响应
self.wfile.write(b--FRAME\\r\\n)
self.send_header(Content-Type, image/jpeg)
self.send_header(Content-Length, len(imgbuffer))
self.end_headers()
self.wfile.write(imgbuffer)
self.wfile.write(b\\r\\n)


except Exception as e:
logging.warning(
errror streaming client %s: %s,
self.client_address, str(e))

else:
self.send_error(404)
self.end_headers()


class StreamingServer(socketserver.ThreadingMixIn, server.HTTPServer):
allow_reuse_address = True
daemon_threads = True


output = StreamingOutput()

try:
address = (127.0.0.1, 8000)
server = StreamingServer(address, StreamingHandler)
server.serve_forever()
except Exception as e:
print(e)



以上是关于#yyds干货盘点#的主要内容,如果未能解决你的问题,请参考以下文章

#yyds干货盘点#JS两个大数相加

#yyds干货盘点#愚公系列2023年02月 .NET/C#知识点-程序运行计时的总结

#yyds干货盘点#带大家认识Golang中的切片数据类型

# yyds干货盘点 # 盘点一份JS逆向代码转换为Python代码的教程

#yyds干货盘点# springcloud整合stream消费自己生产的消息

#yyds干货盘点# springcloud整合Sentinel使用Nacos存储规则