找回密码
 会员注册
查看: 24|回复: 0

python接入rtsp视频,并实时框人员推送给rtsp流媒体服务器

[复制链接]

2万

主题

0

回帖

7万

积分

超级版主

积分
72039
发表于 2024-9-8 10:49:55 | 显示全部楼层 |阅读模式
要实现Python显示RTSP视频流、实时框出画面中的人员,并将带有框的视频以RTSP格式推送给流媒体服务器,您需要使用支持RTSP推流的库或工具。由于OpenCV的cv2.VideoWriter并不直接支持RTSP推流,这里推荐使用ffmpeg作为中介,结合ffmpeg-python库来实现这一功能。以下是详细的步骤:步骤一:获取RTSP视频流并进行人员检测使用OpenCV读取RTSP视频流并进行人员检测(这里仍以人脸检测为例,您可以替换为其他人员检测模型)。同时,为了将检测结果叠加到原视频流上,我们需要保留原视频帧和检测到的人员框信息:pythonimportcv2rtsp_url='rtsp://your_rtsp_stream_url'cap=cv2.VideoCapture(rtsp_url)ifnotcap.isOpened():print("CouldnotopenRTSPstream.")exit(-1)face_cascade=cv2.CascadeClassifier(cv2.data.haarcascades+'haarcascade_frontalface_default.xml')whileTrue:ret,frame=cap.read()ifnotret:print("Failedtoreadframe.")breakgray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)faces=face_cascade.detectMultiScale(gray,scaleFactor=1.1,minNeighbors=5,minSize=(30,30))#存储检测到的人员框信息person_boxes=[(x,y,x+w,y+h)for(x,y,w,h)infaces]#在原帧上绘制矩形框forboxinperson_boxes:cv2.rectangle(frame,(box[0],box[1]),(box[2],box[3]),(0,255,0),2)#显示带有框的帧(可选,仅用于本地调试)cv2.imshow('RTSPVideoStreamwithPersonDetection',frame)ifcv2.waitKey(1)&0xFF==ord('q'):break步骤二:使用ffmpeg将处理后的视频帧推送到RTSP服务器安装ffmpeg和ffmpeg-python库:bashpipinstallffmpeg-python接下来,使用ffmpeg-python库创建一个ffmpeg进程,将处理后的视频帧通过管道(pipe)传递给ffmpeg进行编码和RTSP推流:pythonimportsubprocessasspimportnumpyasnpfromffmpegimport(Input,Output,pipe,)#RTSP推流地址rtsp_output_url='rtsp://your_rtmp_server_address/stream_key'#创建一个空的Input对象作为输入源,使用管道接收数据input_pipe=Input(pipe='pipe:',format='rawvideo',pix_fmt='bgr24',s='{}x{}'.format(frame_width,frame_height))#创建RTSP输出对象output=Output(rtsp_output_url,vcodec='libx264',pix_fmt='yuv420p',r=fps)#启动ffmpeg进程,连接输入管道和输出RTSP地址ffmpeg_process=(input_pipe.global_args('-hide_banner').global_args('-loglevel','warning').output(output).run_async(pipe_stdin=True))whileTrue:ret,frame=cap.read()ifnotret:print("Failedtoreadframe.")breakgray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)faces=face_cascade.detectMultiScale(gray,scaleFactor=1.1,minNeighbors=5,minSize=(30,30))person_boxes=[(x,y,x+w,y+h)for(x,y,w,h)infaces]forboxinperson_boxes:cv2.rectangle(frame,(box[0],box[1]),(box[2],box[3]),(0,255,0),2)#将处理后的帧送入ffmpeg进程ffmpeg_process.stdin.write(frame.tobytes())#显示带有框的帧(可选,仅用于本地调试)cv2.imshow('RTSPVideoStreamwithPersonDetection',frame)ifcv2.waitKey(1)&0xFF==ord('q'):break#关闭输入管道,结束ffmpeg进程ffmpeg_process.stdin.close()ffmpeg_process.wait()在这个示例中:使用ffmpeg-python创建一个空的Input对象,指定格式为rawvideo,像素格式为bgr24,分辨率与原视频一致。创建一个Output对象,指定RTSP推流地址、编码器为libx264、像素格式为yuv420p,帧率为原视频帧率。启动ffmpeg进程,连接输入管道和输出RTSP地址。在主循环中,读取视频帧,进行人员检测,绘制矩形框,然后将处理后的帧以字节形式写入ffmpeg进程的stdin。本地调试时可选择显示带有框的帧,按'q'键退出。请注意,实际使用时需要根据您的流媒体服务器设置调整`rtsp_output...问答超时,请稍后再试
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2025-1-10 23:21 , Processed in 0.821605 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表