打开cv错误:(-215)scn == 3 || scn == 4在函数cvtColor中


89

我目前在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时,它仅返回两个数字,因此我一定做错了。但是我不知道加载照片的正确方法。


11
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 / ...
Micka,

我也遇到了这个问题,但是事实证明.../eclipse\ footage/...我的路径中有一个空格()。因此添加一个...,0)并不能解决问题。
科迪

Answers:


102

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

例如

import numpy as np
import cv2

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

另外,如果0在使用加载图像时输入第二个参数,cv2.imread而不需要使用转换图像cvtColor,则它已经作为灰度图像加载了。

import numpy as np
import cv2

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

6
如果您要从相机抓取图像:如果无法访问相机,则会出现此错误。
ger.s.brett

...或者如果您提供的视频文件路径错误; P我遇到了这个问题,因为我弄乱了该死的Windows路径(写成c:/而不是C://)
范妮


6
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)


4

您应该检查的第一件事是映像是否存在于根目录中。这主要是由于图像的高度=0。这意味着cv2.imread(imageName)未读取图像。


这个答案解决了我的问题-我读了视频,当视频结束时它不会自动停止,因此尝试cv2.cvtColor输入空白帧时会遇到相同的错误。
Mikhail_Sam '18

2

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

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)

这样编写,您的代码将无法正常运行。


1

如果对于尝试访问相机时遇到相同问题的人们,则可以使用此答案。

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 

1
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类型的图像。



0

这是我以.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相同的类型。如果是这样,只需更改类型。


0

在实现的OS XI上,尽管cv2.imread可以处理“ filename.jpg”,但不能处理“ file.name.jpg”。作为python的新手,我尚不能提出解决方案,但是正如FrançoisLeblanc所写的那样,它更多是一个无声的读取错误。

因此,它在文件名中带有一个附加点以及可能还有其他符号(例如“”(空格)或“%”等)都有问题。


0

我还发现,如果您的网络摄像头没有正确关闭或正在使用某件东西,那么CV2将给出同样的错误。我必须重新启动PC才能使其重新工作。


0

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

cap.release()
cv2.closeAllWindows()

这对我有用,有时还需要重新启动内核,因为在后台运行的是旧进程。

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

为了避免将来出现此问题,请尝试使用特殊的处理方式进行编码,以便如果由于某种随机原因发生了错误的终止,则捕获的设备将在程序结束后释放。


0

2015-05-27-191152.jpg <<回首您的图像格式,我有时在.png和.jpg之间感到困惑,并遇到相同的错误。


0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.