首页 > 编程问答 >函数返回的是非类型而不是列表

函数返回的是非类型而不是列表

时间:2024-06-07 13:34:08浏览次数:25  
标签:python function opencv

我正在使用 opencv 制作人脸检测器,我制作了两个检测器,分别检测两个正面的哈拉卡斯卡特。然后,我编写了一段代码,只有当两个检测器检测到同一区域时,才会显示矩形。这样做效果很好,但当我把同样的代码放到函数中时,它就会返回非类型。如果我将矩形绘制放在函数内,它就会工作,但放在函数外就不行。

import numpy as np
import cv2 as cv #type:ignore

cap = cv.VideoCapture(0)
if not cap.isOpened():
    print("Cannot open camera")
    exit()

def findsimilar(f1, f2, error):
    for (x, y, w, h) in f1:
        for (x1, y1, w1, h1) in f2:
            if x1 < x+error and x1 > x-error and y1 < y+error and y1 > y-error and w1 < w+error and w1 > w-error and h1 < h+error and h1 > h-error:
                #cv.rectangle(frame, (x, y), (x + w, y + h), (0, 128, 255), 4) #在此处输入矩形代码使其工作(表明在此代码工作时存在 x、y、w、h 变量)
                return x, y, w, h #但返回相同的值表示非etype
    
    

face_classifier = cv.CascadeClassifier(cv.data.haarcascades + "haarcascade_frontalface_default.xml")
face_classifier_2 = cv.CascadeClassifier(cv.data.haarcascades + "haarcascade_frontalface_alt.xml")
错误 = 25

while True:

    ret, frame = cap.read()
    gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)

    face = face_classifier.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(40, 40))
    face2 = face_classifier_2.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=15, minSize=(40, 40))
    
    x、y、w、h = findsimilar(face2、face、错误)
    print(x, y, w, h)# 由于某些原因,x、y、w、h 变量是 Nonetype 变量,因此这一行和下一行不起作用

    frame.rectangle(frame, (x, y), (x + w, y + h), (0, 128, 255), 4)

    show = cv.flip(frame, 1)
    cv.imshow('frame', show)

    如果 cv.waitKey(1) == ord('q'):
        断开


cap.release()
cv.destroyAllWindows()
<即使我将矩形绘制代码放在函数内部,它也能正常工作,并显示出显示我的脸的正确矩形,表明 x、y、w、h 这些变量存在。运行上述代码时的错误信息

Traceback (most recent call last):
  File "c:\Users\adhri\OneDrive\Documents\Adhrit\Python\opencv.py", line 30, in <module>;
    x, y, w, h = findsimilar(face2, face, error)
TypeError:无法解包不可迭代的 NoneType 对象

代码中的问题在于,如果 findsimilar 函数没有找到匹配的矩形,它就不会返回任何内容。在 Python 中,如果一个函数没有明确返回值,它会隐式地返回 None 。因此,当尝试解包 x, y, w, h = findsimilar(face2, face, error) 中的 None 时,就会出现 TypeError 错误。

为了解决这个问题,需要确保的 findsimilar 函数总是有一个返回值。一种方法是在函数的最后添加一个默认返回值,例如 None 或一个表示未找到匹配的元组:

def findsimilar(f1, f2, error):
    for (x, y, w, h) in f1:
        for (x1, y1, w1, h1) in f2:
            if x1 < x+error and x1 > x-error and y1 < y+error and y1 > y-error and w1 < w+error and w1 > w-error and h1 < h+error and h1 > h-error:
                return x, y, w, h
    return None  # 如果没有找到匹配项,则返回 None

然后,需要在调用 findsimilar 函数后检查返回值是否为 None

result = findsimilar(face2, face, error)
if result is not None:
    x, y, w, h = result
    cv.rectangle(frame, (x, y), (x + w, y + h), (0, 128, 255), 4)

这样,代码只有在找到匹配的矩形时才会绘制矩形,从而避免了 TypeError 错误。

标签:python,function,opencv
From: 78589953

相关文章

  • Python自动化发送邮件如何实现?怎么配置?
    Python自动化发送邮件需要注意什么?邮件群发的技巧?无论是个人使用还是企业需求,电子邮件的发送都是必不可少的。而Python作为一门功能强大的编程语言,可以通过自动化脚本实现批量发送邮件,从而提高工作效率。AokSend将详细介绍如何使用Python自动化发送邮件。Python自动化发送邮......
  • Python实现投递多线程任务
    使用Python的apscheduler库中的BackgroundScheduler实现投递多线程任务的示例代码。这个示例将展示如何根据任务ID投递和停止任务,设置任务同时执行的上限,以及删除全部任务。首先,确保你已经安装了apscheduler库:``pipinstallapscheduler``代码示例:``fromapscheduler.sched......
  • python系列:FASTAPI系列 04-GET请求 params参数
    FASTAPI系列04-GET请求params参数FASTAPI系列04-GET请求params参数前言一、查询参数二、参数的默认值三、多路径查询参数四、查询参数为必填项总结FASTAPI系列04-GET请求params参数前言get请求的参数在url后面携带,通常称做queryparams一、查询参数在......
  • Python简单实现多线程例子
    使用Python实现多线程的例子,演示如何在主线程内分别启动ABC三个线程,并实现启动和停止指定线程的功能``importthreadingimporttime#定义一个全局标志,用于控制线程的运行状态stop_thread_A=Falsestop_thread_B=Falsestop_thread_C=False#线程A的函数......
  • Python数据分析常用开源库 pycharm
    内容介绍Pandas数据处理的库,可以做可视化文件类数据交互的是比较好的CSVExcel环境搭建起来SeriesDataFrame前3天主要介绍DataFrame的使用(Pandas的API)第四天数据可视化day05~day08Pandas解决数据分析问题报表,取数(SQL,Pandas,Excel)业务分析能......
  • python各种加解密方法
    #-*-encoding:utf-8-*-fromhashlibimportmd5importbase64#MD5加密obj=md5()str="你是个小可爱"obj.update(str.encode("utf-8"))#obj.update("wusir".encode('utf-8'))#可以添加多个被加密的内容bs=obj.hexdigest()print("md5......
  • 8-4 【Python0036】中文级联菜单
    importtkinterastkfromtkinterimportttkfrompypinyinimportlazy_pinyin#省份、城市、地区数据data={"北京":{"北京市":["东城区","西城区","朝阳区"],},"上海":{"上海市......
  • 用 Python 撸一个 Web 服务器-第9章:项目总结
    项目总结本教程带大家一起实现了一个TodoList程序,包含基础的增删改查功能,和用户登录认证。这也是Web开发中最常见的需求。我画了一张思维导图,帮助你从宏观的角度来概览TodoList程序,加深你对Web开发的理解。TodoList项目整体思路参考MVC设计模式。有意设计utils......
  • 用 Python 撸一个 Web 服务器-第8章:用户管理
    用户登录原理用户登录与注册功能几乎已成为Web应用的标配。所以我们有必要给TodoList程序增加一个用户管理模块,以此来学习用户登录原理。HTTP协议是无状态的,这意味着每个完整的HTTP请求——响应过程都是相对独立的,Web服务器无法分辨前后两次连续请求是否为同一个用户......
  • 用 Python 撸一个 Web 服务器-第7章:重构——更好的组织代码
    通过前几章的学习,我们完成了TodoList程序的todo管理部分,实现了对todo的增、删、改、查基本操作,这也是几乎所有Web程序都具备的功能。我们当然可以按照目前的思路继续来实现用户管理部分,在models.py中编写用户相关的模型,在templates/目录下新建用户相关HTML,在contro......