from typing import re
import serial # 导入串口包
import time # 导入时间包
ser = serial.Serial("COM4", 115200, timeout=5) # 开启com5口,波特率115200,超时5
ser.flushInput() # 清空缓冲区
def main():
#读取CCD数据
msg = ser.read(270).decode("gbk","ignore")
a = msg[msg.find("*"):]
if len(a) == 270:
# print("a:%s" % a)
a=a
else:
a = msg[msg.find("*"):] + ser.read(270).decode()[:270 - len(msg[msg.find("*"):])]
# print(msg[msg.find("*"):])
# print("b:" + a)
return a
def max_length(*lst):
return max(*lst, key=lambda v: len(v))
while True:
b = main()
# print(b) #完整信息
c = b[11:267]
# print("16进制:"+c)
d=[]
n=0
# print(len(a))
while n<255 :
c1=c[n:n+2] #两两分割
c2 = int(c[n:n + 2], 16) #进制转化
# print(c)
d.append(c2)
n=n+2
print("原灰度值列表:"+str(d)) #灰度值列表
d_max=str(max(d))
d_min=str(min(d))
# d_min_x=str(d.index(min(d)))#最小值索引
d_ts=str(round(min(d)*1.3)) #调整阈值
print("最大灰度值" + d_max, "最小灰度值:" + d_min, "阈值:"+d_ts)
# 找出小于阈值的灰度值
list1 = []
temp = []
d_ts_z=[]
for i in range(len(d)):
if d[i] < round(min(d)*1.3):
temp.append(d[i])
else:
list1.append(temp)
print("阈值以下列表:"+str(temp)," 个数:"+str(len(temp)))
temp1=list(enumerate(d))#原灰度值列表元素元组化
# print("原灰度值列表元组化:"+str(temp1))
p=[i for i, j in enumerate(d) if j <min(d)*1.3] #找出列表中小于阈值的灰度值索引
print("阈值以下灰度值坐标:"+str(p))
# 方法1:判断坐标连续个数 ==1
# b = []
# for a in range(len(p) - 1):
# # print(p[a], p[a] + 1)
# # print(p[a-1],p[a])
# if p[a + 1] - p[a] <= 2:
# b.append(p[a])
# # print("连续:" + str(a), p[a], p[a + 1], b)
# # else:
# # print("不连续:" + str(a))
#
# print("连续个数为:" + str(a),"连续的坐标为:"+str(b))
# 方法2 判断坐标连续个数
s1 = [] # 定义一个空列表
s2 = []
for x in sorted(set(p)):
s1.append(x)
if x + 1 not in p:
if len(s1) > 5:#判断连续多少个
# print(""+str(s1))
s2.append(s1)
# else:
# print("连续像素未大于6个")
s1 = []
print("总"+str(s2))
move = None
py_length= None
if s2 !=[]:
scan=True
print("最长列表:"+str(max_length(s2)))
s3=max_length(s2)
if len(s3)%2==0:
center = int(len(s3) / 2)
center_z=s3[center-1]
print("中心坐标为:"+str(center_z+0.5),"对应灰度值为:"+str(d[center_z]))
# print("偶数", center)
py_length=round(((center_z+0.5)-64.5)*1)
if py_length<0:
move="左移"
# print(move,py_length)
elif py_length==0:
move = "中间"
# print(move,py_length)
else:
move="右移"
# print(move, str(py_length)+"\n")
else:
center = int((len(s3) + 1) / 2)
center_z=s3[center-1]
print("中心坐标为:"+str(center_z),"对应灰度值为:"+str(d[center_z]))
# print("奇数", center)
py_length=round(((center_z)-64.5)*1)
if py_length<0:
move="左移"
# print(move,py_length)
elif py_length==0:
move = "中间"
# print(move,py_length)
else:
move="右移"
# print(move, str(py_length)+"\n")
else:
# print("未识别到\n")
scan=False
print(scan,move,str(py_length)+"\n")
if __name__ == '__main__':
main()
版权属于:
mango57
作品采用:
《
署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)
》许可协议授权
评论 (0)