首页 > 其他分享 >RTSP流截图并剔除花屏图片

RTSP流截图并剔除花屏图片

时间:2024-01-18 16:55:45浏览次数:65  
标签:截图 int self RTSP cv2 score def frame 花屏

大致代码如下:

import cv2
import numpy as np
from fastapi import HTTPException

RgbRangeType = tuple[tuple[int, int, int], tuple[int, int, int]]


class ValidationError(HTTPException):
    def __init__(self, detail: str, status_code=400) -> None:
        super().__init__(detail=detail, status_code=status_code)


class PictureHouse:
    min_score = 250
    delta_score = 50

    def __init__(self, last_score: int = 0) -> None:
        self.last_score = last_score

    @staticmethod
    def check_rgb(
        frame: np.ndarray, rgb_range: RgbRangeType | None = None, thresthold=1000
    ) -> bool:
        """检测符合rgb区域值的点数,是否在阈值范围内"""
        if rgb_range is None:
            rgb_range = ((0, 130, 0), (5, 140, 5))  # 绿点
        pixels = cv2.countNonZero(cv2.inRange(frame, *rgb_range))  # type:ignore
        return pixels < thresthold

    @staticmethod
    def lap_score(frame: np.ndarray) -> int:
        """拉普拉斯法对图片进行评分"""
        img2gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)  # 将图片压缩为单通道的灰度图
        score = cv2.Laplacian(img2gray, cv2.CV_64F).var()  # type:ignore[attr-defined]
        return int(score)

    def is_avaliable(self, frame: np.ndarray) -> bool:
        """排除花屏、无画面的图片"""
        result = False
        score = self.lap_score(frame)
        if (last := self.last_score) and score >= self.min_score:
            result = abs(score - last) <= self.delta_score and self.check_rgb(frame)
        self.last_score = score
        return result


class RtspCapture(cv2.VideoCapture):
    def __init__(self, url: str, timeout=10) -> None:
        # 使用GPU加速https://www.jianshu.com/p/733d7311c509
        gpu_args = [cv2.CAP_PROP_HW_ACCELERATION, cv2.VIDEO_ACCELERATION_ANY]
        super().__init__(url, cv2.CAP_FFMPEG, gpu_args)
        self.set(cv2.CAP_PROP_POS_MSEC, timeout * 1000)
        self._url = url

    def close(self) -> None:
        self.release()

    def pick_out(self, total=30) -> np.ndarray:
        image_filter = PictureHouse()
        for _ in range(total):
            success, frame = self.read()
            if success and image_filter.is_avaliable(frame):
                break
        else:
            raise ValidationError(f"Invalid {total} frames ({self._url})")
        return frame

    def screenshot(self) -> np.ndarray:
        with closing(self) as cap:
            if not cap.isOpened():
                raise ValidationError(f"Failed to open stream: {self._url}")
            return cap.pick_out()


async def capture_one(redis, data, frame_index, timeout=10) -> bytes:
    rtsp_url = await ask_rtsp_url(redis, data)
    frame = RtspCapture(rtsp_url, timeout).screenshot()
    return cv2.imencode(".jpg", frame)[1].tobytes()

标签:截图,int,self,RTSP,cv2,score,def,frame,花屏
From: https://www.cnblogs.com/waketzheng/p/17972870

