You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

求无需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和进程开销来优化:

  1. 用内存虚拟磁盘(比如Windows自带的VHD)存临时图片,比物理硬盘快很多
  2. 给Tesseract加参数限定识别范围,大幅提速和提准确率
  3. 同样加入批量缓存写入逻辑,减少磁盘写入频率

优化后的示例代码:

@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

火山引擎 最新活动