Python中r字符串如何拼接循环变量?OpenCV报错如何解决?
报错原因与解决方案
根因说明
你遇到的!_src.empty()报错本质是cv2.imread()读取图片失败返回了None,后续调用cvtColor处理空对象触发了OpenCV的内置断言校验。
具体解决步骤
- 第一步:校验路径正确性,补全文件存在性判断
你当前用的相对路径mypath\captcha{i}.png依赖Python脚本的运行工作目录,很容易出现路径不匹配的问题。建议优先用绝对路径,配合os.path.join拼接路径,同时提前判断文件是否存在:import os import cv2 # 替换为你自己的mypath文件夹完整绝对路径 base_dir = r"C:\完整路径\mypath" for i in range(500): img_path = os.path.join(base_dir, f"captcha{i}.png") # 提前判断文件是否存在 if not os.path.exists(img_path): print(f"跳过不存在的文件:{img_path}") continue image = cv2.imread(img_path) # 额外判断图片是否读取成功(避免文件损坏导致读空) if image is None: print(f"读取失败:{img_path}") continue # 后续处理逻辑 img_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) ret, thresh = cv2.threshold(img_gray, 150, 255, cv2.THRESH_BINARY) # 不需要预览弹窗可以删除下面两行imshow和waitKey,避免循环时窗口卡顿 cv2.imshow('Binary image', thresh) cv2.waitKey(1) cv2.imwrite(os.path.join(base_dir, f"captcha{i}_binary.png"), thresh) # 所有处理完成后销毁窗口 cv2.destroyAllWindows() - 第二步:修正r字符串拼接变量的写法
普通r字符串支持format方法,写法为:
也可以用rf/fr开头的字符串直接做f-string插值,两种写法都可以正常解析路径。img_path = r'C:\mypath\captcha{}.png'.format(i) - 第三步:核对文件命名规则
确认你的图片命名是从captcha0.png到captcha499.png连续编号,没有缺号、文件名前缀/后缀不匹配的问题。 - 第四步:优化imshow逻辑
如果保留cv2.imshow,必须在后面加cv2.waitKey(1)才能正常渲染窗口,否则窗口会无响应;不需要预览的话直接删除imshow相关代码即可。
内容的提问来源于stack exchange,提问作者hbae
相关产品推荐
相关产品推荐

