pylibdmtx 库,尝试除了不工作 - 断言`value >= 0 && value < 256'

pylibdmtx library, try except not working - Assertion `value >= 0 && value < 256'

问题简述:

我们有一个特定的 png 图像,其中在 pylibdmtx 库的帮助下在给定位置搜索数据矩阵代码。在指定位置(代码中给定 xmin、ymin、xmax、ymax 坐标),我们裁剪图像、重新缩放并发送到库进行解码。但从 dmtxdecodescheme.c 得到断言错误,程序停止。 我们希望忽略错误(return“??????”,如果可能的话),但是try/except无法正常工作,也无法逃脱

详情:

这种错误以前从未发生过,只发生在这个特定的png图像上,并给出了特定的坐标和SCALER值。 上传图像在:https://easyupload.io/3yioro,因为由于大小限制我无法上传到 Whosebug(3.1 Mb 超过 2Mb 限制) 如果我裁剪图像或将图像转换为另一个扩展名,错误不会重现。这确实是一个罕见且难以重现的错误。

这里是简化代码,您只搜索 1 个给定位置:

from pylibdmtx.pylibdmtx import decode as decoder
import cv2

xmin = 755
ymin = 501
xmax = 830
ymax = 576
squareDim=150
SCALER=2

def bruteDMSearch(croppedImage):
    try:
        barcode = decoder(croppedImage)
        #brute force cv2.threshold
        threshh=50
        while((not barcode) and (threshh<250)):
            threshh=threshh+15
            ret, thresholdy = cv2.threshold(croppedImage, threshh, 255, cv2.THRESH_BINARY)
            barcode=decoder(thresholdy)
        if(barcode):
            code = ((barcode[0])[0]).decode("utf-8")
            return code
        else:
            return "??????"
    except:
        return "?????"

img = cv2.imread("img.png",0)
sheight=int(img.shape[0]/SCALER)
swidth=int(img.shape[1]/SCALER)
smaller_img=cv2.resize(img,(swidth,sheight))

croppy = smaller_img[ymin:ymax,xmin:xmax]
#cv2.imshow("croppy",croppy)
#cv2.waitKey(0)
code = bruteDMSearch(croppy)

输出为:

python3: dmtxdecodescheme.c:115: PushOutputWord: Assertion `value >= 0 && value < 256' failed.
Aborted (core dumped)

你的代码对我有效 as-is。 我得到了这个输出

最初我遇到了 libdmtx 的其他问题。(这是我遇到的 libdmtx 的问题,并且与您的 Python 代码没有问题)

我在win10中使用condas安装了libdmtx。但是在运行时我得到了 FileNotFoundError: Could not find module 'libdmtx-64.dll'

然后我从 https://github.com/dmtx/libdmtx 构建了库并获得了发布模式 dmtx.dll。将此 dll 重命名为 libdmtx-64.dll 并放置在“C:\Users\balu\Miniconda3\Library\bin”中。

注意:如果您的目标是二维码解码,请查看我已经回答过的旧问题。

我在 ubuntu 21.10 上用 libdmtx-dev 0.7.5-3 和 pylibdmtx 0.1.9 重现了这个问题:

python: dmtxdecodescheme.c:128: PushOutputWord: Assertion `value >= 0 && value < 256' failed.
Aborted (core dumped)

鉴于库是用 C 编写的,并且 C 模块本身会引发段错误,try-except 逻辑在这里无济于事。您将需要 运行 这一行:

barcode = decoder(croppedImage)

在单独的进程中(通过子进程或多进程)。 是一个示例,说明如何通过多处理以 segfault-proof 方式使用装饰器 运行 解码器。