imread 返回 None,在函数'cvtColor'错误中违反了断言 !_src.empty()



我正在尝试在python中进行基本的颜色转换,但是我似乎无法克服以下错误。我已经重新安装了python,opencv,并尝试了python 3.4.3(最新)和python 2.7(在我的Mac上)。

我使用 python 的包管理器 opencv-python 安装了 opencv。

下面是失败的代码:

frame = cv2.imread('frames/frame%d.tiff' % count)
frame_HSV= cv2.cvtColor(frame,cv2.COLOR_RGB2HSV)

这是错误消息:

cv2.error: OpenCV(3.4.3) /Users/travis/build/skvark/opencv-python/opencv/modules/imgproc/src/color.cpp:181: error: (-215:Assertion failed) !_src.empty() in function 'cvtColor'

发生此错误是因为图像未正确加载。所以你对上一行有问题cv2.imread.我的建议是:

  • 检查图像是否存在于您给出的路径中

  • 检查计数变量是否具有有效数字

如果有人在从网络摄像头读取帧时遇到同样的问题:

验证您的网络摄像头是否正在用于其他任务并将其关闭。这将解决问题。

当我意识到我的相机在谷歌环聊组中在线时,我花了一些时间处理此错误。另外,请确保您的网络摄像头驱动程序是最新的

我也一直收到此错误:

Traceback (most recent call last):
File "face_detector.py", line 6, in <module>
gray_img=cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.error: OpenCV(4.1.0) C:projectsopencv-pythonopencvmodulesimgprocsrccolor.cpp:182: error: (-215:Assertion failed) !_src.empty() in function 'cv::cvtColor

我的cv2.cvtColor(...)photo.jpg工作正常,但news.jpg工作不正常。对我来说,我终于意识到,在使用python在Windows上工作时,那些转义字符每次都会得到你!!所以我的"坏"照片被转义了,因为文件名以"n"开头。Python 将n作为转义字符,OpenCV 找不到该文件!

解决方案:
Windows python 中的前言文件名,r"......"

cv2.imread(r".imagesnews.jpg")

检查路径中是否存在图像并验证图像扩展(.jpg或.png)

如果路径正确且图像名称正常,但仍然收到错误

用:

from skimage import io
img = io.imread(file_path)

而不是:

cv2.imread(file_path)

函数 imread 从指定文件加载图像并返回 它。如果无法读取图像(由于缺少文件、权限不当、格式不受支持或无效),该函数将返回一个空矩阵 ( Mat::d ata==NULL )。

检查是否是您提供的jpgpngbmp文件并相应地编写扩展名。

可能导致此问题的另一件事是文件和目录名称中的"奇怪"符号。应从文件和文件夹名称中删除所有变音符号 (äöå) 和其他 (éóâ 等) 字符。由于这些字符,我有时会遇到同样的问题。

很可能在
  • 加载图像时出错,请尝试再次检查目录。
  • 打印图像以确认它是否实际加载

就我而言,图像命名不正确。检查图像是否存在并尝试

import numpy as np
import cv2
img = cv2.imread('image.png', 0)
cv2.imshow('image', img)

我也遇到过同样的情况,我的情况是因为路径中的韩文字母......

从文件夹名称中删除韩文字母后,它可以工作。

或放

