找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 21587|回复: 10

[文件操作] 求助批处理实现图片ocr归类

[复制链接]
发表于 2023-6-6 21:49:42 | 显示全部楼层 |阅读模式
一堆001.jpg  002.jpg  003.jpg……

我用convert截取顶部 然后ocr识别导出tmp.txt

如果txt有银行二字,就截取底部指定位置,ocr识别出数字保存到tmp2.txt 并将这个数字新建文件夹,将被截取的图片放进去。

否则,否则就将图片直接放到上一个新建的文件夹中。
  1. @echo off
  2. Setlocal enabledelayedexpansion
  3. FOR /D %%a IN (*) DO (
  4.         echo %%~fa
  5.         cd /d %%~fa
  6.         for /r %%i in (*.jpg) do (
  7.                 convert.exe -crop 2470x180+20+193 "%%i" "tmp.jpg"
  8.                 tesseract "tmp.jpg" "tmp" -l chi_sim
  9.                 findstr /i "银行" "tmp.txt" >nul
  10.                 if errorlevel 1 (convert -crop 555x80+505+370 "%%i" "tmp2.jpg"
  11.                                 tesseract.exe "tmp2.jpg" "tmp2" -l chi_sim
  12.                                 ping -n 2 127.0.0.1>nul
  13.                                 set /P file=<"tmp2.txt"
  14.                                 mkdir !file!
  15.                                 move "%%i" !file!
  16.                                 ) else ( set /P file=<"tmp2.txt"
  17.                                         move "%%i" !file!)
  18.                         )
  19.                 )
  20. pause
复制代码
现在的问题是,就算tmp.txt没有"银行"二字,他也是会执行  else 之前的步骤。
发表于 2023-6-6 22:37:12 | 显示全部楼层
可能是编码的问题造成的。
参考一下这个帖子  http://www.bathome.net/viewthread.php?tid=66267
 楼主| 发表于 2023-6-6 23:03:00 | 显示全部楼层
回复 2# 77七


  我用 &&goto A||goto B
根本不会正常运行。直接就是B
发表于 2023-6-6 23:32:16 | 显示全部楼层
本帖最后由 77七 于 2023-6-6 23:45 编辑

回复 3# 暴牙弟


http://www.bathome.net/redirect.php?goto=findpost&;ptid=66267&pid=269641
然后使用 find /i
 楼主| 发表于 2023-6-7 00:09:10 | 显示全部楼层
回复 4# 77七

现在可以运行了,但是只运行了一次 :A, 然后就对话框结束了。不会继续处理jpg图片啊
  1. @echo off
  2. Setlocal enabledelayedexpansion
  3. chcp 65001
  4. FOR /D %%a IN (*) DO (
  5.         echo %%~fa
  6.         cd /d %%~fa
  7.         for /r %%i in (*.jpg) do (
  8.                 set pic=%%~ni.jpg
  9.                 "C:\Users\暴牙弟\Desktop\ImageMagick\convert.exe" -crop 2470x180+20+193 "%%i" "tmp.jpg"
  10.                 tesseract "tmp.jpg" "tmp" -l chi_sim
  11.                 find /i "银行" tmp.txt>nul&&echo goto :A||goto :B
  12.                
  13. :A
  14. "C:\Users\暴牙弟\Desktop\ImageMagick\convert.exe" -crop 555x80+505+370 "!pic!" "tmp2.jpg"
  15. tesseract.exe "tmp2.jpg" "tmp2" -l chi_sim
  16. ping -n 2 127.0.0.1>nul
  17. set /p file=<"tmp2.txt"
  18. echo !file!
  19. pause
  20. mkdir !file!
  21. move !pic! !file!
  22. exit /b 0
  23. :B
  24. set /P file=<"tmp2.txt"
  25. move "%%i" !file!
  26. exit /b 0
  27.         )
  28. )
  29. pause
