You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python&OpenCV进行耳朵检测时遇TypeError错误,求代码修正

解决OpenCV耳朵检测中的TypeError问题

我来帮你搞定这个报错!你遇到的TypeError: function takes exactly 2 arguments (1 given)是因为cv2.rectangle()的参数传递出了问题,咱们拆解一下问题,再给出修正方案:

错误原因分析

  1. 坐标遍历错误:你用zip(match[::-1])遍历匹配结果时,得到的每个obj是一个嵌套的元组(比如((x,),)),根本不是合法的坐标点。正确的写法应该是zip(*match[::-1]),这样才能把匹配到的x坐标数组和y坐标数组拆解成一个个(x,y)坐标对。
  2. 矩形参数不完整: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:02:30