打开简历错误:(-215) scn == 3 ||函数 cvtColor 中的 scn == 4

Posted

技术标签:

【中文标题】打开简历错误:(-215) scn == 3 ||函数 cvtColor 中的 scn == 4【英文标题】:open cv error: (-215) scn == 3 || scn == 4 in function cvtColor 【发布时间】:2015-08-10 22:27:30 【问题描述】:

我目前在 Ubuntu 14.04 中,使用 python 2.7 和 cv2。

当我运行这段代码时:

import numpy as np
import cv2

img = cv2.imread('2015-05-27-191152.jpg',0)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

它返回:

 File "face_detection.py", line 11, in <module>
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.error: /home/arthurckl/Desktop/opencv-3.0.0-rc1/modules/imgproc/src/color.cpp:7564: error: (-215) scn == 3 || scn == 4 in function cvtColor

我已经在这里搜索过,一个答案说我可能以错误的方式加载我的照片,因为它应该有 3 个维度:行、列和深度。

当我打印 img.shape 时,它​​只返回两个数字,所以我一定是做错了。但我不知道加载照片的正确方法。

【问题讨论】:

img = cv2.imread('2015-05-27-191152.jpg',0) 0 参数已经将您的图像加载为 1 通道灰度图像。所以要么尝试img = cv2.imread('2015-05-27-191152.jpg')gray = cv2.imread('2015-05-27-191152.jpg',0) 看看不同的标志:docs.opencv.org/modules/highgui/doc/… 我也遇到了这个问题,但结果是我的路径中有一个空格 (.../eclipse\ footage/...)。所以添加...,0) 并没有解决它。 【参考方案1】:

好吧,我也遇到了同样的问题,但我没有获取输入图像,而是获取视频帧,而上述解决方案对此不起作用。 问题在于摄像头访问,您之前的代码仍在使用笔记本电脑的摄像头,您只需重新启动内核即可。

【讨论】:

【参考方案2】:

在我的情况下,错误通过迁移到 OpenCV 4.0(或更高版本)得到解决。

【讨论】:

【参考方案3】:

我认为是因为cv2.imread无法读取.jpg图片,您需要将.jpg更改为.png

【讨论】:

【参考方案4】:

对于那些在尝试访问相机时遇到相同问题的人,可以编写此代码并进行安全检查。

if ret is True:
   gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
else:
   continue

或 如果您想关闭相机/如果框架本身存在问题则停止

if ret is True:
   gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
else:
   break

供参考https://github.com/HackerShackOfficial/AI-Smart-Mirror/issues/36

【讨论】:

【参考方案5】:

2015-05-27-191152.jpg

【讨论】:

【参考方案6】:

消除该错误的最简单解决方案是运行命令

cap.release()
cv2.closeAllWindows()

这对我有用,有时由于后台运行旧进程而需要重新启动内核。

如果图像不在工作目录中,那么尝试将图像文件放在 pwd 中与代码相同的文件夹中也不会起作用,否则提供图像文件或文件夹的完整路径。

为避免以后出现此问题,请尝试使用异常处理进行编码 这样如果由于某种随机原因发生不正确的终止,捕获设备将在程序结束后被释放。

【讨论】:

【参考方案7】:

我还发现,如果您的网络摄像头没有正确关闭或正在使用它,那么 CV2 会给出同样的错误。 我必须重新启动我的电脑才能让它再次工作。

【讨论】:

【参考方案8】:

在 OS X 上我意识到,虽然 cv2.imread 可以处理“filename.jpg”,但它不能处理“file.name.jpg”。作为 python 新手,我还不能提出解决方案,但正如 François Leblanc 所写,这更像是一个无声的 imread 错误。

所以文件名中的一个额外的点和其他符号也有问题,如“”(空格)或“%”等等。

【讨论】:

【参考方案9】:
cv2.error: /home/arthurckl/Desktop/opencv-3.0.0-rc1/modules/imgproc/src/color.cpp:7564: error: (-215) scn == 3 || scn == 4 in function cvtColor

上述错误是由于图像名称无效或本地目录中不存在文件。

img = cv2.imread('2015-05-27-191152.jpg',0)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

另外,如果您使用 cv2.imread() 的第二个参数作为 '0',那么它已经转换为灰度图像。

通过传递 0 作为参数转换图像与应用以下内容之间的区别:

img = cv2.cvtCOLOR(img, cv2.COLOR_BGR2GRAY) 

是,在img = cv2.cvtCOLOR(img, cv2.COLOR_BGR2GRAY) 的情况下,图像是 8uC1 和 32sC1 类型的图像。

【讨论】:

【参考方案10】:

此答案适用于尝试访问相机时遇到相同问题的人。

import numpy as np
import cv2

cap = cv2.VideoCapture(0)

while(True):
    # Capture frame-by-frame
    ret, frame = cap.read()

    # Our operations on the frame come here
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    # Display the resulting frame
    cv2.imshow('frame',gray)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()

使用 Linux:

如果您尝试从您的计算机访问相机,很可能存在权限问题,请尝试使用 sudo 运行 python 脚本,它应该可以解决它。

sudo python python_script.py

要测试相机是否可访问,请运行以下命令。

ffmpeg -f v4l2 -framerate 25 -video_size 640x480 -i /dev/video0 output.mkv 

