You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Tesseract.js实时视频流场景下绘制识别文字边界框的问题

Tesseract.js实时视频流场景下绘制识别文字边界框的问题

嗨,我懂你遇到的糟心事——现在Tesseract.js更新后,返回的数据结构和旧教程里的不一样了,难怪你找不到bbox和data.words这些属性!默认情况下,Tesseract.recognize只会返回简化的文本结果,要拿到位置信息得改个参数,我给你一步步说怎么弄:

首先,调用识别方法的时候,必须加上{ output: 'verbose' }这个配置,这样才能拿到包含每个单词位置的详细数据,代码大概是这样:

try {
  const { data } = await Tesseract.recognize(
    dataUrl,
    "eng",
    { output: 'verbose' } // 这步是核心!开启后才能获取到文字的位置信息
  );
  // 现在data里就有words数组了,每个元素都自带bbox属性
} catch (err) {
  console.error('识别出问题啦:', err);
}

接下来,你就可以遍历data.words数组,每个元素里的bbox对象包含了文字的精准位置——x0和y0是文字区域左上角的坐标,x1和y1是右下角的坐标。然后用canvas的上下文来画框就行,注意你之前的代码里getContext("2的内容")应该是笔误,要写成"2d"哦。完整的画框代码大概是这样:

const overlayCtx = overlay.getContext("2d");
// 每次画新框前先清空画布,避免旧的边界框残留
overlayCtx.clearRect(0, 0, overlay.width, overlay.height);

// 逐个处理每个识别到的单词
data.words.forEach(word => {
  const { bbox, text } = word;
  // 自定义边界框的样式,这里用红色粗线,你可以自己改颜色和宽度
  overlayCtx.strokeStyle = '#ff0000';
  overlayCtx.lineWidth = 2;
  // strokeRect参数:x坐标, y坐标, 框的宽度, 框的高度
  overlayCtx.strokeRect(bbox.x0, bbox.y0, bbox.x1 - bbox.x0, bbox.y1 - bbox.y0);
  
  // 可选操作:在边界框上方显示识别出的文字,方便你核对识别结果
  overlayCtx.fillStyle = '#ff0000';
  overlayCtx.font = '14px sans-serif';
  overlayCtx.fillText(text, bbox.x0, bbox.y0 - 5);
});

另外给你提个实用小建议:实时视频流如果每一帧都触发识别,性能会特别差,很容易卡成PPT。你可以加个节流机制,比如每300ms识别一次,或者只在画面有明显变化的时候才触发识别,这样既能保证识别效果,又能让流畅度过得去~

对了,还要确认下你用的Tesseract.js是较新的版本(比如v3或v4),这些版本都支持verbose输出,要是用的特别老的版本参数可能不一样,但现在主流版本都是这么用的。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 12:43:14