extra-image-dialog.js 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. /**
  2. * 步骤:
  3. * 1. 创建start()函数
  4. * 2. 创建变量imagePath储存图片路径:C:\Users\Zhuanz\Desktop\AIStoryBoard\static\漫画\image\鬼-巷第001卷\第一章\0004_鬼-巷第001卷.jpeg
  5. * 3. 创建变量outputDir储存输出目录:C:\Users\Zhuanz\Desktop\AIStoryBoard\static\漫画\image\鬼-巷第001卷\第一章\test
  6. * 4. 调用comic-text-detector.js生成文字遮罩图(保存到test/tmp目录)
  7. * 5. 调用check-reg.js检测格子,并绘制出来格子图片
  8. * 6. 调用merge-image.js合并带绿色框的文字区域图片和格子图片
  9. * 7. 调用cut-check.js切割黑线(不是绿线的)格子(按从右到左、从上到下顺序)
  10. * 8. 调用cut-dialog-block.js 切割绿色线框
  11. * 9. 调用ocr.js依次识别文件夹下的图片,生成识别结果的json文件
  12. * 10. 调用sort-dialog.js整理语句块的排序,返回结果。
  13. * 11. 调用sort-sentence.js整理所有check文件夹下的识别结果json,根据x1越大越靠前的原则排序,生成check.txt文件
  14. * 12. 使用generate-dialog-json.js 接收sort-dialog.js返回的结果,生成对话JSON,保存到outputDir目录
  15. */
  16. import fs from 'fs';
  17. import path from 'path';
  18. import { fileURLToPath } from 'url';
  19. import { startComicTextDetector } from '../comic-text-detector.js';
  20. import { startCheckReg as startCheckReg } from '../check-reg.js';
  21. import { startMergeImage as startMergeImage } from '../merge-image.js';
  22. import { startCutCheck as startCutCheck } from '../cut-check.js';
  23. import { startCutDialogBlock as startCutDialogBlock } from '../cut-dialog-block.js';
  24. import { startOcr as startOcr } from '../ocr.js';
  25. import { startSortSentence as startSortSentence } from '../sort-sentence.js';
  26. import { startSortDialog as startSortDialog } from '../sort-dialog.js';
  27. import { startGenerateDialogJson as startGenerateDialogJson } from '../generate-dialog-json.js';
  28. const __filename = fileURLToPath(import.meta.url);
  29. const __dirname = path.dirname(__filename);
  30. /**
  31. * 获取项目根目录
  32. */
  33. function getProjectRoot() {
  34. return path.join(__dirname, '..', '..');
  35. }
  36. // 创建变量projectRoot储存项目根目录
  37. const projectRoot = getProjectRoot();
  38. // 创建变量rootPath储存根目录
  39. const rootPath = path.join(
  40. projectRoot,
  41. 'static',
  42. '漫画',
  43. 'image',
  44. '鬼-巷第001卷',
  45. '第一章'
  46. );
  47. const imageName = '0005_鬼-巷第001卷';
  48. // 创建变量imagePath储存图片路径
  49. let originImagePath = path.join(
  50. rootPath,
  51. `${imageName}.jpeg`
  52. );
  53. // 创建变量储存输出目录
  54. let outputDir = path.join(
  55. rootPath,
  56. 'test3'
  57. );
  58. let tmpDir = path.join(
  59. outputDir,
  60. 'tmp'
  61. );
  62. // 创建变量textMaskPath储存文字遮罩图路径
  63. let textGreenPanelImgPath = path.join(
  64. tmpDir,
  65. `${imageName}_text_green_panel.png`
  66. );
  67. // 创建变量textBlocksJsonPath储存文字区域json文件路径
  68. let textBlocksJsonPath = path.join(
  69. tmpDir,
  70. `${imageName}_text_blocks.json`
  71. );
  72. // 漫画格子外轮廓位置json文件路径
  73. let textCheckRegionJsonPath = path.join(
  74. tmpDir,
  75. `${imageName}_text_check_region.json`
  76. );
  77. //漫画格子外轮廓图片
  78. let panelImgPath = path.join(
  79. tmpDir,
  80. `${imageName}_panel_img.png`
  81. );
  82. // 合并后的图片路径
  83. let mergedImgPath = path.join(
  84. tmpDir,
  85. `${imageName}_merged.png`
  86. );
  87. //根据漫画格子切割分类好的图片目录
  88. let cutPanelImgDir = path.join(
  89. tmpDir,
  90. 'cut-panel-img'
  91. );
  92. let resultDialogJsonPath = path.join(
  93. outputDir,
  94. `${imageName}_dialog.json`
  95. );
  96. /**
  97. * 步骤1: 创建start()函数
  98. */
  99. // 执行start函数
  100. if (import.meta.url === `file://${path.resolve(process.argv[1])}` ||
  101. process.argv[1]?.endsWith('test-ocr.js')) {
  102. start();
  103. }
  104. async function start() {
  105. console.log(`步骤1: test-ocr.js 开始测试`);
  106. console.log(`步骤2: 获取图片路径`);
  107. if (!fs.existsSync(originImagePath)) {
  108. throw new Error(`图片不存在: ${originImagePath}`);
  109. }
  110. console.log(`步骤3: 获取输出目录`);
  111. if (!fs.existsSync(outputDir)) {
  112. // 创建输出目录
  113. fs.mkdirSync(outputDir, { recursive: true });
  114. }
  115. console.log(`步骤4: 调用comic-text-detector`);
  116. // 使用超细文字配置,2次腐蚀让文字更细但仍然可见
  117. await startComicTextDetector(originImagePath,textGreenPanelImgPath, textBlocksJsonPath);
  118. console.log(`步骤5: 调用check-reg`);
  119. await startCheckReg(originImagePath,textCheckRegionJsonPath, panelImgPath);
  120. console.log(`步骤6: 调用merge-image`);
  121. await startMergeImage(textGreenPanelImgPath,panelImgPath,mergedImgPath);
  122. console.log(`步骤7: 调用cut-check.js`);
  123. let cutCheckResultArr = await startCutCheck(mergedImgPath,cutPanelImgDir);
  124. console.log(`步骤8: 调用cut-dialog-block`);
  125. let cutDialogBlockImgNameArr = await startCutDialogBlock(cutPanelImgDir,cutCheckResultArr);
  126. console.log(`步骤9: 调用ocr`);
  127. let ocrResultJsonPathArr = await startOcr(cutDialogBlockImgNameArr);
  128. console.log(`步骤10: 调用sort-sentence`);
  129. let ocrTxtResultArr = await startSortSentence(ocrResultJsonPathArr);
  130. console.log(`步骤11: 调用sort-dialog`);
  131. let sortDialogTxtResultArr = await startSortDialog(ocrTxtResultArr);
  132. console.log(`步骤12: 调用generate-dialog-json`);
  133. await startGenerateDialogJson(sortDialogTxtResultArr,resultDialogJsonPath);
  134. }
  135. export { start };