为什么我检索的正在读取的帧多于文件夹 pyzmq 中的帧
Why I am retrieving more frames being read than they are in folder pyzmq
我有以下代码发送从文件夹中读取的视频帧并发送到服务器。文件夹中总共有 511 帧,但我的代码在从文件夹中读取的输出 1000 帧中提供了更多帧。
SERVER_A_ADDRESS = "tcp://localhost:5555"
CLIENT_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(CLIENT_ADDRESS)
destination = {
"currentSocket": socket_server_a,
"currentServersTitle": SERVER_A_TITLE,
"currentEndpoint": SERVER_B_TITLE, }
running = True
endpoint_responses = 0
frame_count = 0
def send_frame(frame, frame_count):
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)
print(f"{strftime('%H:%M:%S')} ( + ) : {destination['currentServersTitle']} received frame {frame_count}")
except Exception as Error:
print(
f"{strftime('%H:%M:%S')} ( ! ) : Error frame {frame_count}\n\n> KILLING CONNECTIONS\n\nERROR MESSAGE: {Error}")
running = False
def main():
global destination, running, frame_count
filenames = [img for img in glob.glob("video-frames/*.jpg")]
fps = 5
interval = int(1 / fps)
while running:
filenames = sorted(filenames, key=os.path.getctime) or filenames.sort(key=os.path.getctime)
for img in filenames:
frame = cv2.imread(img)
frame_count += 1
threading.Thread(target=send_frame, args=(frame, frame_count)).start()
time.sleep(interval)
destination["currentSocket"].close()
if __name__ == "__main__":
main()
谢谢
Q : "Why I am retrieving more frames being read than they are in folder"
除了输入代码之外,代码很少做任何其他事情。
机器不会思考,它们确实服从我们的指示,一步一步:
# +++++++-------------------------------------------------- weak control-VAR
# |||||||
# vvvvvvv
while running: # _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ INFINITE LOOP
filenames = sorted( filenames, key = os.path.getctime )\
or filenames.sort( key = os.path.getctime )# .SET | .UPD
###################################### .ITERATE over []-members
for img in filenames: # .............# .GET img
frame = cv2.imread( img ) # .SET frame
... # .??? whatever
#................................# .??? goes here on
###################################### .ITERATE.NEXT()
# _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ REPEAT INFINITE LOOP
在“标称”条件下,这将 运行 一次又一次,就像编码的那样。
除了一个“软”中断来退出这个无限循环,在第一个 Exception
,无论是被处理的还是任何其他的,问题在于没有明确的终止存在来停止,之后您不希望处理 “比文件夹中更多的帧”。代码按原样忽略了此条件,因此 WHY 部分很清楚。
解决方案?
重构代码,以符合您的实际愿望,一旦 filenames
-list 被处理一次且仅一次,硬停止或软停止无限循环。如果文件夹内容是动态的(随时间变化),则需要更多的努力来重构代码,因此从您需要和想要做的事情开始,而不是从原样代码(仅)遵守的事情开始(因为被指示在那里做)。
我有以下代码发送从文件夹中读取的视频帧并发送到服务器。文件夹中总共有 511 帧,但我的代码在从文件夹中读取的输出 1000 帧中提供了更多帧。
SERVER_A_ADDRESS = "tcp://localhost:5555"
CLIENT_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(CLIENT_ADDRESS)
destination = {
"currentSocket": socket_server_a,
"currentServersTitle": SERVER_A_TITLE,
"currentEndpoint": SERVER_B_TITLE, }
running = True
endpoint_responses = 0
frame_count = 0
def send_frame(frame, frame_count):
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)
print(f"{strftime('%H:%M:%S')} ( + ) : {destination['currentServersTitle']} received frame {frame_count}")
except Exception as Error:
print(
f"{strftime('%H:%M:%S')} ( ! ) : Error frame {frame_count}\n\n> KILLING CONNECTIONS\n\nERROR MESSAGE: {Error}")
running = False
def main():
global destination, running, frame_count
filenames = [img for img in glob.glob("video-frames/*.jpg")]
fps = 5
interval = int(1 / fps)
while running:
filenames = sorted(filenames, key=os.path.getctime) or filenames.sort(key=os.path.getctime)
for img in filenames:
frame = cv2.imread(img)
frame_count += 1
threading.Thread(target=send_frame, args=(frame, frame_count)).start()
time.sleep(interval)
destination["currentSocket"].close()
if __name__ == "__main__":
main()
谢谢
Q : "Why I am retrieving more frames being read than they are in folder"
除了输入代码之外,代码很少做任何其他事情。
机器不会思考,它们确实服从我们的指示,一步一步:
# +++++++-------------------------------------------------- weak control-VAR
# |||||||
# vvvvvvv
while running: # _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ INFINITE LOOP
filenames = sorted( filenames, key = os.path.getctime )\
or filenames.sort( key = os.path.getctime )# .SET | .UPD
###################################### .ITERATE over []-members
for img in filenames: # .............# .GET img
frame = cv2.imread( img ) # .SET frame
... # .??? whatever
#................................# .??? goes here on
###################################### .ITERATE.NEXT()
# _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ REPEAT INFINITE LOOP
在“标称”条件下,这将 运行 一次又一次,就像编码的那样。
除了一个“软”中断来退出这个无限循环,在第一个 Exception
,无论是被处理的还是任何其他的,问题在于没有明确的终止存在来停止,之后您不希望处理 “比文件夹中更多的帧”。代码按原样忽略了此条件,因此 WHY 部分很清楚。
解决方案?
重构代码,以符合您的实际愿望,一旦 filenames
-list 被处理一次且仅一次,硬停止或软停止无限循环。如果文件夹内容是动态的(随时间变化),则需要更多的努力来重构代码,因此从您需要和想要做的事情开始,而不是从原样代码(仅)遵守的事情开始(因为被指示在那里做)。