imread returns None, violating assertion !_src.empty() in function 'cvtColor' error

我试图在巨蟒中做一个基本的颜色转换,但是我似乎不能通过下面的错误。我重新安装了 python、 opencv,并在 python3.4.3(最新版本)和 python2.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'
500752 次浏览

发生这个错误是因为没有正确加载图像。所以前一行 cv2.imread有问题。我的建议是:

  • check if the image exists in the path you give

  • check if the count variable has a valid number

在我的示例中,图像的命名不正确。请检查图像是否存在并尝试

import numpy as np
import cv2


img = cv2.imread('image.png', 0)
cv2.imshow('image', img)

检查它是否是您提供的 JPGpng你好文件,并相应地编写扩展名。

我也遇到了同样的问题,结果是我的 图像名称包含特殊字符(例如 château.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')

我也一直得到这个错误:

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:\projects\opencv-python\opencv\modules\imgproc\src\color.cpp:182: error: (-215:Assertion failed) !_src.empty() in function 'cv::cvtColor

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

解决方案:
在 Windowspython 中使用 r"...\...\"作为前言文件名,如

cv2.imread(r".\images\news.jpg")

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

Verify if your webcam is being used on another task and close it. This wil solve the problem.

I spent some time with this error when I realized my camera was online in a google hangouts group. Also, Make sure your webcam drivers are up to date

I've been in same situation as well, and My case was because of the Korean letter in the path...

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

或放

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

(边缘的 [ ]除外)

或类似的东西在第一行,使巨蟒理解韩语或你的语言等。 那么,即使有一些韩国人在我的情况下的道路上,它将工作。

事情是这样的,似乎有一些关于路径或者字母的东西。 接电话的人说的都差不多,希望你们能解决!

Another thing which might be causing this is a 'weird' symbol in your file and directory names. All umlaut (äöå) and other (éóâ etc) characters should be removed from the file and folder names. I've had this same issue sometimes because of these characters.

In my case it was a permission issue. I had to:

  • 图像,

then it worked.

必须让伙计们知道错误是在 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、 eyPath、 millePath 应该具有从 lib/python3.7/site-package/cv2/data 获取的正确实际路径

如果路径是正确的,图像的名称是确定的,但您仍然得到错误

用途:

from skimage import io


img = io.imread(file_path)

而不是:

cv2.imread(file_path)

函数 imread 从指定的文件加载一个图像并返回 它。如果无法读取图像(因为缺少文件、权限不正确、 不支持或无效的格式),函数将返回一个空矩阵(Mat: : data = = NULL)。

您的代码找不到按错误消息命名的图形或图形的名称。 解决方案:

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

如果有人在用 Jupiter Notebook 阅读网络摄像头中的帧(代码类似于“ frame = cv2.VideoCapture (0)”)时遇到同样的问题,你可以试试:

  1. 确保以前尝试过的代码没有运行并重新启动 Jupiter Notebook 内核

  2. SEPARATE 代码“ frame = cv2.VideoCapture (0)”位于单独的单元格中(前面的代码放在上面的单元格中,下面的代码放到下面的单元格中)

  3. 然后运行单元格上面的所有代码,其中“ frame = cv2.VideoCapture (0)”

  4. 然后尝试用它唯一的代码“ frame = cv2.VideoCapture (0)”运行下一个单元格-AND-直到你将继续执行其他单元格-确保-这个特定单元格 消失左侧的 ASTERIX出现命令顺序号-然后继续

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

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

  • Most probably there is an error in loading the image, try checking directory again.
  • 打印图像以确认是否实际加载

解决方案是在阅读图像之前,在图像名称前加上“ ./”..。

作为@shaked litbak,这个错误出现在我最初使用 ASCII 生成器时,因为我天真地以为我只需要添加到。/data 目录,并自动加载。
我必须用所需的文件路径附加—— input 选项。

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

试试降低 OpenCV 的档次 in python Shell (in cmd)

>>> import cv2
>>> cv2.__version__

在登记 cmd 之后

pip uninstall opencv-python

卸载 opencv 安装版本之后

pip install opencv-python==3.4.8.29

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

我还遇到了这类错误:

Error: OpenCV (4.1.2)/io/OpenCV/module/imgproc/src/color.cpp: 182: error: (- 215: Assertion false) ! _ src.void () in function‘ cvtColor’在函数‘ cvtColor’中

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

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

我的解决办法是:

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)