基于颜色形状的识别并计数
-
我想通过颜色先分割,然后再通过形状识别去判断圆形个数。它为啥数字会不停跳变啊。然后我就想while循环只在形状识别处循环,而不是整个获取图片,处理图片循环。也就是对同一张图片不停识别,为啥就没有结果?
img = sensor.snapshot().lens_corr(1.8) # 从感光芯片获得一张图像 img.histeq(adaptive=True, clip_limit=3) # 中值滤波 img.median(1, percentile=0.5) # 图像锐化 img.laplacian(1, sharpen=True) img.binary([green_threshold]) img.to_grayscale(copy=False, rgb_channel=-1) img.morph(kernel_size, kernel) img.dilate(1,threshold = 4) img.erode(1, threshold = 1) #圆形识别 while(True): cs = img.find_circles(x_stride=2, y_stride=2,threshold = 4600, x_margin = 10, y_margin = 10, r_margin = 10,r_min = 5, r_max = 50, r_step = 2) if cs: num_y = 0 for c in cs: img.draw_circle(c.x(), c.y(), c.r(), color = (255, 0, 0)) num_y += 1 #num_stry = '%d' %num_y #uart.write('num_y =' +num_stry+'\r\n') print(num_y) time.sleep_ms(100)
-
你的代码不能运行,请上传完整的代码。
-
import sensor, image, time from pyb import UART # 色块监测 # 颜色追踪一定要控制环境的光,保持光线是稳定的。 green_threshold = ((41, 0, -75, -18, -8, 52)) #设置绿色的阈值,括号里面的数值分别是L A B 的最大值和最小值(minL, maxL, minA, # maxA, minB, maxB),LAB的值在图像左侧三个坐标图中选取。如果是灰度图,则只需 #设置(min, max)两个数字即可。 #设置核函数滤波,核内每个数值值域为[-128,127],核需为列表或元组 kernel_size = 1 # kernel width = (size*2)+1, kernel height = (size*2)+1 kernel = [-1, -1, -1,\ -1, +8, -1,\ -1, -1, -1] # 这个一个高通滤波器。见这里有更多的kernel sensor.reset() # 初始化摄像头 sensor.set_pixformat(sensor.RGB565) # 格式为 RGB565. sensor.set_framesize(sensor.QQVGA) # 使用 QQVGA 速度快一些 sensor.skip_frames(time = 2000) # 跳过2000s,使新设置生效,并自动调节白平衡 sensor.set_auto_gain(False) # 关闭自动自动增益。默认开启的,在颜色识别中,一定要关闭白平衡。 sensor.set_auto_whitebal(False) #关闭白平衡。白平衡是默认开启的,在颜色识别中,一定要关闭白平衡。 sensor.set_gainceiling(8) clock = time.clock() # 追踪帧率 # 在OV7725 sensor上, 边缘检测可以通过设置sharpness/edge寄存器来增强。 # 注意:这将在以后作为一个函数实现 if (sensor.get_id() == sensor.OV7725): sensor.__write_reg(0xAC, 0xDF) sensor.__write_reg(0x8F, 0xFF) uart = UART(3, 19200) #实例化 波特率19200的串口3 clock.tick() # Track elapsed milliseconds between snapshots(). img = sensor.snapshot().lens_corr(1.8) # 从感光芯片获得一张图像 # clip_limit <0为您提供正常的自适应直方图均衡,这可能会导致大量的对比噪音... # clip_limit=1 什么都不做。为获得最佳效果,请略高于1,如下所示。 # 越高,越接近标准自适应直方图均衡,并产生巨大的对比度波动。 img.histeq(adaptive=True, clip_limit=3) # 中值滤波 # Size是内核的大小。取1 (3x3 内核)、2 (5x5 内核)或更高值。 # percentile控制内核中所使用值的百分位数。默认情况下,每个像素都使用相邻的第五 # 十个百分位数(中心)替换。使用最小滤波时,您可将此值设置为0,使用下四分位数滤 # 波时设置为0.25,使用上四分位数滤波时设置为0.75,使用最大滤波时设置为1。 img.median(1, percentile=0.5) # 图像锐化 img.laplacian(1, sharpen=True) img.binary([green_threshold]) img.to_grayscale(copy=False, rgb_channel=-1) ##图像二值化 #img.find_edges(image.EDGE_CANNY, threshold = (50, 80)) img.morph(kernel_size, kernel) img.dilate(1,threshold = 4) img.erode(1, threshold = 1) #img.close(16) #闭运算:连接断开的轮廓线,平滑其边界 #矩形识别 #rs = img.find_rects(threshold = 30000) #if rs: #num_r = 0 #for r in rs: #img.draw_rectangle(r.rect(), color = (255,0,0)) #num_r +=1 ##num_strr = '%d' %num_r ##uart.write('num_r =' +num_strr+'\r\n') #print(r.corners()) #圆形识别 while(True): cs = img.find_circles(x_stride=2, y_stride=2,threshold = 4600, x_margin = 10, y_margin = 10, r_margin = 10,r_min = 5, r_max = 50, r_step = 2) # if cs: num_y = 0 for c in cs: img.draw_circle(c.x(), c.y(), c.r(), color = (255, 0, 0)) num_y += 1 #num_stry = '%d' %num_y #uart.write('num_y =' +num_stry+'\r\n') print(num_y) time.sleep_ms(100)
-
@kidswong999 我就是想相机不一直获取图片,就对同一张图片进行处理计数,然后又从原图像,图像处理,计数这个过程。现在是不是 每次循环都是 从图像处理过后的图片继续处理,而不是原图片反复处理。
-
你不应该在for循环里draw_circle。
因为draw函数是直接更改图片的像素值,所以每次循环都不是同一张图片。
-
那我如果不用draw,直接识别就不影响了吧?
-
@zik3 对,你试试就知道了,把draw都注释掉。