opencv自然场景文本(中文)检测(python代码+实现)+CNN理解
学习记录:
先了解一波CNN(理解难度递增):
详解卷积神经网络(CNN)
卷积讲得比较清楚
https://blog.csdn.net/liangchunjiang/article/details/79030681
CNN卷积神经网络原理讲解+图片识别应用(附源码)
卷积和池化讲得很详细(我没试过他的代码,不知道能不能运行,我还是专心干一件事吧)
https://blog.csdn.net/kun1280437633/article/details/80817129
一文让你彻底了解卷积神经网络
我发现了一个共同特点:为啥咱们就不能把全连接层讲清楚呢…
https://blog.csdn.net/weixin_42451919/article/details/81381294
对全连接层(fully connected layer)的通俗理解:
https://blog.csdn.net/qq_39521554/article/details/81385159
全连接层(Fully Connected Layer)
https://blog.csdn.net/bestrivern/article/details/89525816
CNN学习自我总结:
卷积层:
卷积层的作用其实就是,对于每一个独立区域,通过输入层与卷积核(权重)相乘,不断改变卷积核,来确定能初步表征该图片区域特征的有用的卷积核是哪些,再得到与相应的卷积核相乘后的输出矩阵。
池化层:
通过选取指定区域具有代表的数字来代表这片区域(有最大池化,均值池化等)
是为了减少训练参数的数量,降低卷积层输出的特征向量的维度,减小过拟合现象,保留最有用的图片信息
全连接层:
我,没看太明白…那我就暂且理解为全连接层是把卷积池化操作后得到的特征矩阵汇合,用于生成分类器分类(别打脸)。希望随着以后的继续接触能对这些有更深更准确地理解。
opencv自然场景文本(中文)检测:
原文地址:https://blog.csdn.net/weixin_39059031/article/details/82415226
不知道是不是因为用的的是east文本检测框架,适用于自然场景下的短文本,所以对于类似作业题目文本检测真的是…一言难尽
但是我目前想检测的是书本上的,所以又发现找了一个文本检测方法。
最简单的简单场景形态学操作
https://blog.csdn.net/weixin_42831704/article/details/90599766
然后加上上篇中用到的tesseract-OCR对检测出的文本框内的文本进行识别
测试运行代码如下:
import cv2 import numpy as np import pytesseract # 读取图片 imagePath = '2.jpg' img = cv2.imread(imagePath) orig = img.copy() origH, origW = img.shape[:2] # 转化成灰度图 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 利用Sobel边缘检测生成二值图 sobel = cv2.Sobel(gray, cv2.CV_8U, 1, 0, ksize=3) # 二值化 ret, binary = cv2.threshold(sobel, 0, 255, cv2.THRESH_OTSU + cv2.THRESH_BINARY) # 膨胀、腐蚀 element1 = cv2.getStructuringElement(cv2.MORPH_RECT, (30, 9)) element2 = cv2.getStructuringElement(cv2.MORPH_RECT, (24, 6)) # 膨胀一次,让轮廓突出 dilation = cv2.dilate(binary, element2, iterations=1) # 腐蚀一次,去掉细节 erosion = cv2.erode(dilation, element1, iterations=1) # 再次膨胀,让轮廓明显一些 dilation2 = cv2.dilate(erosion, element2, iterations=2) # 查找轮廓和筛选文字区域 region = [] boxes = [] binary,contours, hierarchy = cv2.findContours(dilation2, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) for i in range(len(contours)): cnt = contours[i] # 计算轮廓面积,并筛选掉面积小的 area = cv2.contourArea(cnt) if (area < 1500): continue # 找到最小的矩形 rect = cv2.minAreaRect(cnt) # box是四个点的坐标 box = cv2.boxPoints(rect) box = np.int0(box) # 计算高和宽 height = abs(box[0][1] - box[2][1]) width = abs(box[0][0] - box[2][0]) # 根据文字特征,筛选那些太细的矩形,留下扁的 if (height > width * 1.3): continue #记录起始坐标结束坐标对应的X,Y值 boxes.append((box[1][1],box[0][0],box[0][1],box[2][0])) region.append(box) padding = 0.0 results = [] for (startY, startX, endY,endX) in boxes: # extract the actual padded ROI roi = orig[startY:endY, startX:endX] # use Tesseract v4 to recognize a text ROI in an image text = pytesseract.image_to_string(roi,lang='chi_sim') text = text.split() text = ''.join(text) # add the bounding box coordinates and actual text string to the results list results.append(((startX, startY, endX, endY), text)) # sort the bounding boxes coordinates from top to bottom based on the y-coordinate of the bounding box results = sorted(results, key=lambda r:r[0][1]) output = orig.copy() # loop over the results for ((startX, startY, endX, endY), text) in results: # display the text OCR'd by Tesseract print("{}\n".format(text)) # draw the text and a bounding box surrounding the text region of the input image cv2.rectangle(output, (startX, startY), (endX, endY),(0, 255, 0), 1) # show the output cv2.imshow("Text Detection", output) cv2.waitKey(0)
我发现对于不同长宽比例的文本,采用不同像素输入图片结果会差很多,这是个例子下相对较好的结果:
识别结果:
名晚上,我由广东湛江市搭乘火车到广州去,八个多小时的路程,买了四人同室的软卧票。尽管觉 一件十分别扭的事,然而,别无其他选择,也只好随遇而安了。 @@进入那间极为局促的车厢窜室时,已有一位年过六旬的妇人坐在里面了。浅灰色的高领套头毛 衣,极为得体地配以铁灰色的西式套装衣裤了的短发,一丝不苟地梳得整整齐齐;方形的细 框眼镜,攻|6 回攀谈之下,知道她是广州一知性杂志的主编,几天前专程到湛江去约稿,现在,大功告成,启程 回家由于志趣相投,我们谈得十分投缘。就在这时,火车站的扩音器突然响起:“请各位注意:软 卧的车票还有几张,有意购买的人赶快去买!“妇人转头对我说道:“真希望这间害室没有人再进 来,图个清静。“我一听,便笑了起来,因为我心里也正转着同一个念头。
这已经是较好的结果了…emmmm
继续学习,争取下次得到更好的识别结果
加油~
题外话:同学用网上下的模型和数据集训练了一个手写体识别,全错,
气的她一句:"人工智障,不是你疯就是我疯…"哈哈哈,好可爱有没有。
收工,打游戏去了
- opencv python 三帧差法实现运动目标区域检测与完整代码
- Python + OpenCV实现基于傅里叶变换(FFT)的旋转文本校正(文字方向检测)
- 【Python+OpenCV】实现检测场景内是否有物体移动,并进行人脸检测抓拍
- 25行 Python 代码实现人脸检测——OpenCV 技术教程
- 应用笔画宽度变换(SWT)来检测自然场景中的文本
- python用10行代码实现黄色图片检测
- 支持向量机SVM通俗理解(python代码实现)
- 应用笔画宽度变换(SWT)来检测自然场景中的文本
- OpenCV环境下Laplace(拉普拉斯)和Roberts基本边缘检测算子的实现代码
- Python-OpenCV人脸检测(代码)
- Opencv--20行代码实现椭圆检测
- python中将阿拉伯数字转换成中文的实现代码
- Python-OpenCV人脸检测(代码)
- 利用霍夫梯度法进行圆检测的原理概要及OpenCV代码实现
- Faster RCNN代码理解(Python)
- Python基于OpenCV实现视频的人脸检测
- 基于python、dlib和opencv的200行代码实现的换脸
- 关于Python+Opencv实现人脸检测的实验笔记(调用图片文件篇)
- 嵌入式开发之davinci--- 8148/8168/8127 中的添加算饭scd 场景检测 代码实现
- Python-OpenCV人脸检测(代码)