使用ThreadPoolExecutor时,如何为cv2.imread传递IMREAD_UNCHANGED参数?
如何在ThreadPoolExecutor中使用cv2.imread保留PNG的Alpha通道
要给cv2.imread传入cv2.IMREAD_UNCHANGED参数以保留Alpha通道,同时配合ThreadPoolExecutor.map批量处理图片,你可以用以下几种正确写法:
方法1:使用functools.partial固定参数
用partial包装cv2.imread,预先指定flags参数,再把包装后的函数传给executor.map:
import cv2 import concurrent.futures from functools import partial images = ["pic1.png", "pic2.png", "pic3.png"] # 固定imread的flags参数为IMREAD_UNCHANGED read_with_alpha = partial(cv2.imread, flags=cv2.IMREAD_UNCHANGED) with concurrent.futures.ThreadPoolExecutor() as executor: images_list = list(executor.map(read_with_alpha, images))
方法2:使用lambda函数
通过lambda函数为每个图片路径单独调用cv2.imread并传入参数:
import cv2 import concurrent.futures images = ["pic1.png", "pic2.png", "pic3.png"] with concurrent.futures.ThreadPoolExecutor() as executor: images_list = list(executor.map(lambda path: cv2.imread(path, cv2.IMREAD_UNCHANGED), images))
方法3:利用map的多参数特性
将图片路径和对应的flags参数打包成两组序列,传给executor.map(map会按顺序取两组序列的元素作为函数参数):
import cv2 import concurrent.futures images = ["pic1.png", "pic2.png", "pic3.png"] # 为每个路径匹配相同的flags参数 flags = [cv2.IMREAD_UNCHANGED] * len(images) with concurrent.futures.ThreadPoolExecutor() as executor: images_list = list(executor.map(cv2.imread, images, flags))
你之前的错误原因
第二个写法报错是因为:
executor.map的第一个参数需要是函数对象,但你直接调用了cv2.imread(images, cv2.IMREAD_UNCHANGED),这会把整个列表images传给imread的第一个参数(imread仅接受单个字符串路径),导致返回NULL;- 同时
map接收到的是imread的返回值(None),而非函数本身,因此触发错误。
内容的提问来源于stack exchange,提问作者JanneI
相关产品推荐
相关产品推荐

