一、什么是OpenMV
OpenMV 是一款非常小巧、功能丰富的计算机视觉平台。支持图像识别、颜色跟踪、线性检测等功能,且使用简单、学习容易。通过硬件加速图像处理和机器学习操作,OpenMV 可以在编写控制器等较为负责的嵌入式系统时大大提高开发效率,降低开发成本,是一款性价比非常高的计算机视觉编程工具。
二、OpenMV的硬件和软件配置
OpenMV最新的版本是OMV3,使用STM32H743VIT6处理器,拥有1MB SRAM,2MB flash,支持2560x1440高清输出,以及22个通用输入输出(GPIO)。OpenMV 还搭载了外部SD卡槽和蓝牙、WiFi等外围设备接口,可以便捷地集成其它设备。OpenMV IDE是OpenMV官方的编程软件,使用起来非常方便,主要功能有代码编辑、图像采集、显示和调试。
三、OpenMV的集成应用
1.物联网应用:OpenMV具有各种控制低功耗无线网络通信,通过TCP / IP,LoRa,SIGFOX和Iridium进行通信,可实现基于物联网的监控任务和人工智能解决方案等。
2.机器人控制:OpenMV可以通过Uart,SPI或IIC接口与机器人微控制器,如Arduino,Raspberry Pi进行通信,实现机器人的自动导航、行为分析。
3.智能安防:OpenMV可以实现智能门禁、人脸识别、目标跟踪等功能,并能够自动抓拍破坏者信息,可应用于实验室门禁、家庭安防等场景中。
4.自动驾驶:OpenMV可以通过编写相关程序,实现车辆的自主导航、环境感知等功能。
四、OpenMV硬件功能的使用示例
下面介绍一些OpenMV硬件功能的使用示例。
1.图像采集
# Example for acquiring images only on movement. import sensor, image, time sensor.reset() # Reset and initialize the sensor. sensor.set_pixformat(sensor.RGB565) # Set pixel format to RGB565 (or GRAYSCALE) sensor.set_framesize(sensor.QQVGA) # Set frame size to QQVGA (80x60) sensor.skip_frames(time = 2000) # Wait for settings take effect. # Reset the clock. clock = time.clock() # Save the previous frame. previous = None while(True): # Update clock. clock.tick() # Capture new image. image = sensor.snapshot() # Check if motion has occurred. if previous is not None and image.difference(previous).count() > 10: # Save image. image.save("/detect.bmp") # Store the previous image. previous = image.copy() # Print the elapsed time. print(clock.fps())
2.图像处理
# 在图像上查找一个由二进制形式的颜色掩码表示的颜色,返回矩形和两个掉帧信息(x和y方向上) import sensor, image, time # 配合 OpenMV 学习手册使用 # 有关颜色跟踪,请参阅以下文档: # http://docs.openmv.io/library/omv.image.html#image.image_binary # http: // docs.openmv.io/library/omv.image.html#image.image_mono_search # 颜色跟踪颜色的二进制值。在此示例中,它是从色轮工具中获得的,某些部分的值略有不同。 MIN_DELTA = 1 MAX_DELTA = 10 bar_threshold_deltas = (MAX_DELTA - MIN_DELTA + 1) bar_thresholds = [(MIN_DELTA + (i * bar_threshold_deltas // 8)) for i in range(bar_threshold_deltas)] print("bar thresholds: %s" % (bar_thresholds)) threshold_index = 0 sensor.reset() sensor.set_pixformat(sensor.RGB565) sensor.set_framesize(sensor.QVGA) sensor.set_auto_gain(False, value=100) sensor.set_auto_exposure(False, exposure_us=5000) sensor.set_brightness(1) clock = time.clock() search_rect = [150, 80, 100, 100] # [x, y, w, h] while(True): clock.tick() img = sensor.snapshot() img.draw_rectangle(search_rect) img = img.crop(150, 80, 100, 100) img = img.mean_pooled(2, 2) # 方法 1: 使用二进制图像查找单通道颜色跟踪 for threshold in bar_thresholds: result = img.binary([threshold]*3) # 用于只检测水平条的中点。 r = result.find_blobs([1, 11, 100, 40]) #寻找二进制中的连通域,返回一个Blob对象列表 if r: # 对于blob对象列表,x()、y()是blob中心,cx()、cy()是blob重心,w()、h()是blob的宽和高 img.draw_rectangle(search_rect) img.draw_rectangle(r[0].rect(),color=127) # Coords can be accessed through virtually any blob object attribute such as # rect(), cx(), cy(), x(), y(), etc. print(threshold, r[0].cx()) break # 方法 2: 使用二进制图像查找单通道颜色跟踪(一行代码) # 注意:如果使用这个,您必须根据情况调整一些参数,例如第8和第10行的参数。 # # img.binary([(45, 75, -10, 14, -25, 27)], invert=False) # # 二进制函数可以同时采用 1 个、3 个或 6 个阈值元组(并带有相应的通道计数)。 # GT的阈值将部分图像视为颜色,以后者为基础绘制一个二进制图像(一种选择),然后查找连续的球体。 # 连续的球体被称为“大洞(大块)”,并将通过“find_blobs()”来查找,作为一组Blob对象返回。 #“大洞”的一些阈值调整可能需要进行匹配,以便将大洞与轨迹完全重叠。 # 有关阈值方法,请查看颜色跟踪和二进制函数的文档,并在IDE中搜索有关此方面的文档。 # # 但是,在这个例子中,我们将使用普通色轮阈值(通过下面的“bar_thresholds”数组)来检测条形码上的蓝条,例如:“[(0, 50, -30, -15, 0, 20)]”。 print(clock.fps())
3.机器学习
# 该文件的目的是演示如何使用神经网络在 OpenMV Cam 上进行识别。 # # 您应该下载图像以进行训练。此示例使用一个图像集,其中包含洛杉矶的Keras代码中提供的250张图像, # 位于“下载”文件夹中。每个文件名都是“数字_编号.jpg”,例如“3_23.jpg”对于数字“3”,它是第23个图像。 # # 当然,您必须首先运行“mnist_cnn.py”来训练模型。在训练之后,请将生成的“权重.m5”文件复制到OpenMV的存储设备上并重新启动OpenMV Cam。 import sensor, image, time, os, nn sensor.reset() sensor.set_pixformat(sensor.RGB565) sensor.set_framesize(sensor.QVGA) sensor.skip_frames(time=1000) clock = time.clock() labels = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'] # Load the built-in "digits" classifier net = nn.load('/digits.network') while(True): clock.tick() img = sensor.snapshot().lens_corr(1.8) #img.draw_rectangle(80, 0, 80, 80) out = net.forward(img.binary([((200, 255), )])).index(max(net.out())) out = labels[out] print(clock.fps(), out)
五、总结
在本文中我们详细地阐述了OpenMV这一款基于OMV3的图像识别辅助计算机视觉编程神器。我们解释了其硬件和软件配置,介绍了其集成应用,最后展示了一些硬件功能的代码示例。这款神器是学习和使用计算机视觉编程的良好选择,同时还可以应用于生产实践中,如物联网、机器人控制、智能安防和自动驾驶等领域。OpenMV 的出现将进一步推进计算机视觉编程的普及和发展。