想做一个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完整代码)
可以参考下
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函数时,需要注意输入输出图像的类型、尺寸、深度等参数设置,以避免出现以上错误。