在光伏行业胶膜公司工作时,工作中的数据整理的工作单调无趣,作为一个崇尚自动化办公的制造业懒人,怎能忍受?!
本文中讲到的光伏组件EL测试结果截图就是其中一项,具体内容就是把图中发光的部分截图并保存,单个图片很简单,但数量多起来也是要消耗不少时间,必须想个办法解决一下,每天哪怕省出个把小时抠抠手机摸摸鱼也是好的~~~
碰巧会点python,在逛我大CSDN论坛中发现能实现轮廓识别,再自己改点也就完成了,上报公司还有点奖金,爽歪歪~~~
下面稍微介绍下核心函数:
1、由于EL仪器的关系,测试结果会是一个大的发光区域与很多模糊的光点,通过CV2的识别轮廓的方法,会获得一个列表对应一系列的发光轮廓,而测试结果必定是发光轮廓最大的那个,后面的思路也是基于此。
import cv2 ret, thresh = cv2.threshold(gray.copy(), f, 255, cv2.THRESH_BINARY) contours,hierarchy= cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
2、遍历上面获得的发光轮廓列表contours,获得每个发光区域大小newimage.size,并形成一一对应列表piclist,用于后续识别。
#piclist轮廓列表 piclist=[] for i in range(0,len(contours)): x, y, w, h = cv2.boundingRect(contours[i]) newimage=gray[y+2:y+h-2,x+2:x+w-2] # 先用y确定高,再用x确定宽 #轮廓切片原图并获取图片size,加入列表,用于排除不合理的轮廓 piclist.append(newimage.size)
3、识别piclist最大的项并获得对应的index,然后从contours中提取区域并截图保存,由于EL测试中会存在电池片短路,即没有发光区域,所以会有if newimage.size!=0这个判断。
以下是核心函数的全部代码。
def singleCut(inpath,fileName,outpath): #开始截图计时 start = time.process_time() #读取图片 img = cv_imread(inpath) #转换为灰度图 gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #设置阈值 有待商榷 f=(2*max(gray[2])+3*min(gray[2]))/4#获取组件轮廓 ret, thresh = cv2.threshold(gray.copy(), f, 255, cv2.THRESH_BINARY) contours,hierarchy= cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) #piclist轮廓列表 piclist=[] for i in range(0,len(contours)): x, y, w, h = cv2.boundingRect(contours[i]) newimage=gray[y+2:y+h-2,x+2:x+w-2] # 先用y确定高,再用x确定宽 #轮廓切片原图并获取图片size,加入列表,用于排除不合理的轮廓 piclist.append(newimage.size) #关键步骤:获取轮廓列表中图片尺寸最大的切片 即EL中的组件发光区域 flag=True m=0 #test for i in range(0,len(contours)): m=m+1 if i==piclist.index(max(piclist)): x, y, w, h = cv2.boundingRect(contours[i]) #切片并保存结果 newimage=img[y+2:y+h-2,x+2:x+w-2] # 先用y确定高,再用x确定宽 if newimage.size!=0: cv_imwrite( outpath+fileName+".jpg",newimage) #cv_imwrite( outpath+"\{}-{}-{}".format(m,max(gray[3]),min(gray[3]))+".jpg",newimage) else: flag=False #结束计时 end = time.process_time() print("截图耗时{}秒".format("%.2f"%(end-start))) return flag
我也是在搜索好多CSDN论坛大神的文章后完成的,所以希望能帮到后来人,毕竟我大Python开发环境这么友善~~~~