相关文章

  • Android平台Unity下如何通过WebCamTexture采集摄像头数据并推送至RTMP服务器或轻量级R
    技术背景我们在对接Unity下推送模块的时候,遇到这样的技术诉求,开发者希望在Android的Unity场景下,获取到前后摄像头的数据,并投递到RTMP服务器,实现低延迟的数据采集处理。在此之前,我们已经有了非常成熟的RTMP推送模块,也实现了Android平台Unity环境下的Camera场景采集,针对这个技术需求,......
  • RTSP/Onvif安防视频云平台EasyNVR迁移盘符后启动异常的问题排查与解决
    EasyNVR安防视频云平台可支持设备通过RTSP/Onvif协议接入,并进行视频流的处理及分发,在视频监控场景中可实现视频实时监控直播、云端录像、云存储、录像检索与回看、告警、级联等,平台能将拉取过来的音视频流转化成适合全平台播放的RTMP、RTSP、hTTP-FLV、Websocket-FLV、HLS、WebRTC......
  • rtsp视频网页播放
    注意:目前都在windows上使用,服务器安装部署多多少少有些问题。1、WebRtcStreamergithub:https://github.com/mpromonet/webrtc-streamer/releases但是经常打不开,如果有需要私信我,因为太忙了没时间放网盘,见谅里面有windows版也有linux版的在本地使用,进入exe目录 启动,默认......
  • Gstreamer Rtspsrc连接大华摄像头失败原因及解决
    先说解决办法sudoapt-getremovegstreamer1.0-plugins-ugly分析过程和原因输入命令gst-launch-1.0rtspsrclocation="rtsp/url"!fakesink终端输出如下SettingpipelinetoPAUSED...PipelineisliveanddoesnotneedPREROLL...Progress:(open)OpeningStre......
  • Android平台RTMP推送|轻量级RTSP服务|GB28181设备接入模块之实时快照保存JPG还是PNG?
    JPG还是PNG?JPG和PNG是两种常见的图片文件格式,在压缩方式、图像质量、透明效果和可编辑性等方面存在显著差异。压缩方式:JPG是一种有损压缩格式,通过丢弃图像数据来减小文件大小,因此可能会损失一些图像细节和质量。而PNG使用的是无损压缩格式,它不会丢失任何原始图像数据,从而保持了图像......
  • LiveNVR监控流媒体Onvif/RTSP常见问题-如何配置快照目录快照存储默认目录目录如何配置
    LiveNVR监控流媒体Onvif/RTSP常见问题-如何配置快照目录快照存储默认目录目录如何配置?1、快照目录2、指定快照目录3、RTSP/HLS/FLV/RTMP拉流Onvif流媒体服务1、快照目录部署LiveNVR后,配置通道上线后,会在LiveNVR部署的服务器里面存储对应的最新快照,默认的快照目录是LiveNVR解......
  • ubuntu怎么设置快捷键?(依照选取截图为例)
    本次的实验环境是ubuntu18.04第一步:点击下三角第二步:打开设置第三步:点开后的界面如下,滑到底端选择设备第四步:点击键盘选项,然后按照图中标签进行修改即可!其他快捷键也皆可以如此修改!......
  • Linux Debian12系统gnome桌面环境默认截屏截图工具gnome-screenshot
    一、简介:在Debian12中系统gnome桌面环境默认提供一个截图捕获工具screenshot,可以自定义区域截图、屏幕截图、窗口截图和录制视频,截图默认保存在“~/图片/截图”路径下。可以在应用程序中搜索screenshot,如下图:也可以在桌面右上角找到screenshot截图工具,如下图:二、快捷键截......
  • 安卓期末大作业-记账app(含源码+导出app+运行截图)安卓期末大作业-记账app(含源码+导出ap
    安卓期末大作业-记账app(含源码+导出app+运行截图)开发软件:AndroidStudio开发语言:Java2023年上半年移动开发期末大作业记账app,老师给了95分,可以记录各种类型的账目支出记录,收入记录,存储到数据库中,可以隐藏账目记录,可以记录和删除记录,还可以将收支记录转图表分析,也可清空所有数据。具......
  • GB28181视频监控平台LiteCVR调用rtsp地址返回的IP不正确原因排查
    RTSP(Real-TimeStreamingProtocol)是一种用于控制实时流媒体传输的应用层协议。它被设计用于建立和管理客户端与媒体服务器之间的连接,以便实现实时音频、视频或其他交互式媒体内容的传输。RTSP允许客户端通过发送命令来控制流媒体服务器的播放、暂停、快进、倒带等操作。RTSP支持多......