[#-*- coding:utf-8 -*-]

(边缘[ ]除外)

或第一行中的类似内容,以使python理解韩语或您的语言等。 那么即使在我的情况下,路径上有一些韩国人,它也会起作用。

所以事情是这样的,似乎有一些关于路径或字母的东西。 回答的人也在说类似的话。希望你们解决它!

我检查了我的图像文件路径,它是正确的。我确保没有损坏的图像。问题出在我的Mac上。它有时有一个名为.DS_Store的隐藏文件,该文件与图像文件路径一起保存。因此,cv2 在该文件上遇到了问题。所以我通过删除.DS_Store解决了这个问题

我遇到了同样的问题,结果我的图像名称包含特殊字符(例如城堡.jpg),cv2.imread无法下注处理。我的解决方案是制作文件的临时副本,重命名它,例如temp.jpg,它可以由cv2.imread加载而没有任何问题。

注意:我没有检查其他选项的性能shutil.copy2反之亦然。因此,可能有一个更好/更快的解决方案来制作临时副本。

import shutil, sys, os, dlib, glob, cv2
for f in glob.glob(os.path.join(myfolder_path, "*.jpg")):
shutil.copy2(f, myfolder_path + 'temp.jpg')
img = cv2.imread(myfolder_path + 'temp.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
os.remove(myfolder_path + 'temp.jpg')

如果只有少数文件带有特殊字符,也可以重命名作为扩展,例如

for f in glob.glob(os.path.join(myfolder_path, "*.jpg")):
try:
img = cv2.imread(f)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
except:
shutil.copy2(f, myfolder_path + 'temp.jpg')
img = cv2.imread(myfolder_path + 'temp.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
os.remove(myfolder_path + 'temp.jpg')

就我而言,这是一个权限问题。我不得不:

  • chmod a+wrx图像

然后它奏效了。

必须看到错误在cv2.imread()中。给出图像的正确路径。首先,查看您的系统是否加载图像。 这可以通过使用 cv2.imread() 简单加载图像来首先检查。 之后,请参阅此代码进行人脸检测

import numpy as np
import cv2
cascPath = "/Users/mayurgupta/opt/anaconda3/lib/python3.7/site-   packages/cv2/data/haarcascade_frontalface_default.xml"
eyePath = "/Users/mayurgupta/opt/anaconda3/lib/python3.7/site-packages/cv2/data/haarcascade_eye.xml"
smilePath = "/Users/mayurgupta/opt/anaconda3/lib/python3.7/site-packages/cv2/data/haarcascade_smile.xml"
face_cascade = cv2.CascadeClassifier(cascPath)
eye_cascade = cv2.CascadeClassifier(eyePath)
smile_cascade = cv2.CascadeClassifier(smilePath)
img = cv2.imread('WhatsApp Image 2020-04-04 at 8.43.18 PM.jpeg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
for (x,y,w,h) in faces:
img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
roi_gray = gray[y:y+h, x:x+w]
roi_color = img[y:y+h, x:x+w]
eyes = eye_cascade.detectMultiScale(roi_gray)
for (ex,ey,ew,eh) in eyes:
cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里,cascPath ,eyePath ,smilePath 应该有从 lib/python3.7/site-packages/cv2/data 中获取的正确实际路径,这里这个路径应该是拾取 haarcascade 文件

您的代码找不到名为 by 错误消息的图形或图形的名称。 溶液:

import cv2
import numpy as np 
import matplotlib.pyplot as plt 
img=cv2.imread('哈哈.jpg')#solution:img=cv2.imread('haha.jpg')
print(img)

如果有人在从网络摄像头读取帧时遇到同样的问题 [使用类似于"frame = cv2.VideoCapture(0)"] 并在 Jupyter Notebook 中工作,您可以尝试:

  1. 确保以前尝试的代码尚未运行并重新启动 Jupyter 笔记本内核

  2. 单独的代码"帧 = cv2。VideoCapture(0)"在单独的单元格中的位置[以前的代码放在上面的单元格中,下面的代码放在单元格下方]

  3. 然后运行单元格上方的所有代码,其中"帧 = CV2。视频捕获(0)">

  4. 然后尝试使用其唯一的代码"frame = cv2"运行下一个单元格。视频捕获(0)" - 和 - 直到您继续执行其他单元格 -确保- 此特定单元格左侧的ASTERIX消失和命令订单号出现 - 然后才继续

  5. 现在您可以尝试执行其余代码,因为您的相机输入不应再为空:-)

  6. 结束后,确保关闭所有程序并重新启动内核,为再次运行做准备

@shaked litbak 一样,这个错误出现在我最初使用 ASCII 生成器时,因为我天真地认为我只需要添加到 ./data 目录,并自动加载。
我不得不在 --input 选项后附加所需的文件路径。

我也遇到了这种类型的错误:

错误: OpenCV(4.1.2)/io/opencv/modules/imgproc/src/color.cpp:182: 错误: (-215:断言失败) !_src.empty() 在函数 'cvtColor' 中

解决方案是正确加载图像。由于提到的文件是错误的,因此没有加载图像,因此它抛出了此错误。您可以检查映像的路径,或者如果通过 colab 或驱动器上传映像,请确保映像存在于驱动器中。

当我尝试从非ASCII路径加载图像时遇到问题。 如果我只是使用 imread 来加载图像,我只能得到 None。

这是我的解决方案:

import cv2
import numpy as np
path = r'D:map上海地图abc.png'
image = cv2.imdecode(np.fromfile(path, dtype=np.uint8), cv2.IMREAD_UNCHANGED)

当我将图像保存在非 ASCII 路径中时,也会发生类似的事情。在没有任何警告的情况下,它将无法成功保存。这就是我所做的。

import cv2
import numpy as np
path = r'D:map上海地图abc.png'
cv2.imencode('.png', image)[1].tofile(path) 
path = os.path.join(raw_folder, folder, file)
print('[DEBUG] path:', path)
img = cv2.imread(path)   #read path Image 
if img is None: # check if the image exists in the path you give
print('Wrong path:', path)
else: # It completes the steps
img = cv2.resize(img, dsize=(128,128))
pixels.append(img)

我在加载数千张图像时遇到了同样的问题。显然,有些文件不是有效的图像,但具有正确的文件扩展名。也许保存过程中出错?我通过将 load 函数包装在 try-catch 块中、打印有问题的文件名并继续编写脚本来解决此问题。

# Process the images
for image_path in image_paths:
"""
try-catch block to handle errors in processing individual images.
"""
try:
process_image(image_path, pass_folder, reject_folder)
except cv2.error as e:
print(f"Error processing image {image_path.name}: {str(e)}")

在读取图像名称之前在图像名称之前添加"./"的解决方案...

只需尝试降级 OpenCV 在python Shell中(在cmd中)

>>> import cv2
>>> cv2.__version__

签入 cmd 后

pip uninstall opencv-python

卸载 OpenCV 安装版本后

pip install opencv-python==3.4.8.29

相关内容

最新更新