本人是电子科技大学2018级的一名大一新生。当时报志愿时,就带着对IT行业的憧憬报考了电子科技大学。半个学期过去了,因为想锻炼自己的能力和提升一下之后保研的履历,我拉上同班的两个同学,参加了学校的大学生创新创业项目。项目是由生命科学学院的zhx老师指导的,而我是项目的负责人。博客是想对这次项目的进程有一个记录。
我们的课题是精子库自动检测系统。初听名字感觉好难…以为要操作好多装在液氮罐里的传感器。而老师给出的解决方案是通过操作树莓派对液氮罐屏幕进行定时拍照,经过图像处理识别,采集液氮罐上的信息传输给服务器,服务器再对用户请求进行响应。
树莓派买的是3B+因为学校给批了5000元,所以老师又让多买了好多不知道怎么用的传感器…树莓派入门使用的话是看的老师在coursera上买的网课。对就是那个UCI的黑哥哥。他第一个课程讲的就是一个简单的介绍,第二个课(Raspberry Pi GPIO)的话讲的挺多但好多具体功能的实现还要自己看店家给的教程或自己摸索。感觉你如果只用GUI的话和普通电脑的区别并不大…
让我最头疼的是OCR。老师原本没给我说OCR具体怎么实现。因为之前他给我说过要学python就以为要用python实现。结果用了pytesseract识别率低的一批,有时候识别出来连个字都没。后来以为要训练就用jTessBoxEditor费了老大的劲,要配置JAVA环境,那些box文件命名还贼麻烦。字数比较少的图片识别效果还是可以的,但换成液氮罐屏幕图片好多字根本识别不出来。
然后出一个精子库的训练集吧,就给我报错Failure Couldn’t find a matching blob
google了半天最后实在没办法了,问问老师吧。结果他说他也没用过Tesseract…欲哭无泪…之后他让我用百度AI的API,具体怎么搞我现在也不清楚,总之第一步就失败得很彻底…
现在唯一让我有点欣慰的是opencv的图像处理实现了。将液氮罐图片旋转剪裁灰度化提升对比度和亮度之后能让识别率提高很多。
下面是我东拼西凑出来的图像处理的代码…
#-*- coding:utf-8 –*-
import cv2
import numpy as np
import os
def RCG(img): #此函数将图片做旋转剪裁灰度化处理
rows,cols,x = img.shape
M = cv2.getRotationMatrix2D((cols/2,rows/2),356,1)
rotated = cv2.warpAffine(img,M,(cols,rows))
cropped = rotated[200:390, 285:1140]
I= cv2.cvtColor(cropped,cv2.COLOR_BGR2GRAY)
return I
def CB(I): #此函数将图片做亮度对比度提高处理
a = 4 #假设输入图片为I,宽为w,高为h,输出图像记为O
b=1 #O(r,c) = a*I(r,c)+b 0<=r<h, o<=c<w)
O = I * float(a)+float(b) #常数项a用来调节对比度,a>1时,图像对比度被放大,0<a<1时图像对比度被缩小
O[O > 255] = 255 # 常数项b用于调节亮度,b>0时亮度增强,b<0时对比度降低
O = np.round(O)
O = O.astype(np.uint8)
return O
if __name__ == "__main__":
rootdir="C:\\Users\\41361\\Desktop\\train"
for file in os.listdir(rootdir): #遍历文件夹中的每个图片,得到图片名称
path = os.path.join(rootdir, file) #在文件夹路径后加上文件名称
img = cv2.imread(path) #图片读取
I=RCG(img) #图片旋转剪裁灰度化
processed=CB(I) #将图片做亮度对比度提高处理
cv2.imwrite("C:\\Users\\41361\\Desktop\\processed\\"+file, processed) #图片保存
目前的进度大概就是这个样子啦!希望项目能顺利完成!