ahk2_lib icon indicating copy to clipboard operation
ahk2_lib copied to clipboard

请问 rapidocr 如何保证 识别出的字符串 顺序 跟图片上的 字符串顺序一致?

Open six7ths opened this issue 2 months ago • 5 comments

请问 rapidocr 如何保证 识别出的字符串 顺序 跟图片上的 字符串顺序一致?

现在 对于 一排 几个数字 用空格分开的, 直接一次识别出的字符串 数字的顺序会随机化

对于多排 ,每排 用空格分开的字符, 也会 每排顺序都随机化,不稳定。

six7ths avatar Oct 20 '25 03:10 six7ths

默认已经排序了的

thqby avatar Oct 20 '25 06:10 thqby

是不是加了多线程后,顺序就不一致了? 我用2线程 顺序总是不稳定, 3个词 有时是确定的,有时又乱排。

six7ths avatar Nov 04 '25 01:11 six7ths

字符有高低顺序?发给图看看

thqby avatar Nov 04 '25 02:11 thqby

Image

比如这样的图, 行顺序没问题,行内顺序就经常数字颠三倒四,不是按原图顺序。

six7ths avatar Nov 05 '25 01:11 six7ths

记错了,识别结果没排序

thqby avatar Nov 05 '25 11:11 thqby

请问,有设置 是否排序的参数吗? 我找了以下,好像没找到

six7ths avatar Nov 06 '25 01:11 six7ths

Image

已修复

thqby avatar Nov 10 '25 06:11 thqby

好的,多谢多谢,非常感谢。

six7ths avatar Nov 11 '25 00:11 six7ths

Image

已修复

我在程序里替换了最新的rapidocr.ahk 和dll后出现下面的问题,我搞不清楚哪里出了问题,麻烦帮助看一下

我是在H版本 新开的线程里调用的ocr

我记得以前可能是范围的问题,但是用上个版本的rapidorc这里没出问题;用了最新的版本覆盖后,出了问题。我还原后也没出问题。好奇怪。

Error: An exception was thrown.

Specifically: 0xe06d7363

---- D:\RapidOcr.ahk

▶ 096: Return DllCall('RapidOcrOnnx\OcrDetectBitmapData', 'ptr', this, 'ptr', data, 'ptr', param, 'ptr', RapidOcr.__cb(2 - !allresult), 'ptr', ObjPtr(&res)) ? res : ''

The current thread will exit.

Call stack: D:\RapidOcr.ahk (96) : [DllCall] Return DllCall('RapidOcrOnnx\OcrDetectBitmapData', 'ptr', this, 'ptr', data, 'ptr', param, 'ptr', RapidOcr.__cb(2 - !allresult), 'ptr', ObjPtr(&res)) ? res : '' D:\RapidOcr.ahk (96) : [RapidOcr.Prototype.ocr_from_bitmapdata] Return DllCall('RapidOcrOnnx\OcrDetectBitmapData', 'ptr', this, 'ptr', data, 'ptr', param, 'ptr', RapidOcr.__cb(2 - !allresult), 'ptr', ObjPtr(&res)) ? res : '' D:\Tools_H\rapidOCR_Config.ahk (61) : [getOcrString] res := ocr.ocr_from_bitmapdata(bm_buf.info, param) D:\Tools_H\detect_H_BS.ahk (665) : [detectCurrent] res1_P := getOcrString(bm_bufSell1, ocr)

six7ths avatar Nov 11 '25 00:11 six7ths

我的orc参数是这么定的

arg4RapidOcr := [27, 0.005, 0.005, 1.8]

Global param := RapidOcr.OcrParam() param.doAngle := false param.padding := arg4RapidOcr[1] param.boxThresh := arg4RapidOcr[2] ;0.3 [0, 1]图像中文字部分和背景部分分割阈值。值越大,文字部分会越小。 param.boxScoreThresh := arg4RapidOcr[3] ;0.5 [0, 1]文本检测所得框是否保留的阈值,值越大,召回率越低。 param.unClipRatio := arg4RapidOcr[4] ; 1.6 [1.6, 2.0]控制文本检测框的大小,值越大,检测框整体越大。

rapidOcrConfig := Map() rapidOcrConfig["models"] := "D:Tools\RapidOcr\models" ; rapidOcrConfig["det"]:="D:Tools\RapidOcr\models\ch_PP-OCRv4_det_infer.onnx" rapidOcrConfig["rec"] := "D:Tools\RapidOcr\models\ch_PP-OCRv4_rec_infer.onnx" rapidOcrConfig["keys"] := "D:Tools\RapidOcr\models\ppocr_keys_v1.txt" rapidOcrConfig["cls"] := "D:Tools\RapidOcr\models\ch_ppocr_mobile_v2.0_cls_infer.onnx"

rapidOcrConfig["min_height"] := 30 rapidOcrConfig["width_height_ratio"] := 4 rapidOcrConfig["det_use_cuda"] := True rapidOcrConfig["cls_use_cuda"] := True rapidOcrConfig["rec_use_cuda"] := True ; rapidOcrConfig["use_cls"]:=false ; rapidOcrConfig["use_det"]:=false

rapidOcrConfig["text_score"] := 0.1 ;取值范围:[0, 1], 默认值是0.5。文本识别结果置信度,值越大,把握越大。 ; rapidOcrConfig["det_limit_side_len "]:=200 ; ; rapidOcrConfig["det_limit_type "]:=Min ; ; rapidOcrConfig["max_candidates "]:=500 ;

rapidOcrConfig["numThread"] := 1

dllpath := "D:Tools\RapidOcr\64bit\RapidOcrOnnx.dll"

Global ocr := RapidOcr(rapidOcrConfig, dllpath)

six7ths avatar Nov 11 '25 01:11 six7ths

我找到原因了,更新后,若是往ocr里传入的是全黑的图片, 就立刻跳出这个异常。 更新前,若是传入是全黑图片,没有任何问题。

因为,我是用H的新开线程去识别,有时候会传入全黑图片,所以,只要出现全黑图片,必然跳出这个异常。

又测试了,只要传入纯色图片,就会出异常。

six7ths avatar Nov 11 '25 02:11 six7ths

更新了

thqby avatar Nov 12 '25 06:11 thqby

更新了

好的,多谢。 我回头试试看。 我先至输入前 用opencv判断一遍是否纯色图片,然后还把 ocr用try/catch包起来。 暂时没出过问题。 我转为灰色单通道,然后一个一个像素判断跟mat[0][0]是否相等,不相等就不是纯色图片; 请问有更好的,更高效的办法判断是否纯色图片吗? 我网上搜了半天,好像其他办法没统一的办法和通用函数。

因为搞不清 会不会输入其他图片会导致抛出异常, 是不是 建议平时使用时,也用try/catch包起来呢?以前java时,说这样会影响比加大的性能。

six7ths avatar Nov 13 '25 01:11 six7ths