for循环中调用cv2.imshow()无法显示模板匹配后的裁剪结果
OpenCV模板匹配裁剪失败问题修复方案
代码存在的3个核心错误
- 模板匹配参数传值错误:遍历模板列表的循环中,
cv.matchTemplate()的第二个参数错误传入了之前循环的文件名变量myfile,应传入当前遍历的模板对象tmp - 裁剪区域坐标维度混淆:模板的
w是宽度(对应x轴)、h是高度(对应y轴),裁剪numpy数组时第一个维度是y轴范围,第二个是x轴范围,原代码写反了w和h的位置,会导致裁剪区域错位甚至越界得到空图 cv.imshow()参数错误:第二个参数直接传入图像数组即可,原代码额外加了*解引用操作,会把数组拆分为多个行向量传入,不符合函数参数要求,直接导致无法正常展示图像
修复后的代码示例
import cv2 as cv # 需提前正确读取待匹配图img_rgb、img_gray,以及模板文件列表files1 template_data = [] for myfile in files1: image = cv.imread(myfile,0) template_data.append(image) for tmp in template_data: w, h = tmp.shape[::-1] # 修复1:第二个参数改为当前模板tmp result = cv.matchTemplate(img_gray, tmp, cv.TM_CCOEFF_NORMED) _, _, _, maxLoc = cv.minMaxLoc(result) topLeft = maxLoc bottom_right = (topLeft[0] + w , topLeft[1] + h) # 可选优化:三通道图像画框用(0,0,255)显示红色,原255只会显示蓝色 cv.rectangle(img_rgb, topLeft, bottom_right, (0,0,255), 2) # 修复2:裁剪时y轴范围加h,x轴范围加w crop_img = img_rgb[maxLoc[1]:maxLoc[1]+h, maxLoc[0]:maxLoc[0]+w, :] # 修复3:去掉*直接传图像数组 cv.imshow("cropped", crop_img) cv.waitKey(0) # 运行结束销毁所有窗口 cv.destroyAllWindows()
内容的提问来源于stack exchange,提问作者berkayld
相关产品推荐
相关产品推荐

