函数'cvtColor'中的OpenCV!_src.empty()错误

时间:2018-10-06 05:31:38

标签: python opencv

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

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

以下是失败的代码:

.click(function() { console.log('click') }); 

这是错误消息:

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

15 个答案:

答案 0 :(得分:13)

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

  • 检查图像是否在您指定的路径中

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

答案 1 :(得分:2)

检查您提供的是否为 jpg png bmp 文件,并相应地编写扩展名。

答案 2 :(得分:2)

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

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

当我意识到自己的相机在Google环聊群组中在线时,我花了一些时间解决这个错误。

答案 3 :(得分:2)

如果路径正确且图像名称正确,但仍然出现错误

使用:

from skimage import io

img = io.imread(file_path)

代替:

cv2.imread(file_path)

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

答案 4 :(得分:1)

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

从文件夹名称中删除韩文字母后,它会起作用。

或放置

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

(边缘的[ ]除外)

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

事实就是如此,似乎关于路径或字母有些问题。 回答的人在说类似的话。希望你们能解决!

答案 5 :(得分:0)

在我的情况下,图像的命名错误。检查图片是否存在,然后尝试

import numpy as np
import cv2

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

答案 6 :(得分:0)

我遇到了同样的问题,结果发现我的图片名称包含特殊字符(例如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')

答案 7 :(得分:0)

我也一直收到此错误:

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上工作良好。对我来说,我终于意识到,当在Windows上使用python时,这些转义字符将每次都为您服务!由于文件名以“ n”开头,所以我的“坏”照片被转义了。 Python将\n用作转义字符,而OpenCV找不到该文件!

解决方案:
在Windows python中使用r"...\...\"的前言文件名,如

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

答案 8 :(得分:0)

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

答案 9 :(得分:0)

就我而言,这是一个权限问题。我必须:

  • chmod a+wrx图片

然后它起作用了。

答案 10 :(得分:0)

必须请大家看到错误在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文件

答案 11 :(得分:0)

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

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

答案 12 :(得分:0)

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

  1. 确保先前尝试的代码尚未运行,然后重新启动Jupyter Notebook内核

  2. 单独代码“ frame = cv2.VideoCapture(0)”位于单独的单元格中,位于[先前的代码放在上方的单元格中,下面的代码置于向下的单元格]

  3. 然后在“ frame = cv2.VideoCapture(0)”单元格上方运行所有代码。

  4. 然后尝试使用唯一的代码“ frame = cv2.VideoCapture(0)”运行下一个单元格-并且-直到您将继续执行其他单元格-确保-该在此特定单元格 DISAPEAR 的左侧显示ASTERIX ,并显示命令顺序号-仅然后继续

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

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

答案 13 :(得分:0)

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

答案 14 :(得分:0)

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