gpt4 book ai didi

Python 异步 IO 图像处理

转载 作者:太空宇宙 更新时间:2023-11-03 14:31:22 25 4
gpt4 key购买 nike

我目前正在从网络摄像头拍摄图像,捕获后应立即进行处理。该代码使用 cv2.videocapture() 函数。

想法:捕获图像后,我想利用系统捕获新图像所需的时间来对前一个图像进行计算。

为了完成此任务,我使用 asyncio 库。

首先,我定义一个生成器函数,它生成应存储在队列中的 n 个图像:

async def produce(queue, n):
for x in range(n):
# produce an item
print('producing {}/{}'.format(x, n))
# simulate i/o operation using sleep
await asyncio.sleep(random.random())
item = obtainImage()
z.append(x)
# put the item in the queue
await queue.put(item)

之后,我实现了一个消费者函数,它等待队列中的条目并计算一些图像特征(这里是一个简单的阈值):

 async def consume(queue):
while True:
# wait for an item from the producer
# Load the image stored in the queue
item = await queue.get()
# process the item and store value
ret,thresh1 = cv2.threshold(item,127,255,cv2.THRESH_BINARY)

# simulate i/o operation using sleep
await asyncio.sleep(random.random())

# Notify the queue that the item has been processed
queue.task_done()

#Return the Processesed image
return thresh1

为了启动这些函数,我创建了一个运行函数并将其添加到事件循环中(运行方法包含一个表示我要处理多少图像的参数):

async def run(n):
queue = asyncio.Queue()
# schedule the consumer
consumer = asyncio.ensure_future(consume(queue))
# run the producer and wait for completion
await produce(queue, n)
# wait until the consumer has processed all items
await queue.join()
# the consumer is still awaiting for an item, cancel it
consumer.cancel()

loop = asyncio.get_event_loop()
loop.run_until_complete(run(10))
print(loop)
loop.close()

只要我使用 print 语句,我就会得到如下异步输出:

生产0/10

生产1/10

消耗0...

制作2/10

消耗1...

生产3/10

消耗2...

制作4/10

消耗3...

这正是我想要的顺序。但是,我无法取回任何阈值图像。我缺少什么?

提前谢谢

最佳答案

返回结果的全局队列的最小示例(使用 Python 3.5.2 测试)

import asyncio
import random

outQ = asyncio.Queue()

async def produce(queue, n):
for x in range(n):
print('producing {}/{}'.format(x, n))
await asyncio.sleep(random.random())
item = x
await queue.put(item)

async def consume(queue):
while True:
print('consume ')
item = await queue.get()
thresh1 = item**2
print("... adding %d" % thresh1)
await outQ.put(thresh1)
await asyncio.sleep(random.random())
queue.task_done()


async def run(n):
queue = asyncio.Queue()
consumer = asyncio.ensure_future(consume(queue))
await produce(queue, n)
await queue.join()
consumer.cancel()

loop = asyncio.get_event_loop()
loop.run_until_complete(run(10))
loop.close()

while not outQ.empty():
print(outQ.get_nowait())

输出:

...
producing 9/10
... adding 64
consume
... adding 81
consume
0
1
4
9
16
25
36
49
64
81

关于Python 异步 IO 图像处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47260597/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com