我目前在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时,它只返回两个数字,所以我一定做错了。但我不知道加载照片的正确方法。
答案 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中提供的示例脚本中,请注意它包含undistort
和crop 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
我所做的是:我在每次运行后删除了新生成的图像,或者将图像类型更改为png
或tiff
类型。这解决了这个问题。检查您是否输入和编写相同类型的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)