目录
目录
一、概况
在一个 "大数据智能太阳能光伏" 项目中,有这么一个需求:
通过无人机(大疆)对整片光伏区域进行航拍(包括红外图像与可见光图像),再航拍的图片通过4G/5G实时传输到应用程序,应用程序基于计算机视觉技术,自动识别出图片中光伏组件可能存在的故障,并结合其他实时监控与分析数据,从而判断光伏组件是否存在故障并给出报警,下图是该需要的整体业务路程。

这是一个人工智能在计算机视觉领域的典型应用,要实现这些功能涉及到技术非常多如:无人机图像传输,图像识别,光伏组件实时数据监测与分析等,本文从“怎样分离出原始图片中的特定区域(光伏组件串)“这个很小的片段入手, 来阐述计算机视觉分析究竟个什么样子。文中不涉及到任何算法的原理与细节,我们先梳理实现的整体步骤,并先让代码能跑起来可以看到实际的运行结果。
二、整体思路
通过上面的描述,我们的目标非常清晰,就是要从一张带光伏组件的照片中,分离出来一块块的光伏组件串,下图为原始图片与结果输出后的图片。


那应该如何实现这个功能呢?
整体实现流程大概可分为如6个步骤
1 读取原始图片-->2 转化图片的色彩空间-->3 获取二值化图片 -->4 对图片进行形态学处理-> 5 获取图片轮廓- > 6 切割并保存区域图片
下面对每一个步骤进行说明并提供相应的代码
代码实现使用OpenCV,OpenCV是一个开源的计算机视觉库,它轻量,功能强大,实现了图像处理和计算机视觉方面的诸多算法,可以运行在Linux、Windows、Android和Mac OS操作系统上。同时提供了Python、Ruby、MATLAB等语言的接口。
1、读取原始图片
整个功能实现的过程,就是对图片不断变化的过程。所有,首先需要将磁盘上的图片文件读取到内存并转化为opencv能处理的数据,该数据是一个三维数组(300,400,3),每个维度分别表示高、宽、通道数,数组中的值表示每个像素点不同通道的取值0-255之间,同时由于原始文件的尺寸比较大(3000*4000)为了方便查看,将原始文件等比例缩小。下面是函数实现,传入图片路径与图片缩小比例(默认为1不缩小)返回缩小后的原始图片数组。
def read_resize_image(path, size=1.0):
"""
读取原始图片文件并从新设置大小
1) 使用imread读取文件
2)使用resize从新设置文件大小
3) 函数返回的是图片的原始数据,可理解为一个三维数组,每个维度分别表示长、宽、通道数,数组中的值表示图片每个像素点不同通道的取值
"""
original_image = cv2.imread(path)
if size != 1.0:
height, width = original_image.shape[:2]
size = (int(width * size), int(height * size))
original_image = cv2.res