重现步骤
复制代码运行
使用电赛c题要求的基础目标物测试
期待结果和实际结果
希望锁定泛洪填充为绿色的区域,但锁定到了a4纸边缘的黑框线内侧
软硬件版本信息
硬件为:立创k230庐山派
固件为:0.4.0
ide:CanMV IDE K230 4.0.7-0
错误日志
无报错,但不符合预期
尝试解决过程
补充材料
代码如下:
import time
import os
import sys
from media.sensor import *
from media.display import *
from media.media import *
from time import ticks_ms
sensor = None
# 自定义函数:计算矩形中心点
def mid_point_rect(x0, y0, wid, heigh):
x_mid = x0 + wid // 2
y_mid = y0 + heigh // 2
return (x_mid, y_mid)
# 阈值设置 - 修复HSV阈值格式
bin_threshold = (0, 75) # 灰度二值化阈值(用于A4纸边缘检测)
green_rgb = (0, 255, 0) # 泛洪填充的绿色RGB值
# 修正HSV阈值格式
green_hsv_min = (35, 77, 40) # HSV最小值
green_hsv_max = (85, 255, 255) # HSV最大值
try:
# 初始化摄像头
sensor = Sensor(width=480, height=320)
sensor.reset()
sensor.set_framesize(width=480, height=320)
sensor.set_pixformat(Sensor.RGB565)
# 初始化显示
Display.init(Display.LT9611, to_ide=True)
MediaManager.init()
sensor.run()
clock = time.clock()
while True:
clock.tick()
os.exitpoint()
# 获取原始RGB565图像
rgb_img = sensor.snapshot(chn=CAM_CHN_ID_0)
# 创建灰度图用于边缘检测
gray_img = rgb_img.to_grayscale(copy=True)
gray_img = gray_img.binary([bin_threshold])
# 查找A4纸矩形
rects = gray_img.find_rects(threshold=3000)
max_area = 0
max_corners = None
max_rect = None
if rects:
for rect in rects:
corners = rect.corners()
# 确保角点坐标是整数
corners = [(int(c[0]), int(c[1])) for c in corners]
width = abs(corners[1][0] - corners[0][0])
height = abs(corners[3][1] - corners[0][1])
area = width * height
if area > max_area and width > 100 and height > 100:
max_area = area
max_corners = corners
max_rect = rect
if max_corners and max_rect:
# 绘制A4纸边框(红色)
for i in range(4):
x1, y1 = max_corners[i]
x2, y2 = max_corners[(i+1)%4]
# 确保坐标是整数
rgb_img.draw_line(int(x1), int(y1), int(x2), int(y2), color=(255, 0, 0), thickness=2)
# 获取A4纸区域信息
x, y, w, h = max_rect.rect()
# 计算A4纸中心区域
inner_x = x + int(w * 0.2)
inner_y = y + int(h * 0.2)
inner_w = int(w * 0.6)
inner_h = int(h * 0.6)
# 泛洪填充(绿色)
seed_point = mid_point_rect(inner_x, inner_y, inner_w, inner_h)
# 确保种子点是整数坐标
seed_x, seed_y = int(seed_point[0]), int(seed_point[1])
rgb_img.flood_fill(seed_x, seed_y, seed_threshold=0.1, color=green_rgb)
# 检索填充的绿色区域 - 使用修正的HSV阈值格式
green_blobs = rgb_img.find_blobs(
[green_hsv_min, green_hsv_max], # 修正:使用两个独立元组
invert=False,
roi=(int(x), int(y), int(w), int(h)), # 确保ROI参数是整数
x_stride=1,
y_stride=1,
pixels_threshold=1000,
area_threshold=1000,
merge=True,
margin=False
)
# 绘制绿色区域边框(绿色)
if green_blobs:
largest_green = max(green_blobs, key=lambda b: b.area())
# 绘制边框时确保所有坐标都是整数
rgb_img.draw_rectangle(
int(largest_green.x()), int(largest_green.y()),
int(largest_green.w()), int(largest_green.h()),
color=(0, 0, 255), thickness=2, fill=False
)
# 显示绿色区域信息
info = f"Green: {largest_green.w()}x{largest_green.h()}"
rgb_img.draw_string_advanced(
int(x) + 10, int(y) - 30, 16,
info, color=(0, 255, 0)
)
print(f"绿色区域尺寸: {largest_green.w()}x{largest_green.h()}")
# 显示帧率
rgb_img.draw_string_advanced(10, 10, 20, f"fps: {int(clock.fps())}", color=(255, 0, 0))
rgb_img.compressed_for_ide()
Display.show_image(rgb_img)
except KeyboardInterrupt as e:
print("用户停止: ", e)
except BaseException as e:
print(f"异常: {e}")
finally:
if isinstance(sensor, Sensor):
sensor.stop()
Display.deinit()
os.exitpoint(os.EXITPOINT_ENABLE_SLEEP)
time.sleep_ms(100)
MediaManager.deinit()
显示结果: