下面是我目前的代码,我试图在直接来自picamera的实时流中对蓝色进行颜色检测中的距离跟踪并跟踪它。
我的大学项目是关于设计小型机器人,必须在一个区域内找到一个物体并将其取回基地。我们的方法是对所需的检测对象进行颜色编码,以便在移动时跟踪它,然后使用picamera本身计算距离颜色的距离。 运行代码时,可以检测并跟踪蓝色,并在帧的底角输出距离测量值。然而,这种测量随机波动很多并且似乎没有测量到蓝色标记,因为当我将物体移近或远离相机时它没有适当地响应。
所以问题必须是在脚本中没有正确引用颜色标记,以便它知道在使用静止图像“cam1.jpg”进行校准后测量它(计算焦距)而且我不确定如何正确地做到这一点。我知道两个标记(图像和颜色)必须在相同的def find_marker()函数中引用,但不完全确定如何。此外,focalLength的值取决于标记[1] [0],它在循环中得到更新,但是我认为不是主要问题所在的focalLength。我尝试将我定义focalLength的行添加到循环中,但是当我运行脚本时,将一个0.42ft的常量值输出到框架的底部,这意味着它没有得到正确的更新,我不知道如何去做由于我有限的python知识这样做。下面是我试过这个的脚本。
如何在脚本中引用FocalLength,以便在循环中正确更新其值?
我过去几天一直坚持这一点,而且我还是Python的新手,所以任何帮助/指导都会非常感激!据我所知,在pyimagesearch的文章和在线论坛的帮助下,我试图通过改编和合并pyimagesearche的博文来进行颜色检测和测量Raspberry Pi的距离。
SPECS:Raspberry PI Zero W,python 2.7,Mac上的OpenCV 3.2通过VNC - 这是我的代码:
我的代码:
from picamera.array import PiRGBArray
from picamera import PiCamera
import time
import cv2
import numpy as np
camera = PiCamera()
camera.resolution = (640, 480)
camera.framerate = 50
camera.hflip = True
rawCapture = PiRGBArray(camera, size=(640, 480))
time.sleep(0.1)
camera.capture(rawCapture, format='bgr')
image = rawCapture.array
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gray = cv2.GaussianBlur(gray, (5, 5), 0)
edged = cv2.Canny(gray, 35, 125)
def find_marker(image):
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gray = cv2.GaussianBlur(gray, (5, 5), 0)
edged = cv2.Canny(gray, 35, 125)
lower = np.array([76,31,4],dtype="uint8")
upper = np.array([210,90,70], dtype="uint8")
rawCapture.truncate(0)
(_, cnts, _) = cv2.findContours(edged.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
c = max(cnts, key = cv2.contourArea)
return cv2.minAreaRect(c)
def distance_to_camera(knownWidth, focalLength, perWidth):
return (knownWidth * focalLength) / perWidth
KNOWN_DISTANCE = 5.0
KNOWN_WIDTH = 2.0
IMAGE_PATHS = ['cam1.jpg']
image = cv2.imread(IMAGE_PATHS[0])
marker = find_marker(image)
focalLength = (marker[1][0] * KNOWN_DISTANCE) / KNOWN_WIDTH
for frame in camera.capture_continuous(rawCapture, format="bgr", use_video_port=True):
image = frame.array
blur = cv2.blur(image, (3,3))
marker = find_marker(image)
lower = np.array([76,31,4],dtype="uint8")
upper = np.array([210,90,70], dtype="uint8")
thresh = cv2.inRange(blur, lower, upper)
thresh2 = thresh.copy()
image, contours,hierarchy = cv2.findContours(thresh,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
inches = distance_to_camera(KNOWN_WIDTH, focalLength, marker[1][0])
max_area = 0
best_cnt = 1
for cnt in contours:
image = frame.array
area = cv2.contourArea(cnt)
if area > max_area:
max_area = area
best_cnt = cnt
M = cv2.moments(best_cnt)
cx,cy = int(M['m10']/M['m00']), int(M['m01']/M['m00'])
cv2.circle(blur,(cx,cy),10,(0,0,255),-1)
cv2.putText(blur, "%.2fft" % (inches / 12),
(image.shape[1] - 200, image.shape[0] - 20), cv2.FONT_HERSHEY_SIMPLEX,
2.0, (0, 255, 0), 3)
cv2.imshow("Frame", blur)
key = cv2.waitKey(1) & 0xFF
rawCapture.truncate(0)
if key == ord("q"):
break
提前致谢!