cv2.imwrite循环存图时文本重叠及f-string路径报错如何解决
问题根因与修复方案
问题1:文字重叠、仅生成1张图
你所有循环复用的是同一个底图对象,OpenCV的putText是直接在原图内存上修改,所以每次画的文字都会保留在上一次的结果上,且所有保存路径都写死为同一个文件名,每次循环都会覆盖上一次的保存结果。
修复逻辑:每次循环都复制一份原始的干净底图,再在副本上写文字,避免不同比分的内容互相影响。
问题2:路径Unicode报错
Windows系统路径的反斜杠\在Python普通字符串中会被识别为转义字符,你路径里的\U刚好是Unicode字符的前缀,触发解码错误。同时保存文件名需要唯一,不能全部用同一个名字。
修复逻辑:路径统一用原始字符串(加r前缀)+ f-string生成带比分的唯一文件名,避免转义和覆盖问题。
修复后完整代码
import cv2 import numpy as np # 固定参数配置 game_name = "Man United v. Manchester" nft_id = "contract address/token ID" pic_file = "cat_rainbow.png" # 保存文件夹路径,用原始字符串避免转义,提前手动创建好该文件夹 save_dir = r"C:\Users\holli\PycharmProjects\NFT\multiple_nfts\\" # 预先生成干净的原始底图,只做一次resize base_pic = cv2.imread(pic_file) base_template = cv2.resize(base_pic, (1100, 800)) def make_templ(game_name, score, nft_id, bg_img): cv2.putText(bg_img, 'if the score of', (55, 255), cv2.FONT_HERSHEY_DUPLEX, 3, (0, 0, 255), 3) cv2.putText(bg_img, f'{game_name}', (100, 355), cv2.FONT_HERSHEY_DUPLEX, 3, (0, 0, 255), 3) cv2.putText(bg_img, f'is', (160, 455), cv2.FONT_HERSHEY_DUPLEX, 3, (0, 0, 255), 3) cv2.putText(bg_img, f'{score}', (360, 500), cv2.FONT_HERSHEY_DUPLEX, 3, (0,0,255),3) cv2.putText(bg_img, f'get...nft#{nft_id}', (100, 600), cv2.FONT_HERSHEY_DUPLEX, 3, (0, 0, 255), 3) return bg_img # 生成所有比分组合 team1_scores = list(range(10)) team2_scores = list(range(10)) all_scores = [[x,y] for x in team1_scores for y in team2_scores] def batch_generate_nft(): for score in all_scores: # 每次复制原始底图,避免和上一次的结果叠加 current_img = base_template.copy() # 把比分转成友好字符串 score_str = f"{score[0]}-{score[1]}" # 生成带文字的图 result_img = make_templ(game_name, score_str, nft_id, current_img) # 生成唯一保存路径,用比分当文件名避免覆盖 save_path = f"{save_dir}cat_nft_{score_str}.png" cv2.imwrite(save_path, result_img) # 运行生成 batch_generate_nft()
注意事项
运行前先确认save_dir对应的文件夹已经存在,OpenCV不会自动创建不存在的目录,否则会报错无输出。生成的文件名格式为cat_nft_0-0.png、cat_nft_0-1.png,共100张,每张文字互不重叠。
内容的提问来源于stack exchange,提问作者Jesse Holliday
相关产品推荐
相关产品推荐

