TypeError:src不是numpy数组,也不是标量我的代码中有什么问题?

0h4hbjxa  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(108)

我得到一个错误,TypeError:src不是numpy数组,也不是标量。

Traceback says 
Traceback (most recent call last):
  File "img.py", line 19, in <module>
    gray = cv2.cvtColor(images,cv2.COLOR_BGR2GRAY)
TypeError: src is not a numpy array, neither a scalar

我在img.py上写的

import numpy as np
import cv2
import glob
from PIL import Image

# termination criteria
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)

# prepare object points, like (0,0,0), (1,0,0), (2,0,0) ....,(6,5,0)
objp = np.zeros((6*7,3), np.float32)
objp[:,:2] = np.mgrid[0:7,0:6].T.reshape(-1,2)

# Arrays to store object points and image points from all the images.
objpoints = [] # 3d point in real world space
imgpoints = [] # 2d points in image plane.

images = Image.open('photo.jpg')

gray = cv2.cvtColor(images,cv2.COLOR_BGR2GRAY)

# Find the chess board corners
ret, corners = cv2.findChessboardCorners(gray, (7,6),None)

# If found, add object points, image points (after refining them)
if ret == True:
   objpoints.append(objp)

   corners2 = cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),criteria)
   imgpoints.append(corners2)

   # Draw and display the corners
   img = cv2.drawChessboardCorners(img, (7,6), corners2,ret)
   cv2.imshow('img',img)
   cv2.waitKey(500)

cv2.destroyAllWindows()

我搜索这个错误,我发现这个问题exceptions.TypeError: src is not a numpy array, neither a scalar,但我已经在cvtColor方法中使用了cv2.COLOR_BGR2GRAY,所以我真的不明白为什么会发生这个错误。我真的不明白src的含义。我的代码有什么问题?我该怎么解决这个问题?我引用了这个opencv文档https://docs.opencv.org/3.4.0/d9/df8/tutorial_root.html

hgqdbh6s

hgqdbh6s1#

问题就在这里:

images = Image.open('photo.jpg')

gray = cv2.cvtColor(images,cv2.COLOR_BGR2GRAY)

OpenCV使用numpy数组。所以你需要将PIL图像转换为numpy数组。也许是这样的:

images = np.array(Image.open('photo.jpg'))

gray = cv2.cvtColor(images,cv2.COLOR_BGR2GRAY)
2lpgd968

2lpgd9682#

根据cv2文档:

Python: cv.CvtColor(src, dst, code) → None
Parameters: 
src – input image: 8-bit unsigned, 16-bit unsigned ( CV_16UC... ), 
   or single-precision floating-point.

这意味着代码中的images不是必需的。
从PIL:

PIL.Image.open(fp, mode='r')
Opens and identifies the given image file.

This is a lazy operation; this function identifies the file, 
but the file remains open and the actual image data is not read from the file 
until you try to process the data (or call the load() method). See new().

显然你已经打开了文件,但加载了图像。cv2无法为您加载。
请注意,我的工作从文件,我可以找到在线;我没有这些模块的第一手经验。您是否有文档或示例表明此代码应该工作?

相关问题