用颜色标记器RaspberryPI测量Picamera的颜色距离

2024-07-05 09:46:23 发布

您现在位置:Python中文网/ 问答频道 /正文

下面是我当前的代码,我尝试在一个颜色检测中加入距离跟踪,直接从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

提前谢谢!在


Tags: imageimport颜色npareaarraycv2marker