Link to home
Start Free TrialLog in
Avatar of shruti A
shruti A

asked on

ValueError: too many values to unpack (expected 2)

ValueError: too many values to unpack (expected 2) this error occured when executing below program
# USAGE
# python distance_to_camera.py

# import the necessary packages
import numpy as np
import cv2

def find_marker(image):
	# convert the image to grayscale, blur it, and detect edges
	gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
	gray = cv2.GaussianBlur(gray, (5, 5), 0)
	edged = cv2.Canny(gray, 35, 125)

	# find the contours in the edged image and keep the largest one;
	# we'll assume that this is our piece of paper in the image
	(cnts, _) = cv2.findContours(edged.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
	c = max(cnts, key = cv2.contourArea)

	# compute the bounding box of the of the paper region and return it
	return cv2.minAreaRect(c)

def distance_to_camera(knownWidth, focalLength, perWidth):
	# compute and return the distance from the maker to the camera
	return (knownWidth * focalLength) / perWidth

# initialize the known distance from the camera to the object, which
# in this case is 24 inches
KNOWN_DISTANCE = 24.0

# initialize the known object width, which in this case, the piece of
# paper is 12 inches wide
KNOWN_WIDTH = 11.0

# initialize the list of images that we'll be using
IMAGE_PATHS = ["images/2ft.png", "images/3ft.png", "images/4ft.png"]

# load the furst image that contains an object that is KNOWN TO BE 2 feet
# from our camera, then find the paper marker in the image, and initialize
# the focal length
image = cv2.imread(IMAGE_PATHS[0])
marker = find_marker(image)
focalLength = (marker[1][0] * KNOWN_DISTANCE) / KNOWN_WIDTH

# loop over the images
for imagePath in IMAGE_PATHS:
	# load the image, find the marker in the image, then compute the
	# distance to the marker from the camera
	image = cv2.imread(imagePath)
	marker = find_marker(image)
	inches = distance_to_camera(KNOWN_WIDTH, focalLength, marker[1][0])

	# draw a bounding box around the image and display it
	box = np.int0(cv2.cv.BoxPoints(marker))
	cv2.drawContours(image, [box], -1, (0, 255, 0), 2)
	cv2.putText(image, "%.2fft" % (inches / 12),
		(image.shape[1] - 200, image.shape[0] - 20), cv2.FONT_HERSHEY_SIMPLEX,
		2.0, (0, 255, 0), 3)
	cv2.imshow("image", image)
	cv2.waitKey(0)
 

Open in new window




error came like this

Traceback (most recent call last):
  File "C:\Users\vip\AppData\Local\Programs\Python\Python36-32\distance-to-camera\distance_to_camera.py", line 41, in <module>
    marker = find_marker(image)
  File "C:\Users\vip\AppData\Local\Programs\Python\Python36-32\distance-to-camera\distance_to_camera.py", line 16, in find_marker
    (cnts, _) = cv2.findContours(edged.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
ValueError: too many values to unpack (expected 2)
>>> 

so what i need to do to execute it correctly
Avatar of Flabio Gates
Flabio Gates

First, what version of cv2 do you have?
print(cv2.__version__)

Open in new window

For version 3.3.0 on my machine, help(cv2.findContours) says that findContours returns 3 values: image, contours, hierarchy
Thus I would guess you need to change your call from
(cnts, _) = cv2.findContours(edged.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)

Open in new window

to
(_, cnts, _) = cv2.findContours(edged.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)

Open in new window

Again, that would be a guess
mine also 3.3.0 version so its giving error still after editing what you have said
Traceback (most recent call last):
  File "C:\Users\vip\AppData\Local\Programs\Python\Python36-32\distance-to-camera\distance_to_camera.py", line 54, in <module>
    box = np.int0(cv2.cv.BoxPoints(marker))
AttributeError: module 'cv2.cv2' has no attribute 'cv'

giving error like this
ASKER CERTIFIED SOLUTION
Avatar of Flabio Gates
Flabio Gates

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
or you can try to download an earlier version of cv2 and use that instead.
Question inactive