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

时间:2015-05-28 12:06:01

标签: python opencv photo

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

18 个答案:

答案 0 :(得分:90)

使用正斜杠提供完整的图像路径。它解决了我的错误。

E.g。

\includegraphics

此外,如果您在使用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

答案 1 :(得分: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

答案 2 :(得分:5)

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)

答案 3 :(得分:4)

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

答案 4 :(得分:4)

只传递图片的名称,不需要0

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

答案 5 :(得分: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)

以这种方式编写,您的代码将会正常失败。

答案 6 :(得分: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 

答案 7 :(得分:1)

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

上述错误是图像名称无效或本地目录中不存在该文件的结果。

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

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

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

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

是在find /wordpress/htdocs/wp-content/ a/wordpress/htdocs2/wp-content/ \ -type f -exec stat {} --printf '%n %A\n' \; | \ sed 's!.*/wp-content/!!' | sort | uniq -u | sed 'N;s/\n/ || /' 的情况下,图像是8uC1和32sC1类型的图像。

答案 8 :(得分:1)

对于那些在尝试访问摄像机时遇到同样问题的人,可以使用安全检查编写此代码。

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

OR 如果你想关闭相机/停止,如果框架本身有问题

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

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

答案 9 :(得分:0)

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

答案 10 :(得分: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。如果是这样,只需更改类型即可。

答案 11 :(得分:0)

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

因此,文件名中有一个额外的点以及可能还有其他符号的问题,例如“”(空格)或“%”等。

答案 12 :(得分:0)

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

答案 13 :(得分:0)

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

cap.release()
cv2.closeAllWindows()

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

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

为避免将来出现此问题,请尝试进行特殊处理的代码 这样一来,如果由于某种随机原因发生了错误的终止,则捕获程序将在程序结束后释放。

答案 14 :(得分:0)

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

答案 15 :(得分:0)

就我而言,通过迁移到OpenCV 4.0(或更高版本)可以解决错误。

答案 16 :(得分:0)

嗯,我遇到了同样的问题,但是我没有拍摄输入图像而是获取了视频帧,因此上述解决方案无法解决该问题。 问题出在摄像头访问中,您以前的代码仍在使用笔记本电脑的摄像头,您只需重新启动内核即可使用。

答案 17 :(得分:-3)

在第11行尝试这个,为我工作。我认为你错过了函数detectMultiScale()

的参数
faces = face_cascade.detectMultiScale(gray, 1.3, 5)