#python #opencv
#питон #opencv
Вопрос:
Моя цель в этом коде-измерить расстояние до черного объекта на изображении, полученном с помощью камеры, но, как указано в ошибке ниже, это событие не происходит. Код выглядит следующим образом:
import cv2 import numpy as np def make_coordinates(image, line_parameters): slope, intercept = line_parameters y1 = image.shape[0] y2 = int(y1*(3/5)) x1 = int((y1 - intercept)/slope) x2 = int((y2 - intercept)/slope) return np.array([x1, y1, x2, y2]) def average_slope_intercept(image, lines): left_fit = [] right_fit = [] if lines is not None: for line in lines: x1, y1, x2, y2 = line.reshape(4) parameters = np.polyfit((x1, x2), (y1, y2), 1) slope = parameters[0] intercept = parameters[1] if slope lt; 0: left_fit.append((slope, intercept)) else: right_fit.append((slope, intercept)) left_fit_average = np.average(left_fit, axis=0) #right_fit_average = np.average(right_fit, axis=0) print(left_fit_average, 'left') #print(right_fit_average, 'right') left_line = make_coordinates(image, left_fit_average) #right_line = make_coordinates(image, right_fit_average) return np.array([left_line]) def distance_to_camera(knownWidth, focalLength, perWidth): return (knownWidth * focalLength) / perWidth # The first step in finding the distance from the object or mark in the image is to calibrate and calculate the focal length . So , We need to know : # Initialize the distance from a known object to the camera KNOWN_DISTANCE = 24.0 # Initializes the width of a known object KNOWN_WIDTH = 11.0 def canny(img): hsv = cv2.cvtColor(img, cv2.COLOR_RBG2HSV) black_lower = np.array([0, 0, 0]) black_upper = np.array([180, 255, 30]) black_mask = cv2.inRange(hsv, black_lower, black_upper) kernel = 5 blur = cv2.GaussianBlur(black_mask, (kernel, kernel),0) canny = cv2.Canny(blur, 50, 150) return canny def display_lines(img, lines): line_image = np.zeros_like(img) if lines is not None: for line in lines: for x1, y1, x2, y2 in line: cv2.line(line_image, (x1, y1), (x2, y2), (255, 0, 0), 10) return line_image def region_of_interest(canny): height = canny.shape[0] width = canny.shape[1] mask = np.zeros_like(canny) square = np.array([[(635,478),(0,478),(281,200)] ]) cv2.fillPoly(mask, square, 255) masked_image = cv2.bitwise_and(canny, mask) return masked_image cap = cv2.VideoCapture(0) _,c_image = cap.read() marker = canny(c_image) focalLength = (marker [1][0] * KNOWN_DISTANCE) / KNOWN_WIDTH print('focalLength', focalLength) while True: _, frame = cap.read() canny_image = canny(frame) cropped_canny = region_of_interest(canny_image) lines = cv2.HoughLinesP(cropped_canny, 2, np.pi / 180, 100, np.array([]), minLineLength=40, maxLineGap=5) averaged_lines = average_slope_intercept(frame, lines) line_image = display_lines(frame, averaged_lines) combo_image = cv2.addWeighted(frame, 0.8, line_image, 1, 1) CM = distance_to_camera(KNOWN_WIDTH, focalLength, marker[1][0]) cv2.imshow("result", combo_image) cv2.putText(frame, "%.2fft" % CM, (frame.shape[1] - 200, frame.shape[0] - 20), cv2.FONT_HERSHEY_SIMPLEX, 2.0, (0, 255, 0), 3) if cv2.waitKey(1) amp; 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows()
Полученное изображение в результате написанного кода
Ошибка заключается в следующем.
gt;gt;gt; %Run mesafe.py focalLength 0.0 [-3.89346104e-01 4.41339935e 02] left mesafe.py:18: RuntimeWarning: invalid value encountered in double_scalars return (knownWidth * focalLength) / perWidth [-3.90163497e-01 4.41415626e 02] left [-3.85150497e-01 4.40625233e 02] left [-3.93702170e-01 4.43145302e 02] left
Комментарии:
1. попробуйте распечатать
knownWidth
focalLength
perWidth
и проверьте , действительны ли они2. Фокусная длина и ширина показывают 0. Как я могу это исправить?
3. ты знаешь свой кодекс. вы знаете, откуда берутся ценности. используйте отладчик (pdb, отладчик python).
4. если
perWidth
равно 0, вы делите на 0, в этом и заключается проблема5. вы создали функцию
canny
funtcino, которая используетCanny
функцию opencv и имеетcanny
переменную, попробуйте очистить ее, и вы можете найти корень всех ваших проблем 🙂