I got an error,TypeError: src is not a numpy array, neither a scalar.
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
. I wrote in 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()
I searched this error, and i found this question exceptions.TypeError: src is not a numpy array, neither a scalar ,but I already use cv2.COLOR_BGR2GRAY in cvtColor method so I really cannot understand why this error happens.And I really cannot understand the meaning of src. What is wrong in my code?How should I fix this? I referenced this opencv document https://docs.opencv.org/3.4.0/d9/df8/tutorial_root.html .
The problem is here:
images = Image.open('photo.jpg')
gray = cv2.cvtColor(images,cv2.COLOR_BGR2GRAY)
OpenCV uses numpy arrays. So you'd need to convert that PIL image to a numpy array. Perhaps something like this:
images = np.array(Image.open('photo.jpg'))
gray = cv2.cvtColor(images,cv2.COLOR_BGR2GRAY)
According to cv2
documentation:
Python: cv.CvtColor(src, dst, code) → None
Parameters:
src – input image: 8-bit unsigned, 16-bit unsigned ( CV_16UC... ),
or single-precision floating-point.
That means images
in your code is not the required kind of thing.
And from 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().
Apparently you have opened the file, but loaded the image. And cv2
can't load it for you.
Note that I'm working from documentation that I can find on line; I don't have first hand experience with these modules. Do you have documentation or examples that indicate that this code should work?
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With