计算每秒发送的帧数 opencv

如何解决计算每秒发送的帧数 opencv

我有以下代码,我正在计算从客户端到服务器每秒发送帧所需的时间,基本上计算帧丢失率和响应时间的百分比,并且通信模式是异步的。 现在我在计算这两个指标时遇到了一些问题,对于响应所需的时间,我将延迟设置为超过 5 秒,因为由于网络和服务器的处理速度,将结果发送回客户端需要时间,因此延迟更长,但对于每秒帧数,我需要计算每秒从客户端发送到服务器的帧数,我将如何在 data_rate 方法中计算此值。两个指标都需要不同的时间延迟,我不能对两个指标使用相同的时间延迟。非常感谢有关如何在代码中定义它的帮助。

IMAGE_FOLDER = "videoframe"
FPS = 5
SERVER_A_ADDRESS = "tcp://localhost:5555"
ENDPOINT_HANDLER_ADDRESS = "tcp://*:5553"
SERVER_A_TITLE = "SERVER A"
SERVER_B_TITLE = "SERVER B"
context = zmq.Context()
socket_server_a = context.socket(zmq.PUSH)
socket_server_endpoint = context.socket(zmq.PULL)

socket_server_a.connect(SERVER_A_ADDRESS)
socket_server_endpoint.bind(ENDPOINT_HANDLER_ADDRESS)

destination = {
 "currentSocket": socket_server_a,"currentServersTitle": SERVER_A_TITLE,"currentEndpoint": SERVER_B_TITLE,}

running = True
endpoint_responses = 0
frame_requests = 0
filenames = [f"{IMAGE_FOLDER}/frame{i}.jpg" for i in range(1,2522)]

def handle_endpoint_responses():
  global destination,running,endpoint_responses
  while running:
    endpoint_response = socket_server_endpoint.recv().decode()
    endpoint_responses += 1
def data_rate():
  global destination,endpoint_responses,frame_requests
  while running:
    before_received = endpoint_responses ###
    time.sleep(5)
    after_received = endpoint_responses
    before_sent = frame_requests
    time.sleep(1)
    after_sent = frame_requests ###
    print(25 * "#")
    print(f"{time.strftime('%H:%M:%S')} ( i ) : receiving model results: {round((after_received - before_received) / 5,2)} per second.")
    print(f"{time.strftime('%H:%M:%S')} ( i ) : sending frames: {round((after_sent - before_sent) / 1,2)} per second.")
    print(25 * "#")
def send_frame(frame,frame_requests):
  global destination,running
  try:
    frame = cv2.resize(frame,(224,224))
    encoded,buffer = cv2.imencode('.jpg',frame)
    jpg_as_text = base64.b64encode(buffer)
    destination["currentSocket"].send(jpg_as_text)
  except Exception as Error:
    running = False
def main():
 global destination,frame_requests
 interval = 1 / FPS
 while running:
    for img in filenames:
        frame = cv2.imread(img)
        frame_requests += 1
        threading.Thread(target=send_frame,args=(frame,frame_requests)).start()
        time.sleep(interval)
 destination["currentSocket"].close()
if __name__ == "__main__":
  threading.Thread(target=handle_endpoint_responses).start()
  threading.Thread(target=data_rate).start()
  main()

解决方法

不仅是服务器时间,打开图片也需要时间,使用 sleep interval = 1/FPS 也可能导致丢帧,即产生的帧比可能的少(如果离线播放也一样)。对于播放,如果使用睡眠完成,间隔可以更短,并且可以在循环中检查当前时间,如果时间合适 - 发送下一帧,如果不是 - 等待。如果目标是服务器端在实际帧时间显示或处理图像,则延迟也可以是自适应的,并且该时间可以在线性周期之前,以补偿传输延迟。

我认为您必须每次都通过初始握手或作为交易的一部分来同步/测量客户端和服务器的时钟差异,并包括并记录发送/接收的时间事务/日志。

这样你就可以测量传输的一些平均延迟。

另一件可能会提示的事情是最初播放图像而不发送它们。这将显示 cv2.imread(...) 和预处理需要多少时间。

即注释/添加另一个没有目标的函数["currentSocket"].send(jpg_as_text)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)> insert overwrite table dwd_trade_cart_add_inc > select data.id, > data.user_id, > data.course_id, > date_format(
错误1 hive (edu)> insert into huanhuan values(1,'haoge'); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive> show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 <configuration> <property> <name>yarn.nodemanager.res