先展示一下我的多进程代码:
def process_image(image_path_list):
# 获取模板以及类别名
template_feature = {
}
template_image = cv2.imread(image_path_list)
template_feature[curr_template_name] = template_image
input_image = cv2.imread(img)
template_feature['input_image'] = input_image
# 将比较的图片统一至相同的大小
img_update_dict = resize(template_feature)
# 建立直方图
output_hist_dict = create_rgb_hist(img_update_dict)
# 根据RGB直方图计算巴士距离、相似性以及卡方分布
# bashi_dict, similarity_dict, kafang_dict = hist_compare(output_hist_dict)
similarity_dict = hist_compare(output_hist_dict)
# return bashi_dict, similarity_dict, kafang_dict
return similarity_dict
# 创建进程池
image_paths = [os.path.join(template_dir, img) for img in os.listdir(template_dir)]
with Pool(processes=os.cpu_count()) as pool:
results = pool.map(process_image, image_paths)
pool.close()
pool.join()
上述代码,是用来将输入图像img与本地文件夹的所有图像一一匹配。
可以看出使用多进程,调用process_image,传入的image_paths这个存放图像路径的列表,但是process_image函数里有一个input_image = cv2.imread(img),img无法通过pool.map()传入。
解决办法,使用functools.partial
。
使用示例:
from functools import partial
from multiprocessing import Pool, cpu_count
def process_image(image_path, additional_param):
# 在这里处理图像,可以使用 additional_param
additional_param = "your_additional_param_here"
# 创建一个部分应用了 additional_param 的 process_image 函数
partial_process_image = partial(process_image, additional_param=additional_param)
# 使用 multiprocessing.Pool 进行并行处理
with Pool(processes=cpu_count()) as pool:
results = pool.map(partial_process_image, self.image_paths)
更改后的代码为:
def process_image(image_path_list):
# 获取模板以及类别名
template_feature = {
}
template_image = cv2.imread(image_path_list)
template_feature[curr_template_name] = template_image
input_image = cv2.imread(img)
template_feature['input_image'] = input_image
# 将比较的图片统一至相同的大小
img_update_dict = resize(template_feature)
# 建立直方图
output_hist_dict = create_rgb_hist(img_update_dict)
# 根据RGB直方图计算巴士距离、相似性以及卡方分布
# bashi_dict, similarity_dict, kafang_dict = hist_compare(output_hist_dict)
similarity_dict = hist_compare(output_hist_dict)
# return bashi_dict, similarity_dict, kafang_dict
return similarity_dict
# 创建进程池
image_paths = [os.path.join(template_dir, img) for img in os.listdir(template_dir)]
# 创建一个部分应用了 additional_param 的 process_image 函数
partial_process_image = partial(process_image, additional_param=img)
# 创建进程池
with Pool(processes=os.cpu_count()) as pool:
results = pool.map(partial_process_image, self.image_paths)
pool.close()
pool.join()