在网上搜索DIY激光测距仪网络摄像头后;我发现了一个很酷的项目,可以找到激光的距离,单位为厘米。我想知道是否有人可以帮我改变一些代码行,以便它可以用小数来测量码的距离(像分数一样)。 这是我找到webcam laser rangefinder
网站的链接我对三角学一无所知,除了我记得的高中代数和几何学之外我什么都不知道。换句话说,我不理解这个链接正在谈论的数学;这就是为什么,我要求有人向我展示一个例子,如果用码而不是厘米来测量代码会是什么样子。先谢谢你。
这是代码
## 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 "
答案 0 :(得分:2)
假设码=厘米* 0.010936
更改此块:
if tan_theta > 0: # bit of error checking
obj_dist = int(5.33 / tan_theta)
对此:
if tan_theta > 0: # bit of error checking
obj_dist = int(5.33 / tan_theta)
#convert from centimeters to yards
obj_dist = obj_dist * 0.010936
如果我们看一下它告诉我们点的距离的部分,我们会看到行print "\033[12;0H" + "the dot is " + str(obj_dist) + "cm away"
。这告诉我们距离存储在变量obj_dist
中。所以我回顾一下代码,了解obj_dist是如何得到它的价值的。引用的唯一其他时间obj_dist
位于第obj_dist = int(5.33 / tan_theta)
行。查看该行的另一种方法是obj_dist = centimters_away
。所以要获得码数,我们所要做的就是添加一条将obj_dist
从厘米转换为码的线,这就是我所做的。