你们有没有遇到这种情况:
甲方给了你一沓扫描的坐标表格、Excel表格照片让你录入系统。你看着几百个数据点欲哭无泪——一个一个手写输入得录到猴年马月?
今天跟你们聊个黑科技:用OpenCV + OCR从图片里自动提取坐标数据。
1. 扫描件录入
老的纸质记录本、扫描的坐标表——拍照或扫描成图片,脚本自动识别提取。
2. 现场照片
同事在现场拍的仪表盘、记录纸——直接识别出数字,省得再手动抄一遍。
3. 报表截图
Excel截图、Word里的表格图——识别后导出成可直接用的数据。
两部分组成:
OpenCV负责图像预处理:
Tesseract负责文字识别:
整体流程:
先别急着找图片,复制这段代码跑一下模拟流程:
import reimport pandas as pd# 模拟OCR识别结果# 假设这是从图片中识别出来的文字ocr_result = """测量坐标记录表点号 X坐标 Y坐标 高程P001 500000.00 3500000.00 156.50P002 500010.00 3500010.00 157.20P003 500020.00 3500020.00 156.80P004 500030.00 3500030.00 155.90P005 500040.00 3500040.00 156.10"""print("=" * 50)print("原始OCR识别结果:")print("=" * 50)print(ocr_result)print("=" * 50)print("解析坐标数据:")print("=" * 50)# 用正则表达式解析坐标# 匹配格式:P001 500000.00 3500000.00 156.50pattern = r'(P\d+)\s+(\d+\.\d+)\s+(\d+\.\d+)\s+(\d+\.\d+)'matches = re.findall(pattern, ocr_result)# 转换为DataFramedata = []formatchin matches: point_id, x, y, z = match data.append({'点号': point_id,'X': float(x),'Y': float(y),'Z': float(z) })df = pd.DataFrame(data)print(df)print("\n" + "=" * 50)print("数据统计:")print("=" * 50)print(f"共识别 {len(df)} 个坐标点")print(f"X范围: {df['X'].min():.2f} - {df['X'].max():.2f}")print(f"Y范围: {df['Y'].min():.2f} - {df['Y'].max():.2f}")print(f"高程范围: {df['Z'].min():.2f}m - {df['Z'].max():.2f}m")# 导出CSVoutput = 'recognized_coords.csv'df.to_csv(output, index=False, encoding='utf-8-sig')print(f"\n已导出: {output}")跑完你会看到:识别结果→解析→DataFrame→导出CSV,整个流程几分钟就完成了。
注意:上面的代码是模拟OCR结果。实际使用时,把ocr_result替换成pytesseract识别出来的文字就行:
import cv2import pytesseract# 读取图片img = cv2.imread('coordinate_photo.png')# 预处理gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)_, binary = cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY)# OCR识别text = pytesseract.image_to_string(binary, config='--psm 6')# 后续解析同上...图片质量
识别效果取决于图片清晰度。拍的时候手别抖,尽量正对,光线均匀。
参数调优
--psm 6是单列文本模式,针对坐标列表效果比较好。不同场景可能需要换参数。
格式解析
识别出来的是字符串,得用正则表达式解析成X,Y,Z格式。不同坐标格式规则不一样,根据实际调整。
我们队里老张以前最烦录数据这事儿,一坐就是一下午。后来我给他鼓捣了这个,现在他现场拍个照、回来跑脚本,几秒钟数据就出来了。
这技术不新鲜,但真的好用。省下的时间陪家人不香吗。
按需调整参数,可以提取更多字段。
以往文章合集: