opencv中resize代码报错

问题遇到的现象和发生背景

想做一个opencv识别特定人脸的代码,用的是cvzone.ClassificationModule 中的 Classifier函数实现的,但是总显示resize代码有错,想了好久还是不会。

代码如下:
from cvzone.ClassificationModule import Classifier
import cv2

cap = cv2.VideoCapture("G:/python37/people/photo1.jpg")
# cap = cv2.VideoCapture(0)
maskClassifier = Classifier('model/keras_model.h5', 'model/labels.txt')
while True:
    _, img = cap.read()
    predection = maskClassifier.getPrediction(img)
    print(predection)
    cv2.imshow("Image", img)
    cv2.waitKey(1)

######代码报错

([0.9795129, 0.020487158], 0)
Traceback (most recent call last):
  File "G:\python37\detect.py", line 9, in <module>
    predection = maskClassifier.getPrediction(img)
  File "G:\anaconda\envs\py37\lib\site-packages\cvzone\ClassificationModule.py", line 38, in getPrediction
    imgS = cv2.resize(img, (224, 224))
cv2.error: OpenCV(4.1.0) C:\projects\opencv-python\opencv\modules\imgproc\src\resize.cpp:3718: error: (-215:Assertion failed) !ssize.empty() in function 'cv::resize'

######cvzone.ClassificationModule.getPrediction代码如下:

    def getPrediction(self, img, draw= True, pos=(50, 50), scale=2, color = (0,255,0)):
        # resize the image to a 224x224 with the same strategy as in TM2:
        imgS = cv2.resize(img, (224, 224))#就是这里出了问题
        # turn the image into a numpy array
        image_array = np.asarray(imgS)
        # Normalize the image
        normalized_image_array = (image_array.astype(np.float32) / 127.0) - 1

        # Load the image into the array
        self.data[0] = normalized_image_array

        # run the inference
        prediction = self.model.predict(self.data)
        indexVal = np.argmax(prediction)

        if draw and self.labels_path:
            cv2.putText(img, str(self.list_labels[indexVal]),
                        pos, cv2.FONT_HERSHEY_COMPLEX, scale, color, 2)

        return list(prediction[0]), indexVal

望指导

可能与getPrediction函数中的图像尺寸有关。该函数期望输入图像的尺寸为224x224像素,因为加载的模型是基于这个特定尺寸进行训练的。

然而,使用cv2.resize函数时,如果输入图像的尺寸与期望的224x224不匹配,可能会导致问题。为了处理不同尺寸的图像,你可以在cv2.resize函数中使用cv2.INTER_AREA插值方法,该方法适用于缩小图像。

以下是如何修改getPrediction函数以处理不同尺寸图像的方法:

import cv2
import numpy as np
def getPrediction(self, img, draw=True, pos=(50, 50), scale=2, color=(0, 255, 0)):
    # 将图像调整为224x224,使用与TM2相同的策略:
    imgS = cv2.resize(img, (224, 224), interpolation=cv2.INTER_AREA)
    # 其余代码保持不变...

通过在cv2.resize函数中指定cv2.INTER_AREA插值方法,该函数将使用像素面积关系来缩小图像,从而适用于在减小图像尺寸时保留重要细节。
请确保相应地更新Classifier类定义中的getPrediction函数。经过这样的修改,该函数现在应该可以处理各种尺寸的图像,而不会出现你遇到的OpenCV错误。

采用chatgpt:
根据错误信息,问题出现在cv2.resize()函数调用上。错误消息是:cv2.error: OpenCV(4.1.0) C:\projects\opencv-python\opencv\modules\imgproc\src\resize.cpp:3718: error: (-215:Assertion failed) !ssize.empty() in function 'cv::resize',这表明在调用resize函数时,输入的图像尺寸为空,也就是图像没有被正确地读取。

在你的代码中,你尝试从视频流中读取图像,但实际上你传入的是一个图像文件路径,而不是视频文件的路径。这会导致cap.read()返回的img为空,从而触发了resize函数报错。

要解决这个问题,你可以更改代码中的以下部分:

cap = cv2.VideoCapture("G:/python37/people/photo1.jpg")

改为:

img = cv2.imread("G:/python37/people/photo1.jpg")

这样,你将直接读取图像而不是视频流,并且应该能够成功调用resize函数。请确保图像文件路径是正确的。

最后,不要忘记将视频流处理的部分修改为处理单个图像的代码。例如,你不需要while循环和cv2.waitKey(1)。你可以直接调用maskClassifier.getPrediction(img)来获取预测结果,并在需要时显示图像。

以模型输入的和图片给出的东西和预处理给出的东西大小不一样,所以它size会报错的。所以你要把输入的图像处理成模型可以接受的图像。

问题点: opencv识别特定人脸的代码
分析思路:
该代码的应用场景为连接摄像头或读取视频文件
提供一下使用样例,帮助题主快速上手.

https://blog.csdn.net/sy20173081277/article/details/121764803

