求无需Python或编译软件的批处理直接OCR屏幕值并缓存写入CSV方案
优化批处理屏幕数值监控的高效方案
针对你遇到的长时间每秒监控屏幕数值时,现有minicap+tesseract方案效率欠佳的问题,我这里有几个完全基于批处理+便携工具的解决方案,不用装Python也不用编译软件,正好匹配你的需求:
一、换用集成截图+OCR的便携单工具(最推荐)
当前方案的最大瓶颈是两次进程启动+中间图片文件的IO开销。换成集成了截图和OCR的单文件命令行工具,比如ScreenToText(便携版单EXE,解压就能用),可以直接截取指定区域并输出识别结果,完全省去中间图片步骤:
@echo off setlocal enabledelayedexpansion :: 配置参数:监控区域、CSV路径、每N次写入一次 set "MONITOR_REGION=800 600 850 620" set "LOG_CSV=C:\monitor_values.csv" set "BATCH_WRITE=10" set "cache_count=0" set "cache_content=" :: 初始化CSV表头(如果文件不存在) if not exist "%LOG_CSV%" ( echo 时间戳,监控数值 >> "%LOG_CSV%" ) :MONITOR_LOOP :: 获取格式化的时间戳 for /f "tokens=2 delims==" %%a in ('wmic os get localdatetime /value') do set "dt=%%a" set "timestamp=%dt:~0,4%-%dt:~4,2%-%dt:~6,2% %dt:~8,2%:%dt:~10,2%:%dt:~12,2%" :: 直接识别指定区域的数值,输出到变量 for /f "delims=" %%b in ('ScreenToText.exe /region %MONITOR_REGION% /quiet') do set "current_value=%%b" :: 清理识别结果里的非数字/小数点字符(可选,提升准确性) set "current_value=!current_value:~0,!" for /f "delims=0123456789.-" %%c in ("!current_value!") do set "current_value=!current_value:%%c=!" :: 缓存结果,达到批次数量再写入CSV set "cache_content=!cache_content!!timestamp!,!current_value!^!" set /a cache_count+=1 if !cache_count! equ !BATCH_WRITE! ( echo !cache_content! >> "%LOG_CSV%" set "cache_count=0" set "cache_content=" ) :: 等待1秒后继续循环 timeout /t 1 /nobreak >nul goto MONITOR_LOOP
二、优化现有minicap+tesseract流程(不换工具)
如果不想替换现有工具,也可以通过减少IO和进程开销来优化:
- 用内存虚拟磁盘(比如Windows自带的VHD)存临时图片,比物理硬盘快很多
- 给Tesseract加参数限定识别范围,大幅提速和提准确率
- 同样加入批量缓存写入逻辑,减少磁盘写入频率
优化后的示例代码:
@echo off setlocal enabledelayedexpansion set "MONITOR_REGION=800 600 850 620" set "LOG_CSV=C:\monitor_values.csv" set "BATCH_WRITE=10" set "cache_count=0" set "cache_content=" :: 假设你创建的内存虚拟磁盘盘符是Z: set "TEMP_IMG=Z:\temp_shot.png" :: 初始化CSV表头 if not exist "%LOG_CSV%" ( echo 时间戳,监控数值 >> "%LOG_CSV%" ) :MONITOR_LOOP :: 获取时间戳 for /f "tokens=2 delims==" %%a in ('wmic os get localdatetime /value') do set "dt=%%a" set "timestamp=%dt:~0,4%-%dt:~4,2%-%dt:~6,2% %dt:~8,2%:%dt:~10,2%:%dt:~12,2%" :: 截图+定向OCR(只识别数字和小数点) minicap.exe -captureregion %MONITOR_REGION% -save %TEMP_IMG% -exit -escapequit for /f "delims=" %%b in ('tesseract.exe %TEMP_IMG% stdout --psm 10 -c tessedit_char_whitelist=0123456789.-') do set "current_value=%%b" :: 缓存批量写入 set "cache_content=!cache_content!!timestamp!,!current_value!^!" set /a cache_count+=1 if !cache_count! equ !BATCH_WRITE! ( echo !cache_content! >> "%LOG_CSV%" set "cache_count=0" set "cache_content=" ) timeout /t 1 /nobreak >nul goto MONITOR_LOOP
小提示:Tesseract的
--psm 10参数是告诉工具识别单个字符块(正好匹配你的数值场景),tessedit_char_whitelist限定只能识别数字和小数点,这俩参数一起用,识别速度和准确率都会提升很多。
三、核心优化逻辑说明
- 批量写入CSV:避免每秒写一次文件,减少磁盘IO的频繁操作,长时间运行时这个优化的效果非常明显
- 限定OCR识别范围:不让工具识别无关字符,既快又准
- 便携工具优先:所有用到的工具都可以下载便携版,解压后直接在批处理里调用,完全不需要安装任何额外环境
内容的提问来源于stack exchange,提问作者Chob




