使用颜色标记RaspberryPI

时间:2018-03-02 14:07:49

标签: python colors raspberry-pi distance marker

下面是我目前的代码,我试图在直接来自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

提前致谢!

0 个答案:

没有答案