RUN__IT # 04 找出不在列表中的最小整数

编写一个Python函数,目标是找到不在给定列表中,且无法通过列表内元素相加得到的最小整数。例如,对于列表[1, 2, 5, 7],这个数是4。邀请读者分享简洁的解决方案。" 123031367,6839372,深入理解Spring RabbitMQ消费者工作原理,"['spring框架', 'rabbitmq消费者', '消息队列', '事件驱动', '源码解析']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写一个函数,找出不在列表中,且不能用列表中元素相加得到的最小整数
如:列表[1,2,5,7],不在列表中且不能够用列表元素相加得到的数是4


def min_num(list):
    max_num = max(list) * 2 + 1
    for i in range(1,max_num):
        flag = False
        if i in list:
            continue
        else:
            for j in range(len(list)):
                for k in range(j+1,len(list)):
                    if i == list[j] + list[k]:
                        flag = True
                        break
                if flag == True:
                    break
            if flag == False:
                print(i)
                break


if __name__ == '__main__':                
    list = [1,2,5,7]
    min_num(list)

欢迎留下简单的方法!

import time, os, gc, sys from media.sensor import * from media.display import * from media.media import * from machine import UART import time from machine import PWM, FPIOA #servo def find_majority_element(nums): """ 查找数组中出现次数超过一半的元素(众数) 参数: nums (list): 整数数组 返回: int or None: 众数(如果存在),否则返回None """ candidate = None # 候选众数 count = 0 # 计数器 # 第一轮遍历:找出候选众数 for num in nums: if count == 0: candidate = num # 当计数器为0时,更新候选众数 count += (1 if num == candidate else -1) # 相同则加1,不同则减1 # 验证候选众数是否确实超过半数 count = 0 for num in nums: if num == candidate: count += 1 # 如果出现次数超过数组长度的一半,则返回候选众数 return candidate if count > len(nums) // 2 else None #pid #class PID: # def __init__(self, kp, ki, input_value, target=320): # self.e = 0 # self.e_last = 0 # self.kp = kp # self.ki = ki # self.target = target # self.input_value = input_value # def cal(self, value): # self.e = self.target - value # delta = self.kp * (self.e-self.e_last) + self.ki * self.e # self.e_last = self.e # self.input_value = self.input_value + delta # return self.input_value class PID: def __init__(self, kp, ki, kd, maxI, maxOut): #静态参数 self.kp = kp self.ki = ki self.kd = kd #动态参数 self.change_p = 0 self.change_i = 0 self.change_d = 0 self.max_change_i = maxI #积分限幅 self.maxOutput = maxOut #输出限幅 self.error_sum = 0 #当前误差 self.last_error = 0 #之前误差 def change_zero(self):#PID变化累计的参数清零 self.change_p = 0 self.change_i = 0 self.change_d = 0 def pid_calc(self, reference, feedback):#reference=目标位置 feedback=当前位置 self.last_error = self.error_sum self.error_sum = reference - feedback #获取新的误差 #计算微分 dout = (self.error_sum - self.last_error) * self.kd #计算比例 pout = self.error_sum * self.kp #计算积分 self.change_i += self.error_sum * self.ki #积分限幅 if self.change_i > self.max_change_i : self.change_i = self.max_change_i elif self.change_i < -self.max_change_i: self.change_i = -self.max_change_i #计算输出 self.output = pout + dout + self.change_i #输出限幅 if self.output > self.maxOutput: self.output = self.maxOutput elif self.output < -self.maxOutput: self.output = -self.maxOutput return self.output #c_x=160 #c_y=120 #pid_x = PID(-0.002, -0.0003, 1.5/20*100, c_x) # # 垂直控制PID: 比例系数-0.002, 积分系数-0.0003, 初始控制值1.5ms #pid_y = PID(0.002, 0.0003, 1.5/20*100, c_y) pid_x=PID(-0.002, -0.0003,-0.0001,12.5,12.5) pid_y=PID(-0.002, -0.0003,-0.0001,12.5,12.5) #image DETECT_WIDTH = ALIGN_UP(320, 16) DETECT_HEIGHT = 240 sensor = None color_threshold =(71, 100, -15, 15, -34, -3) #color_threshold =((97, 100, -14, -4, -45, -2)) def camera_init(): global sensor # construct a Sensor object with default configure sensor = Sensor(width=DETECT_WIDTH,height=DETECT_HEIGHT) # sensor reset sensor.reset() # set hmirror # sensor.set_hmirror(False) # sensor vflip # sensor.set_vflip(False) # set chn0 output size sensor.set_framesize(width=DETECT_WIDTH,height=DETECT_HEIGHT) # set chn0 output format sensor.set_pixformat(Sensor.RGB565) # use IDE as display output Display.init(Display.VIRT, width= DETECT_WIDTH, height = DETECT_HEIGHT,fps=100,to_ide = True) # init media manager MediaManager.init() # sensor start run sensor.run() #######################image_function def camera_deinit(): global sensor # sensor stop run sensor.stop() # deinit display Display.deinit() # sleep os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) time.sleep_ms(100) # release media buffer MediaManager.deinit() def find_min_b(blobs): min_size=1000000 for blob in blobs: if min_size > blob[2]*blob[3] : min_blob=blob min_size = blob[2]*blob[3] return min_blob def find_max_c(circles): max_size=0 for circle in circles: if circle[3] > max_size: max_circle=circle max_size = circle[3] return max_circle def find_max_r(rects): max_size=0 for rect in rects: if rect[2]*rect[3] > max_size: max_rect=rect max_size = rect[2]*rect[3] return max_rect #############################servo_function #def pwm_init(): pwm_io1 = FPIOA() pwm_io1.set_function(47, FPIOA.PWM3) pwm_shang = PWM(3, 50, 50, enable=True) # 配置PWM3,默认频率50Hz,占空比50%,xia # 配置排针引脚号32,芯片引脚号为46的排针复用为PWM通道2输出 pwm_io2 = FPIOA() pwm_io2.set_function(46, FPIOA.PWM2) pwm_xia = PWM(2, 50, 50, enable=True) # 配置PWM2,默认频率50Hz,占空比50%,shang pwm_xia.duty(7.5) #xia舵机旋转到中间 pwm_shang.duty(7.5) #shang舵机旋转到中间 def capture_picture(): os.exitpoint() global sensor img = sensor.snapshot() # `threshold` below should be set to a high enough value to filter out noise # rectangles detected in the image which have low edge magnitudes. Rectangles # have larger edge magnitudes the larger and more contrasty they are... for c in img.find_circles(threshold = 10000): #img.draw_circle([v for v in r.circle()], color = (255, 0, 0)) img.draw_circle(c.x(), c.y(), c.r(), color=(255,0,0)) #for p in r.corners(): img.draw_circle(p[0], p[1], 5, color = (0, 255, 0)) img.draw_cross(c.x(), c.y(),color = (255, 0, 0)) print(c) #for r in img.find_rects(threshold = 10000): # img.draw_rectangle([v for v in r.rect()], color = (255, 255, 255)) # #for p in r.corners(): img.draw_circle(p[0], p[1], 5, color = (0, 255, 0)) # print(r) #img_rect = img.to_grayscale(copy=True) #img_rect = img_rect.binary([(23, 62)]) #rects=img_rect.find_rects(threshold =2000) blobs=None global flag #global max_blob global max_rect_ #max_blob=None #max_rect_=None #if rects: # max_rect_= find_max_r(rects) # img.draw_rectangle([v for v in max_rect_.rect()], color = (255, 255, 255)) # blobs = img.find_blobs([color_threshold],roi=max_rect_.rect(),merge=True,pixels_threshold=2,area_threshold=2) for i in range(6): img_rect = img.to_grayscale(copy=True) img_rect = img_rect.binary([(23, 62)]) rects = img_rect.find_rects(threshold=10000) # 最小面积阈值10000像 # 绘制找到的矩形 if not rects == None: for rect in rects: corner = rect.corners() # 获取矩形四个角点 # 绘制矩形边界 img.draw_line(corner[0][0], corner[0][1], corner[1][0], corner[1][1], color=(0, 255, 0), thickness=1) img.draw_line(corner[2][0], corner[2][1], corner[1][0], corner[1][1], color=(0, 255, 0), thickness=1) img.draw_line(corner[2][0], corner[2][1], corner[3][0], corner[3][1], color=(0, 255, 0), thickness=1) img.draw_line(corner[0][0], corner[0][1], corner[3][0], corner[3][1], color=(0, 255, 0), thickness=1) # 计算矩形中心点 c_x_target = sum([corner[k][0] for k in range(4)])/4 c_y_target = sum([corner[k][1] for k in range(4)])/4 if len(rects) == 2: print("center_point: {}".format([round(c_x), round(c_y)])) flag = 1 # 进入追踪模式 #pid_x.target = c_x #pid_y.target = c_y max_rect_= find_max_r(rects) t=0 t=t+1 blobs = img.find_blobs([color_threshold],roi=max_rect_.rect(),merge=True,pixels_threshold=2,area_threshold=2) #else flag=0 if blobs: max_blob = find_min_b(blobs)#调用函数,返回最大色块 #img.draw_circle(80,60,5,color=200) img.draw_circle(max_blob.cx(),max_blob.cy(),10,color=200) img.draw_rectangle((max_blob.x(),max_blob.y(),max_blob.w(),max_blob.h()),color=(255,0,0))#用红色框出最大色块 img.draw_string(0,0, "(x,y) =") img.draw_string(max_blob.x()+40,max_blob.y(), str(max_blob.cx())) img.draw_string(max_blob.x()+60,max_blob.y(), str(max_blob.cy()))#在框图显示色块的中心坐标 img.draw_string(40,0, str(max_blob.cx())) img.draw_string(60,0, str(max_blob.cy()))#在框图左上角显示色块的中心坐标 c_x = max_blob.x() + max_blob.w() / 2 c_y = max_blob.y() + max_blob.h() / 2 new_duty = pid_x.calc(c_x_target,c_x) # 计算新占空比 # 限制占空比在0.5ms-2.5ms范围内(舵机安全范围) new_duty = max(min(new_duty, 2.5/20*100), 0.5/20*100) # 更新水平舵机位置 #pwm_xia.enable(0) # 临时禁用PWM pwm_xia.duty(round(new_duty, 2)) # 设置新占空比 #pwm_xia.enable(1) # 重新启用PWM # 垂直方向PID控制 new_duty = pid_y.calc(c_y_target,c_y) # 计算新占空比 # 限制占空比在安全范围内 new_duty = max(min(new_duty, 2.5/20*100), 0.5/20*100) # 更新垂直舵机位置 #pwm_shang.enable(0) # 临时禁用PWM pwm_shang.duty(round(new_duty, 2)) # 设置新占空比 print(round(new_duty, 1)) # 调试输出 #pwm_shang.enable(1) # 重新启用PWM # draw result to screen Display.show_image(img) img = None gc.collect() def main(): os.exitpoint(os.EXITPOINT_ENABLE) camera_is_init = False fps = time.clock() #pwm_init() try: print("camera init") camera_init() camera_is_init = True print("camera capture") while True: fps.tick() try: capture_picture() except KeyboardInterrupt as e: print("user stop: ", e) break except BaseException as e: print(f"Exception {e}") break print(fps.fps()) except Exception as e: print(f"Exception {e}") finally: if camera_is_init: print("camera deinit") camera_deinit() if __name__ == "__main__": main()这段代码报错Exception local variable referenced before assignment
08-01
import time, os, math, gc from media.sensor import * from media.display import * from media.media import * from machine import FPIOA, UART, TOUCH, Pin # 图像参数 - 使用320x240标准分辨率 IMAGE_WIDTH = 320 IMAGE_HEIGHT = 240 SENSOR_ID = 2 sensor = None THRESHOLD = (69, 252) # 初始灰度阈值 # 显示模式设置 DISPLAY_MODE = "LCD" # 可选 "VIRT", "LCD", "HDMI" # 根据显示模式设置分辨率 if DISPLAY_MODE == "VIRT": DISPLAY_WIDTH, DISPLAY_HEIGHT = 320, 240 elif DISPLAY_MODE == "LCD": DISPLAY_WIDTH, DISPLAY_HEIGHT = 320, 240 elif DISPLAY_MODE == "HDMI": DISPLAY_WIDTH, DISPLAY_HEIGHT = 320, 240 else: raise ValueError("无效的显示模式") # 角点检测阈值 CORNERS_THRESHOLD = 5000 # 透视变换目标尺寸 PERSPECTIVE_SIZE = 200 # 变换后的矩形大小 # 矩形过滤参数 MIN_AREA_RATIO = 0.01 # 最小面积占图像比例 MAX_AREA_RATIO = 0.8 # 最大面积占图像比例 ASPECT_RATIO_MIN = 0.5 # 最小宽高比 ASPECT_RATIO_MAX = 2.0 # 最大宽高比 COS_THRESHOLD = 0.3 # 角度余弦阈值(绝对值) # 初始化UART2 fpioa = FPIOA() fpioa.set_function(11, FPIOA.UART2_TXD) # UART2发送 fpioa.set_function(12, FPIOA.UART2_RXD) # UART2接收 uart2 = UART(UART.UART2, 115200, 8, 0, 1, timeout=1000) # 用于坐标通信 # 初始化按键 fpioa.set_function(53, FPIOA.GPIO53) button = Pin(53, Pin.IN, Pin.PULL_DOWN) # 使用下拉电阻 debounce_delay = 20 # 毫秒 last_press_time = 0 # 上次按键按下的时间,单位为毫秒 button_last_state = 0 # 上次按键状态 timeTouch = 0 tp = TOUCH(0) # 按钮文本 (简化版本) textL = ["GL-", "GH-", "Step", "Back"] textR = ["GL+", "GH+", "Invert", " "] isInvertFlag = False # 是否反转 # 虚拟按钮范围 (320x240分辨率下的布局) buttonsL = [ (10, 10, 70, 30), # GL- (10, 50, 70, 30), # GH- (10, 90, 70, 30), # Step (10, 130, 70, 30) # Back ] buttonsR = [ (240, 10, 70, 30), # GL+ (240, 50, 70, 30), # GH+ (240, 90, 70, 30), # Invert (240, 130, 70, 30) # 空按钮 ] # 灰度范围初始化 GL, GH = 0, 255 # 灰度范围0~255 step = 1 # 脱机阈值步进 Gray_thresholds = [(int(GL), int(GH))] # 灰度阈值列表 # 状态标志 flag = False # 页面标志,True为阈值设置 # 脱机调整阈值界面设计 (优化版本) def changeScreen(img): # 直接处理灰度图像,避免闪白 GrayImg = img.to_grayscale().binary(Gray_thresholds) if isInvertFlag: GrayImg = GrayImg.invert() # 创建屏幕图像 screen = GrayImg.copy() # 绘制按钮 for i in range(4): # 左侧按钮 screen.draw_rectangle(buttonsL[i][0], buttonsL[i][1], buttonsL[i][2], buttonsL[i][3], (200, 201, 202), thickness=1, fill=True) screen.draw_string(buttonsL[i][0] + 5, buttonsL[i][1] + 10, textL[i], color=(0, 0, 0), scale=1) # 右侧按钮 screen.draw_rectangle(buttonsR[i][0], buttonsR[i][1], buttonsR[i][2], buttonsR[i][3], (200, 201, 202), thickness=1, fill=True) screen.draw_string(buttonsR[i][0] + 5, buttonsR[i][1] + 10, textR[i], color=(0, 0, 0), scale=1) # 显示阈值和步进信息 screen.draw_string(100, 180, f"GL: {GL} GH: {GH}", color=(255, 255, 255) if isInvertFlag else (0, 0, 0), scale=1) screen.draw_string(100, 200, f"Step: {step}", color=(255, 255, 255) if isInvertFlag else (0, 0, 0), scale=1) # 显示处理后的图像 Display.show_image(screen, 0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT) # 触摸屏按钮事件动作 def buttonAction(direction, index): global GL, GH, flag, step, isInvertFlag, textR, Gray_thresholds # 阈值列表重置 Gray_thresholds = [(int(GL), int(GH))] # 按钮处理 if direction == &#39;left&#39;: if index == 0: # GL- GL = max(GL - step, 0) elif index == 1: # GH- GH = max(GH - step, 0) elif index == 2: # Step step = step + 1 if step < 5 else 1 elif index == 3: # Back flag = False elif direction == &#39;right&#39;: if index == 0: # GL+ GL = min(GL + step, 255) elif index == 1: # GH+ GH = min(GH + step, 255) elif index == 2: # Invert isInvertFlag = not isInvertFlag textR[2] = &#39;Normal&#39; if isInvertFlag else &#39;Invert&#39; # 触摸屏事件 def touchAction(): global timeTouch touchP = tp.read(2) if touchP: timeTouch += 1 if timeTouch >= 3: p = touchP timeTouch = 0 if p: x, y = p[0].x, p[0].y # 检查左侧按钮 for i, rect in enumerate(buttonsL): if (rect[0] <= x <= rect[0] + rect[2] and rect[1] <= y <= rect[1] + rect[3]): buttonAction(&#39;left&#39;, i) return # 检查右侧按钮 for i, rect in enumerate(buttonsR): if (rect[0] <= x <= rect[0] + rect[2] and rect[1] <= y <= rect[1] + rect[3]): buttonAction(&#39;right&#39;, i) return # 发送坐标函数 def send_coordinates(center): """通过串口发送坐标数据""" if center: cx, cy = center # 协议格式: $X[坐标x]Y[坐标y]\n data_str = f"$X{cx:04d}Y{cy:04d}\n" uart2.write(data_str.encode()) else: uart2.write(b"$X9999Y9999\n") # 无效坐标标志 # 角点排序函数 def sort_corners(corners): """对矩形角点进行排序(左上、右上、右下、左下)""" if len(corners) != 4: return corners # 计算中心点 center_x = sum(c[0] for c in corners) / 4 center_y = sum(c[1] for c in corners) / 4 # 分类角点 def distance_to_center(corner): return (corner[0] - center_x)**2 + (corner[1] - center_y)**2 top_left = min(corners, key=lambda c: distance_to_center(c) if c[0] < center_x and c[1] < center_y else float(&#39;inf&#39;)) top_right = min(corners, key=lambda c: distance_to_center(c) if c[0] > center_x and c[1] < center_y else float(&#39;inf&#39;)) bottom_right = min(corners, key=lambda c: distance_to_center(c) if c[0] > center_x and c[1] > center_y else float(&#39;inf&#39;)) bottom_left = min(corners, key=lambda c: distance_to_center(c) if c[0] < center_x and c[1] > center_y else float(&#39;inf&#39;)) return [top_left, top_right, bottom_right, bottom_left] # 矩形有效性检查 def is_valid_rectangle(corners, cos_threshold=COS_THRESHOLD): """ 检查是否为有效矩形(内角接近90度) corners: 排序后的四个角点 [左上, 右上, 右下, 左下] cos_threshold: 余弦值阈值(绝对值应小于此值) 返回: True/False """ if len(corners) != 4: return False # 计算四个内角的余弦值 for i in range(4): # 获取三个连续点: A-B-C A = corners[i] B = corners[(i + 1) % 4] C = corners[(i + 2) % 4] # 计算向量BA和BC BA = (A[0] - B[0], A[1] - B[1]) BC = (C[0] - B[0], C[1] - B[1]) # 计算点积和模长 dot_product = BA[0] * BC[0] + BA[1] * BC[1] mod_BA = math.sqrt(BA[0]**2 + BA[1]**2) mod_BC = math.sqrt(BC[0]**2 + BC[1]**2) # 避免除零错误 if mod_BA * mod_BC < 1e-5: return False # 计算余弦值 cos_value = dot_product / (mod_BA * mod_BC) # 检查是否接近90度 (|cos| < threshold) if abs(cos_value) > cos_threshold: return False return True # 矩形属性计算 def calculate_rect_properties(corners): """计算矩形的面积和宽高比""" if len(corners) != 4: return 0, 0 # 计算边长 top = math.sqrt((corners[1][0] - corners[0][0])**2 + (corners[1][1] - corners[0][1])**2) right = math.sqrt((corners[2][0] - corners[1][0])**2 + (corners[2][1] - corners[1][1])**2) bottom = math.sqrt((corners[3][0] - corners[2][0])**2 + (corners[3][1] - corners[2][1])**2) left = math.sqrt((corners[0][0] - corners[3][0])**2 + (corners[0][1] - corners[3][1])**2) # 计算平均宽度和高度 width = (top + bottom) / 2 height = (left + right) / 2 # 计算面积和宽高比 area = width * height aspect_ratio = max(width, height) / min(width, height) if min(width, height) > 0 else 0 return area, aspect_ratio # 绘制角点信息 def draw_corner_info(img, corners, center, area, aspect_ratio): """在图像上绘制角点和中心信息""" if len(corners) != 4: return # 定义角点颜色和标签 corner_colors = [(0, 255, 0), (0, 255, 0), (0, 255, 0), (0, 255, 0)] labels = ["TL", "TR", "BR", "BL"] # 绘制角点 for i, (x, y) in enumerate(corners): color = corner_colors[i] img.draw_circle(int(x), int(y), 5, color=color, thickness=2) img.draw_string(int(x) + 5, int(y) - 5, labels[i], color=color, scale=1) # 绘制矩形边框 for i in range(4): x1, y1 = corners[i] x2, y2 = corners[(i + 1) % 4] img.draw_line(int(x1), int(y1), int(x2), int(y2), color=(0, 255, 255), thickness=1) # 绘制对角线 img.draw_line(int(corners[0][0]), int(corners[0][1]), int(corners[2][0]), int(corners[2][1]), color=(255, 0, 0), thickness=1) img.draw_line(int(corners[1][0]), int(corners[1][1]), int(corners[3][0]), int(corners[3][1]), color=(255, 0, 0), thickness=1) # 绘制中心点 if center: cx, cy = center img.draw_cross(int(cx), int(cy), size=10, color=(255, 0, 255), thickness=2) img.draw_circle(int(cx), int(cy), 3, color=(255, 0, 255), thickness=-1) img.draw_string(int(cx) + 5, int(cy) - 5, "Center", color=(255, 0, 255), scale=1) # 显示矩形属性 img.draw_string(10, 30, f"Area: {area:.1f} px", color=(0, 255, 0), scale=1) img.draw_string(10, 50, f"Aspect: {aspect_ratio:.2f}", color=(0, 255, 0), scale=1) # 图像处理函数 def process_frame(img): """处理图像帧,检测矩形角点和中心(带形状验证)""" img_gray = img.to_grayscale(copy=False) img_bin = img_gray.binary([(GL, GH)]) rects = img_bin.find_rects(threshold=CORNERS_THRESHOLD) # 计算图像总面积 total_image_area = img.width() * img.height() min_area = MIN_AREA_RATIO * total_image_area max_area = MAX_AREA_RATIO * total_image_area # 找出所有可能的矩形 valid_rects = [] for rect in rects: corners = rect.corners() if len(corners) == 4: sorted_corners = sort_corners(corners) # 计算矩形属性 area, aspect_ratio = calculate_rect_properties(sorted_corners) # 检查角度、面积和宽高比 angle_valid = is_valid_rectangle(sorted_corners) area_valid = min_area <= area <= max_area aspect_valid = ASPECT_RATIO_MIN <= aspect_ratio <= ASPECT_RATIO_MAX if angle_valid and area_valid and aspect_valid: valid_rects.append((area, aspect_ratio, sorted_corners)) # 选择面积最大的有效矩形 corners = [] center = None area = 0 aspect_ratio = 0 if valid_rects: valid_rects.sort(key=lambda x: x[0], reverse=True) area, aspect_ratio, corners = valid_rects[0] # 计算中心点 (简化方法) center_x = sum(c[0] for c in corners) / len(corners) center_y = sum(c[1] for c in corners) / len(corners) center = (int(center_x), int(center_y)) # 绘制结果 if center: draw_corner_info(img, corners, center, area, aspect_ratio) else: # 显示未检测到矩形的信息 img.draw_string(img.width()//2 - 50, img.height()//2, "No valid rectangle", color=(255, 0, 0), scale=1) # 资源清理 del img_gray, img_bin gc.collect() return corners, center try: print("初始化摄像头...") # 初始化摄像头 sensor = Sensor(id=SENSOR_ID) sensor.reset() # 设置与显示匹配的分辨率 sensor.set_framesize(width=DISPLAY_WIDTH, height=DISPLAY_HEIGHT) sensor.set_pixformat(Sensor.RGB565, chn=CAM_CHN_ID_0) sensor.set_hmirror(1) sensor.set_vflip(1) print("初始化显示器...") # 初始化显示器 - 修复Display.init调用 if DISPLAY_MODE == "VIRT": Display.init(Display.VIRT, width=DISPLAY_WIDTH, height=DISPLAY_HEIGHT, fps=60) elif DISPLAY_MODE == "LCD": Display.init(Display.ST7701, width=800, height=480) elif DISPLAY_MODE == "HDMI": Display.init(Display.LT9611, width=DISPLAY_WIDTH, height=DISPLAY_HEIGHT) print("初始化媒体管理器...") # 初始化媒体管理器 MediaManager.init() sensor.run() clock = time.clock() print("开始主循环...") while True: os.exitpoint() clock.tick() # 捕获图像 img = sensor.snapshot(chn=CAM_CHN_ID_0) # 处理按键事件 button_state = button.value() # 获取当前按键状态 current_time = time.ticks_ms() # 获取当前时间(单位:毫秒) # 检测按键从未按下(0)到按下(1)的变化(上升沿) if button_state == 1 and button_last_state == 0: # 检查按键是否在消抖时间外 if current_time - last_press_time > debounce_delay: if button.value() == 1: flag = not flag print("进入阈值设置模式" if flag else "退出阈值设置模式") last_press_time = current_time # 更新上次按键状态 button_last_state = button_state # 仅在阈值设置界面显示阈值调整UI if flag: changeScreen(img) touchAction() else: # 正常模式下显示原始图像和处理结果 # 处理图像并检测角点 corners, center = process_frame(img) # 发送坐标 send_coordinates(center) # 显示FPS img.draw_string(10, 10, f"FPS: {clock.fps():.1f}", color=(255, 0, 0), scale=1) # 显示图像(全屏) img.compressed_for_ide() Display.show_image(img, 0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT) # 控制处理频率 time.sleep_ms(20) except KeyboardInterrupt: print("程序被用户中断") except Exception as e: print(f"发生错误: {e}") import sys sys.print_exception(e) finally: print("清理资源...") # 清理资源 if sensor: sensor.stop() Display.deinit() MediaManager.deinit() print("程序退出") 将上述程序的图像参数修改成合理的最小
最新发布
08-04
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值