基于OpenCv实现的人脸识别(附Python完整代码)
可以参考下


python+opencv最简单的人脸识别入门_python opencv 人脸识别_Mr_Sun_01的博客-CSDN博客 跟进哔哩的视频敲了一遍,基本流程大体就清楚清晰了。_python opencv 人脸识别 https://blog.csdn.net/sunguanyong/article/details/127861767

ssize.empty() in function 'cv::resize',检查下你的路径,cv2.imshow()查看图像是否正常显示

图像的尺寸大小不匹配

看起来这个错误,应该是图片加载未成功,导致后续对图像的操作失败了。检查下图像的地址书写是否规范(或有误)。路径中是否包含中文
且路径是否真实存在,其次看下是不是正常的.jpg或则.png等图片格式的文件。

检查一下图片路径对不对

参考gpt:
结合自己分析给你如下建议:
您是在使用cvzone.ClassificationModule中的Classifier函数时,遇到了cv2.resize函数报错的问题。这是一个常见的错误,可能的原因有以下几种:
图片读取失败或者为空。这可能是由于图片路径错误、图片格式不支持或者图片损坏等原因导致的。您可以检查一下您的图片路径是否正确,图片格式是否为jpg、png等常见格式,图片是否能够正常打开。您也可以用cv2.imshow函数来显示图片,看看是否能够正常显示。
图片尺寸为零或者负数。这可能是由于图片本身就是一个空白图片,或者是在进行某些操作后,图片尺寸变为了零或者负数。您可以用cv2.shape函数来查看图片的尺寸,看看是否有异常。您也可以在调用cv2.resize函数之前,先判断一下图片是否为空或者尺寸是否合法。
图片类型不匹配。这可能是由于图片的类型和cv2.resize函数的参数类型不一致导致的。例如,如果图片是一个numpy数组,而cv2.resize函数的参数是一个列表或者元组,那么就会报错。您可以用type函数来查看图片和参数的类型,看看是否一致。您也可以在调用cv2.resize函数之前,先将图片和参数转换为相同的类型。

OpenCV中的resize函数用于图像的缩放操作。它可以把原始图像调整为任意尺寸,也可以对图像进行放大或缩小的操作。resize函数的具体用法如下:

void cv::resize(InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=INTER_LINEAR )

其中,参数说明如下:

  • InputArray src:原始图像,可以是Mat类型或其他数据类型。
  • OutputArray dst:输出图像,必须是Mat类型。
  • Size dsize:输出图像尺寸。如果fx和fy都为0,则输出图像尺寸与原始图像尺寸相同;如果dsize为0,则输出图像尺寸根据fx和fy自动计算。
  • double fx:水平方向的缩放系数。
  • double fy:垂直方向的缩放系数。
  • int interpolation:插值方式。默认为INTER_LINEAR,另外还有INTER_NEAREST、INTER_CUBIC、INTER_AREA、INTER_LANCZOS4等。

在实际使用过程中,resize函数可能会出现一些错误,下面列举了一些可能出现的报错内容和解决方法:

1. Assertion failed"!ssize.empty()"错误

这个错误通常是因为输入图像的尺寸为空导致的,可以通过检查输入图像是否为空来解决这个问题。如下所示:

if(src.empty())
{
    std::cout<<"输入图像为空"<<std::endl;
    return -1;
}

2. Assertion failed"!(dsize == Size() && (fx > 0 && fy > 0))"错误

这个错误可能是因为输出图像尺寸和缩放系数都没有设置导致的。可以在调用resize函数时指定输出图像尺寸或缩放系数来解决这个问题。如下所示:

cv::resize(src, dst, cv::Size(), 0.5, 0.5, cv::INTER_LINEAR);

3. Assertion failed"!(src.depth() == CV_8U)"错误

这个错误可能是因为输入图像的深度不正确导致的。通常情况下,输入图像的深度应该为8位无符号整数,可以通过如下代码检查图像深度:

if(src.depth() != CV_8U)
{
    std::cout<<"输入图像深度不正确"<<std::endl;
    return -1;
}

4. Assertion failed"!(src.type() == CV_8UC1 || src.type() == CV_8UC3)"错误

这个错误可能是因为输入图像的类型不正确导致的。通常情况下,输入图像的类型应该为8位无符号整数单通道或3通道,可以通过如下代码检查图像类型:

if(src.type() != CV_8UC1 && src.type() != CV_8UC3)
{
    std::cout<<"输入图像类型不正确"<<std::endl;
    return -1;
}

5. Assertion failed"src.cols > 0 && src.rows > 0"错误

这个错误可能是因为输入图像的尺寸不正确导致的。可以通过如下代码检查图像尺寸:

if(src.rows <= 0 || src.cols <= 0)
{
    std::cout<<"输入图像尺寸不正确"<<std::endl;
    return -1;
}

总之,在使用OpenCV中的resize函数时,需要注意输入输出图像的类型、尺寸、深度等参数设置,以避免出现以上错误。