使用Python&OpenCV进行耳朵检测时遇TypeError错误,求代码修正
解决OpenCV耳朵检测中的TypeError问题
我来帮你搞定这个报错!你遇到的TypeError: function takes exactly 2 arguments (1 given)是因为cv2.rectangle()的参数传递出了问题,咱们拆解一下问题,再给出修正方案:
错误原因分析
- 坐标遍历错误:你用
zip(match[::-1])遍历匹配结果时,得到的每个obj是一个嵌套的元组(比如((x,),)),根本不是合法的坐标点。正确的写法应该是zip(*match[::-1]),这样才能把匹配到的x坐标数组和y坐标数组拆解成一个个(x,y)坐标对。 - 矩形参数不完整:
cv2.rectangle()需要两个点来定义矩形:左上角坐标和右下角坐标。你只传了一个obj作为第一个点,第二个点直接写了固定的(15,15),这显然不对——我们需要用模板图的宽高来计算右下角的位置,这样才能框住整个匹配到的耳朵区域。
修正后的完整代码
import numpy as np import cv2 camera = cv2.VideoCapture(0) ear = cv2.imread("ear.png", 0) w, h = ear.shape[::-1] # 获取模板的宽和高 while (True): _, frame = camera.read() # read()默认返回帧,无需传参 frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 保留原彩色帧用于画矩形 match = cv2.matchTemplate(frame_gray, ear, cv2.TM_CCORR_NORMED) threshold = 0.8 locations = np.where(match >= threshold) # 正确遍历每个匹配的左上角坐标 for (x, y) in zip(*locations[::-1]): # 计算矩形右下角坐标(基于模板的宽高) bottom_right = (x + w, y + h) # 在彩色帧上绘制矩形,厚度设为2方便看轮廓,要填充的话改回-5即可 cv2.rectangle(frame, (x, y), bottom_right, (0, 0, 255), 2) cv2.imshow("FindMyEars", frame) if cv2.waitKey(1) & 0xFF == ord('q'): break camera.release() cv2.destroyAllWindows()
额外小优化说明
- 我把灰度转换后的帧存在
frame_gray里,保留原彩色帧frame来画矩形,检测结果会更直观;如果坚持要在灰度帧上绘制,也可以改回直接用灰度后的帧操作。 - 去掉了
camera.read(0)里的多余参数,read()方法默认会读取下一帧,不需要额外传值。 - 把矩形厚度从-5改成了2(轮廓线),如果需要填充整个矩形区域,再改回-5就可以。
内容的提问来源于stack exchange,提问作者Mahir Arda Kesim
相关产品推荐
相关产品推荐