复制代码
发表于 2023-6-7 00:15:34 | 显示全部楼层
回复 5# 暴牙弟


  
  1. @echo off
  2. chcp 65001
  3. Setlocal enabledelayedexpansion
  4. FOR /D %%a IN (*) DO (
  5.         echo %%~fa
  6.         cd /d %%~fa
  7.         for /r %%i in (*.jpg) do (
  8.                 convert.exe -crop 2470x180+20+193 "%%i" "tmp.jpg"
  9.                 tesseract "tmp.jpg" "tmp" -l chi_sim
  10.                 find /i "银行" "tmp.txt" >nul
  11.                 if errorlevel 1 (convert -crop 555x80+505+370 "%%i" "tmp2.jpg"
  12.                                 tesseract.exe "tmp2.jpg" "tmp2" -l chi_sim
  13.                                 ping -n 2 127.0.0.1>nul
  14.                                 set /P file=<"tmp2.txt"
  15.                                 mkdir !file!
  16.                                 move "%%i" !file!
  17.                                 ) else ( set /P file=<"tmp2.txt"
  18.                                         move "%%i" !file!)
  19.                         )
  20.                 )
  21. pause
复制代码
不用改成goto 吧,这样不行吗?
 楼主| 发表于 2023-6-7 00:19:25 | 显示全部楼层
回复 6# 77七

不行。我不明白  0001截取肯定是有银行  两个字的,0002是没有的,没有的话应该是 执行else 后面的,但是他依然顺序执行。所以才想办法用goto。但是goto又没法跳回 for /r 那里继续处理
发表于 2023-6-7 00:34:10 | 显示全部楼层
回复 7# 暴牙弟


   errorlevel 1是失败,0是成功吧,没有银行,应该执行失败,会执行 errorlevel 1那段,不是else 那段。先试试行不行。
goto 的标签不能写在括号里面。
如果想跳回去可以使用call,你可能把call和goto 搞混淆了。
for /r 可能有点问题,可以改成for /f "delims=" %%x in ('dir /b /s /a-d *.jpg') 这种形势
 楼主| 发表于 2023-6-7 00:38:30 | 显示全部楼层
回复 8# 77七

无论是0还是1 他都会执行
  1. set /p file=<"tmp2.txt"
  2.                                     mkdir !file!
  3.                                     echo !file!
复制代码
现在我实在搞不懂了。
如果用goto 和call 我应该怎么添加 跳转回 for /r 上方?
发表于 2023-6-7 02:18:22 | 显示全部楼层
回复 9# 暴牙弟


  
  1. @echo off
  2. chcp 65001
  3. Setlocal enabledelayedexpansion
  4. FOR /D %%a IN (*) DO (
  5.         pushd "%%a"
  6.         for /f "delims=" %%i in ('dir /b /s /a-d *.jpg') do (
  7.                 echo 正在处理:%%i
  8.                 convert.exe -crop 2470x180+20+193 "%%i" "tmp.jpg"
  9.                 tesseract "tmp.jpg" "tmp" -l chi_sim
  10.                 find /i "银行" "tmp.txt" >nul
  11.                 if errorlevel 1 (
  12.                         echo 正在处理:%%i errorlevel=1
  13.                         set /P file=<"tmp2.txt"
  14.                         move "%%i" "!file!"
  15.                 ) else (
  16.                         echo 正在处理:%%i errorlevel=0
  17.                         del "tmp2.txt" 2>nul
  18.                         convert -crop 555x80+505+370 "%%i" "tmp2.jpg"
  19.                         tesseract.exe "tmp2.jpg" "tmp2" -l chi_sim
  20.                         ping -n 2 127.0.0.1 >nul
  21.                         set /P file=<"tmp2.txt"
  22.                         mkdir "!file!"
  23.                         move "%%i" "!file!"
  24.                 )
  25.                 del "tmp.txt";"tmp.jpg";"tmp2.jpg" 2>nul
  26.         )
  27.         popd
  28. )
  29. pause
复制代码
我觉得没有必要用call,先理清逻辑和检查错误。find的问题不知道是否确定已解决?
如果不行,提供个测试文件吧。
 楼主| 发表于 2023-6-7 07:46:17 | 显示全部楼层
回复 10# 77七

用这个可以了 谢谢,看来是for  /r的问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-18 18:37 , Processed in 0.018465 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表