Python CCD读取及计算偏移

mango57
2022-07-27 / 0 评论 / 685 阅读 / 正在检测是否收录...
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()
0

评论 (0)

取消