while(True):
img = sensor.snapshot()
rects = img.find_rects(threshold = 8000,x_margin = 15, y_margin = 15, r_margin = 15,r_min = 15, r_max = 100, r_step = 15)
if rects:
print('sum1 :', len(rects))
output_str = json.dumps(rects)
for r in rects:
img.draw_rectangle(r.rect(),color = (128,250,128)) # rect
area = (r.x(),r.y(),r.w(),r.h())
for lines in img.find_lines(threshold = 2000, theta_margin = 40, rho_margin = 25,roi=area):
for line in range(lines):
pass
# img.draw_line(line.line(), color = (255, 0, 0))
# 如果画面中有两条直线
if len(lines) >= 2:
(line1, line2) = find_verticle_lines(lines)
if (line1 == None or line2 == None):
print('it is not a rect')
else:
print('you send rects:',output_str)
uart.write('2' '\n')
uart.write(output_str+'\n')
else:
print('not found rects!')
cricles = img.find_circles(threshold = 2250, x_margin = 30, y_margin = 30, r_margin = 25,r_min = 10, r_max = 100, r_step = 10)
if cricles:
print('sum2 :',len(cricles))
output_str=json.dumps(cricles)#函数的使用,将字典转化为字符串
for c in cricles:
img.draw_circle(c.x(), c.y(), c.r(), color = (255, 0, 0)) # rect
print('you send cricle:',output_str)
uart.write('3' '\n')
uart.write(output_str+'\n')
else:
print('not found cricles!')
print("FPS %f" % clock.fps())
# min_degree = 0 # 直线最小角度
# max_degree = 179 # 直线最大角度
# 判断是否为直角的阈值
right_angle_threshold = (70, 90)
binary_threshold = [(0, 60)]
forget_ratio = 0.8
move_threshold = 5
#利用四边形的角公式,计算出直线夹角
def calculate_angle(line1,lin2):
angle = (180 - abs(line1.theta() - line.theta()))
if angle > 90:
angle = 180 - angle
return angle
# 判断两个直线之间的夹角是否为直角
def is_right_angle(line1, line2):
global right_angle_threshold
angle = calculate_angle(line1, line2)
if angle >= right_angle_threshold[0] and angle <= right_angle_threshold[1]: # 判断在阈值范围内
return True
return False
#寻找直角
def find_verticle_lines(lines):
line_num = len(lines)
for i in range(line_num -1):
for j in range(i, line_num):
if is_right_angle(lines[i], lines[j]):
return (lines[i], lines[j])
return (None, None)
在最开始运行的时候,错误语句为"for line in (lines):",报错理由为:‘line’ object isn't iterable。后来我便将错误语句改为“for line in range(lines)”,报错理由则变为了不支持的类型,有没有好心人能指出一下,是哪里的类型换算出现问题,初学者目前还看不到该如何更改
lines应该是一个类对象之类的而不是列表之类可以遍历的东西。如果你想要的这个。如果你想要对象的数据,应该用访问对象成员方法的方式来访问而不是遍历。比例获取线的角度就是
for lines in img.find_lines(threshold = 2000, theta_margin = 40, rho_margin = 25,roi=area):
angle=lines.theta()
print(angle)