如何更改此激光测距仪python代码以检测绿点而不是红点?

如何更改此激光测距仪python代码以检测绿点而不是红点?,python,Python,所以我和我的朋友准备组装这个自制的激光测距仪,有人在这个网站上发布了:。在我们访问python代码部分之前一切都很顺利,因为我们不熟悉任何编程语言。正如网站上的项目所描述的,它应该能够在网络摄像头的视野中检测到一个红点。不幸的是,我们已经买了一台绿色激光器。如何更改代码,使其检测到绿点?代码如下: ## program written by Shane Ormonde 7th sept 2013 ## updated on 25th January 2014 ## calculates the

所以我和我的朋友准备组装这个自制的激光测距仪,有人在这个网站上发布了:。在我们访问python代码部分之前一切都很顺利,因为我们不熟悉任何编程语言。正如网站上的项目所描述的,它应该能够在网络摄像头的视野中检测到一个红点。不幸的是,我们已经买了一台绿色激光器。如何更改代码,使其检测到绿点?代码如下:

## program written by Shane Ormonde 7th sept 2013
## updated on 25th January 2014
## calculates the distance of a red dot in the field of view of the webcam.


import cv2
from numpy import *
import math

#variables
loop = 1

dot_dist = 0

cv2.namedWindow("preview")
vc = cv2.VideoCapture(1)



if vc.isOpened(): # try to get the first frame
    rval, frame = vc.read()

else:
    rval = False
    #print "failed to open webcam"


if rval == 1 :

    while loop == 1:
            cv2.imshow("preview", frame)
            rval, frame = vc.read()
            key = cv2.waitKey(20)
            if key == 27: # exit on ESC
                loop = 0
            num = (frame[...,...,2] > 236)
            xy_val =  num.nonzero()

            y_val = median(xy_val[0])
            x_val = median(xy_val[1])

            dist = ((x_val - 320)**2 + (y_val - 240)**2 )**0.5 # distance of dot from center pixel
            dist = abs(x_val - 320) # distance of dot from center x_axis only

            print " dist from center pixel is " + str(dist) 

            # work out distance using D = h/tan(theta)

            theta =0.0011450*dist + 0.0154         
            tan_theta = math.tan(theta)



            if tan_theta > 0: # bit of error checking
                obj_dist =  int(5.33 / tan_theta)


            print "\033[12;0H" + "the dot is " + str(obj_dist) + "cm  away"
elif rval == 0:
        print " webcam error "    
rval,frame=vc。读取BGR格式的图像。您直接链接的教程页面说明了这一点

所以所有的像素数据都存储在一个名为frame的numpy数组中。默认情况下,opencv获取的图像为640 x 480,x轴为640,y轴为480。numpy数组有三个维度xyBGR,因此前两个维度中只有一个数字指定像素的x或y坐标。第三维包含三个数字,即该像素的RGB内容。尽管由于某些原因,这些值是按BGR排列的

因此,改变路线

num = (frame[...,...,2] > 236)

我应该为你做这件事

为了非常简单地解释这条线的作用,它在颜色平面中检查236以上的高强度值,其中min=0,max=255,并记录所有这些像素。这个想法是,如果你用红色激光照射,红色的颜色平面将在点区域周围聚集高强度值。

rval,frame=vc。读取BGR格式的图像。您直接链接的教程页面说明了这一点

所以所有的像素数据都存储在一个名为frame的numpy数组中。默认情况下,opencv获取的图像为640 x 480,x轴为640,y轴为480。numpy数组有三个维度xyBGR,因此前两个维度中只有一个数字指定像素的x或y坐标。第三维包含三个数字,即该像素的RGB内容。尽管由于某些原因,这些值是按BGR排列的

因此,改变路线

num = (frame[...,...,2] > 236)

我应该为你做这件事


为了非常简单地解释这条线的作用,它在颜色平面中检查236以上的高强度值,其中min=0,max=255,并记录所有这些像素。这个想法是,如果你用红色激光照射,红色的颜色平面将在点区域周围有一个高强度值的集中。

我猜vc.read读取的是存储在帧中的BGR图像。所以第[…,…,2]帧是红色通道,第[…,…,1]帧应该是绿色通道。检查文档以验证这一点。感谢您的回答。我现在没有时间尝试,所以我明天会尝试。我猜vc.read读取的是BGR图像,存储在帧中。所以第[…,…,2]帧是红色通道,第[…,…,1]帧应该是绿色通道。检查文档以验证这一点。感谢您的回答。我现在没有时间试一试,所以我明天就试一试。