下面是我当前的代码,我尝试在一个颜色检测中加入距离跟踪,直接从picamera上对蓝色的实时流进行跟踪。在
我的大学项目是设计小型机器人,必须在一个区域内定位一个物体,然后把它带回基地。我们的方法是对所需的物体进行颜色编码,以便在它移动时跟踪它,然后能够使用picamera自身计算出它离颜色越来越近的距离。 当代码运行时,蓝色可以被检测并精确跟踪,并且在帧的下角输出距离测量值。然而,这个测量值随机波动很大,似乎没有测量到蓝色标记,因为当我将对象移近/远离相机时,它没有适当的响应。在
所以问题一定是,颜色标记在脚本中没有被正确引用,所以一旦它使用静态图像“cam1.jpg”来校准自己(从中计算焦距),那么它就知道如何测量了,而我不确定如何正确地进行校准。我知道这两个标记(图像和颜色)必须在同一个def find_marker()函数中引用,但不完全确定如何引用。此外,focalLength的值取决于在循环中更新的标记[1][0],但focalLength没有,我认为这是主要问题所在。我试着在循环中添加定义focalLength的行,但是当我运行脚本时,一个0.42ft的常量值被输出到框架的底部,这意味着它没有得到正确的更新,而且由于我有限的python知识,我不知道该怎么做。下面是我尝试过的脚本。在
如何在脚本中引用FocalLength,以便其值在循环中得到正确更新?在
在过去的几天里,我一直在讨论这个问题,而且我还是Python的新手,所以如果有任何帮助/指导,我将不胜感激!这是我在pyimagesearch的文章和在线论坛的帮助下,试图调整和合并pyimagesearch的博客文章,用于颜色检测和测量树莓皮的距离。在
规格:Raspberry PI Zero W、Python2.7、OpenCV3.2,在Mac上通过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
提前谢谢!在
目前没有回答
相关问题 更多 >
编程相关推荐