打开简历错误:(-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.imread
将 not 出错:
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 中提供的示例脚本中,请注意它具有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
。如果是这样,只需更改类型。
【讨论】:
【参考方案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的主要内容,如果未能解决你的问题,请参考以下文章
OpenCV Error: Assertion failed (scn == 3 || scn == 4) in cv::cvtColor
OpenCV 3.1 drawContours '(-215) npoints > 0'