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
相关产品推荐
相关产品推荐

