M1 Mac运行OpenCV图像对齐代码报UnboundLocalError问题咨询
问题根因
这个UnboundLocalError错误和M1芯片兼容性、Anaconda/OpenCV版本无关,问题出在IEMI函数的文件遍历逻辑:
- 不同操作系统的
glob.glob()返回文件列表的排序规则不一致:Windows、树莓派系统中,同目录下带mask标识的文件会排在带ch6标识的文件前面,因此处理ch6文件时CFIgray已经完成赋值; - macOS系统下
glob返回的文件顺序由文件系统底层存储顺序决定,大概率会先遍历到ch6文件,此时CFIgray还没有被定义,就触发了变量未定义的报错。
修复方案
方案1:修复现有遍历逻辑
调整IEMI函数的文件处理顺序,确保先加载当前目录下的mask文件得到CFIgray后,再处理ch6文件,修改后的代码如下:
def IEMI(imageformat, folder): path = glob.glob(folder+"/*/")#directory path = (pd.Series(path) + imageformat).tolist()#find all files in a folder of the directory for i in path: fileList=glob.glob(i) # 先找当前目录的mask文件,优先处理得到CFIgray CFIgray = None # 第一步:先加载mask for filename in fileList: if filename.find('mask')!= -1: CFIimg = cv2.imread(filename) if CFIimg is None: print(f"警告:无法读取mask文件{filename},跳过当前目录") continue CFIgray = cv2.cvtColor(CFIimg, cv2.COLOR_BGR2GRAY) break # 没有找到mask直接跳过当前目录 if CFIgray is None: continue # 第二步:处理ch6文件 for filename in fileList: fname = filename.rsplit(".", 1)[0] fname = fname.replace('ch7', '').replace('mask', '') if filename.find('ch6')!= -1: Img_Alignment(filename, CFIgray) Pch6 = cv2.imread(fname+"_aligned.jpg",cv2.IMREAD_ANYDEPTH) # 后续你的其他处理逻辑
方案2:更鲁棒的ORB特征匹配对齐替代方案
如果你觉得现有ECC对齐容易因为灰度差异、迭代收敛失败报错,可以替换为基于ORB特征匹配的对齐方法,鲁棒性更强:
def Img_Alignment_ORB(Image_for_alignment, Reference): # 读取待对齐图像 img = cv2.imread(Image_for_alignment) img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) h, w = Reference.shape # 初始化ORB检测器 orb = cv2.ORB_create(5000) kp1, des1 = orb.detectAndCompute(img_gray, None) kp2, des2 = orb.detectAndCompute(Reference, None) # 特征匹配 matcher = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True) matches = matcher.match(des1, des2) matches = sorted(matches, key=lambda x:x.distance)[:int(len(matches)*0.1)] # 取前10%最优匹配 # 提取匹配点 pts1 = np.float32([kp1[m.queryIdx].pt for m in matches]).reshape(-1,1,2) pts2 = np.float32([kp2[m.trainIdx].pt for m in matches]).reshape(-1,1,2) # 计算变换矩阵 warp_matrix, mask = cv2.findHomography(pts1, pts2, cv2.RANSAC, 5.0) # 对齐图像 aligned = cv2.warpPerspective(img, warp_matrix, (w, h)) Aimg=str(Image_for_alignment).replace('.png','') cv2.imwrite(Aimg+"_aligned.jpg",aligned)
额外注意事项
- 建议给
cv2.imread、cv2.findTransformECC这类容易失败的接口增加异常捕获逻辑,避免程序直接崩溃 - 保存对齐后的图像如果要保留16位精度,不要存为jpg格式,建议存为png或tiff格式,jpg默认是8位有损压缩。
内容的提问来源于stack exchange,提问作者ck24501
相关产品推荐
相关产品推荐

