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

求助:int()参数类型错误排查与解决(TensorFlow1.8+OpenCV3.4.0)

问题分析与解决方案

嗨,我来帮你搞定这个错误~先给你拆解一下这个报错:

int() argument must be a string, a bytes-like object or a number, not 'NoneType'

这个错误的核心是:代码里有个地方试图把None(空值)转换成整数,但Python根本不允许这么干。结合你的代码和使用的TensorFlow 1.8、OpenCV 3.4.0环境,问题根源很明确——视频帧读取失败,导致frame变成了None,后续的模型计算环节把这个空值当成了需要处理的数值,进而触发了报错。

为什么会出现这个情况?

看你的代码,while循环里直接调用ret, frame = video.read(),但没有判断ret的状态:

  • 当RTSP网络流卡顿、连接不稳定,或者视频源临时中断时,video.read()会返回(False, None)——也就是读取失败,frame是空值。
  • 之后你直接执行np.expand_dims(frame, axis=0),把None包装成了数组,喂给TensorFlow模型后,模型内部的坐标计算、张量形状处理等操作尝试把这个None转成整数,就抛出了这个错误。

具体解决方案

给你几个针对性的修改步骤,按顺序来就行:

  1. 先检查帧读取状态,跳过无效帧
    在读取帧之后立刻判断ret是否为True,如果读取失败就跳过当前循环,避免空值进入后续流程:

    while(True):
        try:
            ret, frame = video.read()
            # 新增:检查帧是否读取成功
            if not ret:
                print("Failed to read frame, skipping this iteration...")
                continue
            
            # 后面的帧处理、模型推理代码保持不变
            frame_expanded = np.expand_dims(frame, axis=0)
            (boxes, scores, classes, num) = sess.run(...)
            # ... 其余代码 ...
    
  2. 添加RTSP重连机制(推荐)
    因为你用的是RTSP流,很容易出现连接断开的情况,可以在读取失败时尝试重新初始化视频捕获对象:

    while(True):
        try:
            ret, frame = video.read()
            if not ret:
                print("Lost RTSP connection, trying to reconnect...")
                # 释放旧的连接
                video.release()
                # 重新初始化VideoCapture
                video = cv2.VideoCapture('rtsp://10.10.10.10/h264.sdp?res=half&x0=0&y0=0&x1=1920&y1=1080&qp=20&ratelimit=10000&doublescan=0&ssn=16026')
                # 重新设置分辨率
                video.set(3, 1280)
                video.set(4, 720)
                continue
            
            # 后续处理代码不变
            # ...
    
  3. 额外验证模型输入的有效性
    为了保险起见,可以在把帧喂给模型前,再检查一下frame_expanded是否有效:

    frame_expanded = np.expand_dims(frame, axis=0)
    # 检查是否存在空值或无效数据
    if frame_expanded is None or np.all(frame_expanded == 0):
        print("Invalid frame data, skipping detection...")
        continue
    
    # 再执行模型推理
    (boxes, scores, classes, num) = sess.run(...)
    

额外调试小技巧

  • 可以在读取失败时打印当前时间,方便排查是偶尔卡顿还是持续断开:print(f"[{datetime.datetime.now()}] Failed to read frame")(记得先导入datetime模块)
  • 如果修改后还是偶尔报错,可以在except块里打印更多错误详情,比如import traceback; traceback.print_exc(),这样能看到错误具体出在哪一行。

按照上面的方法修改后,应该就能解决这个NoneType转int的错误啦~

内容的提问来源于stack exchange,提问作者Anario

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:11:17