【讨论】:

【参考方案11】:

由于与其他答案中提到的标志 0 或 1 完全无关的原因,我已显示此错误消息。您也可能会看到它,因为如果您传递的路径字符串不是图像,cv2.imreadnot 出错:

In [1]: import cv2
   ...: img = cv2.imread('asdfasdf')  # This is clearly not an image file
   ...: gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
   ...:

OpenCV Error: Assertion failed (scn == 3 || scn == 4) in cv::cvtColor, file C:\projects\opencv-python\opencv\modules\imgproc\src\color.cpp, line 10638
---------------------------------------------------------------------------
error                                     Traceback (most recent call last)
<ipython-input-4-19408d38116b> in <module>()
      1 import cv2
      2 img = cv2.imread('asdfasdf')  # This is clearly not an image file
----> 3 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

error: C:\projects\opencv-python\opencv\modules\imgproc\src\color.cpp:10638: error: (-215) scn == 3 || scn == 4 in function cv::cvtColor

因此,您看到的是 cvtColor 失败,而实际上它是无声的 imread 错误。下次你用那个神秘的比喻浪费你一个小时的生命时,请记住这一点.

解决方案

在将路径字符串传递给cv2.imread 之前,您可能需要检查它是否代表有效文件:

import os


def read_img(path):
    """Given a path to an image file, returns a cv2 array

    str -> np.ndarray"""
    if os.path.isfile(path):
        return cv2.imread(path)
    else:
        raise ValueError('Path provided is not a valid file: '.format(path))


path = '2015-05-27-191152.jpg'
img = read_img(path)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

这样写,你的代码会优雅地失败。

【讨论】:

【参考方案12】:

用正斜杠给出图像的完整路径。它为我解决了错误。

例如

import numpy as np
import cv2

img = cv2.imread('C:/Python34/images/2015-05-27-191152.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

另外,如果您在使用cv2.imread 加载图像时在第二个参数中提供0,则无需使用cvtColor 转换图像,例如,它已经作为灰度图像加载。

import numpy as np
import cv2

gray = cv2.imread('C:/Python34/images/2015-05-27-191152.jpg',0)

【讨论】:

如果您从相机抓取图像:如果相机不可访问,您会收到此错误。 ...或者如果您提供了错误的视频文件路径;P 我在搞砸了该死的 Windows 路径时遇到了这个问题(写 c:/ 而不是 C:// )【参考方案13】:
img = cv2.imread('2015-05-27-191152.jpg',0)

上面的代码行以灰度颜色模型读取您的图像,因为末尾附加了 0。如果您再次尝试将已经是灰色的图像转换为灰色图像,则会显示该错误。

所以要么使用上述样式,要么尝试下面提到的代码:

img = cv2.imread('2015-05-27-191152.jpg')
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

【讨论】:

【参考方案14】:

首先要检查的是图像是否存在于根目录中。这主要是由于高度为 0 的图像。这意味着 cv2.imread(imageName) 没有读取图像。

【讨论】:

这个答案解决了我的问题 - 我读了视频,视频结束时它不会自动停止,所以我在尝试 cv2.cvtColor 时遇到同样的错误。【参考方案15】:

只传图片的名字,不需要0

img=cv2.imread('sample.jpg')

【讨论】:

【参考方案16】:

这是我在使用 .jpg 格式的自己的图像集时观察到的。在Opencv doc 中提供的示例脚本中,请注意它具有undistortcrop the image 行,如下所示:

# undistort
dst = cv2.undistort(img, mtx, dist, None, newcameramtx)

# crop the image
x,y,w,h = roi
dst = dst[y:y+h, x:x+w]
cv2.imwrite('calibresult.jpg',dst)

因此,当我们第一次运行代码时,它会执行cv2.imwrite('calibresult.jpg',dst) 行,将图像calibresult.jpg 保存在当前目录中。因此,当我下次运行代码时,连同我用于校准 jpg 格式相机的示例图像集,代码还尝试考虑这个新添加的图像calibresult.jpg,因此错误弹出

error: C:\builds\master_PackSlaveAddon-win64-vc12-static\opencv\modules\imgproc\src\color.cpp:7456: error: (-215) scn == 3 || scn == 4 in function cv::ipp_cvtColor

我所做的是:我只是在每次运行后删除了新生成的图像,或者将图像的类型更改为 pngtiff 类型。这解决了问题。检查您是否输入和写入相同类型的calibresult。如果是这样,只需更改类型。

【讨论】:

【参考方案17】:

请设置如下

img = cv2.imread('2015-05-27-191152.jpg',1)     // Change Flag As 1 For Color Image
                                                //or O for Gray Image So It image is 
                                                //already gray

【讨论】:

以上是关于打开简历错误:(-215) scn == 3 ||函数 cvtColor 中的 scn == 4的主要内容,如果未能解决你的问题,请参考以下文章

打开简历 3.0.0 LNK2019 错误

两帧之间的密集光流

OpenCV Error: Assertion failed (scn == 3 || scn == 4) in cv::cvtColor

OpenCV 3.1 drawContours '(-215) npoints > 0'

关于NHibernate之 no persister for: ×××.××错误的解决方法

SceneKit:将 scn 文件保存到磁盘