lyjiang1 2019-04-29 15:40 采纳率: 0%
浏览 274

读avi的时候出现video_read未定义错误,请专家指导!

本人在Ubuntu 16.04版本下,用Anaconda 学习,编写以下代码一直出错,请大家帮我看看,十分感谢!

#!/path/to/python2.7.15/python 
from skimage import data_dir,io,color,transform,util
import numpy as np
global video_read

class AVILoader:
    video_file = '/home/wljiang/2.avi'

    def __call__(self, frame):
        #return io.imread(self.video_file, frame)
        return video_read(self.video_file, frame)

avi_load = AVILoader()

frames = range(0, 100, 10) # 0, 10, 20, ...
ic =io.ImageCollection(frames, load_func=avi_load)


for i in range(len(ic)):
   io.imsave('/home/wljiang/avijpg/'+np.str(i)+'.jpg',ic[i])  
运行中出现错误,提示如下:
    ---------------------------------------------------------------------------

NameError Traceback (most recent call last)
in ()
19 #print(len(ic))
20 for i in range(len(ic)):
---> 21 io.imsave('/home/wljiang/avijpg/'+np.str(i)+'.jpg',ic[i])
22

/home/wljiang/anaconda2/lib/python2.7/site-packages/skimage/io/collection.pyc in getitem(self, n)
266 raise
267 else:
--> 268 self.data[idx] = self.load_func(self.files[n], **kwargs)
269 self._cached = n
270

in call(self, frame)
10 def call(self, frame):
11 #return io.imread(self.video_file, frame)
---> 12 return video_read(self.video_file, frame)
13
14 avi_load = AVILoader()

NameError: global name 'video_read' is not defined

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-09 05:48
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    这段代码的目的是从一个视频文件(avi)中加载帧,并将其保存到图像文件。但是,在运行时出现了NameError: global name 'video_read' is not defined错误。

    这个错误表明在尝试使用video_read之前,您没有为它分配一个全局变量。这意味着video_read在函数AVILoader的内部被声明了,但在外部调用时却找不到它。要解决这个问题,您可以将video_read作为一个全局变量来初始化,并在整个程序中使用它。

    以下是修改后的代码:

    #!/path/to/python2.7.15/python 
    from skimage import data_dir,io,color,transform,util
    import numpy as np
    global video_read
    
    class AVILoader:
        video_file = '/home/wljiang/2.avi'
    
        def __init__(self):
            self.video_read = lambda x, y: io.imread(self.video_file, y)
    
        def __call__(self, frame):
            #return io.imread(self.video_file, frame)
            return self.video_read(frame, 0)
    
    avi_load = AVILoader()
    
    frames = range(0, 100, 10) # 0, 10, 20, ...
    ic =io.ImageCollection(frames, load_func=avi_load)
    
    
    for i in range(len(ic)):
       io.imsave('/home/wljiang/avijpg/'+np.str(i)+'.jpg',ic[i])
    

    在这个版本的代码中,我们创建了一个名为AVILoader的新类,其中包含两个方法:__init__用于初始化video_read并设置其行为,以及__call__用于实际从视频文件中获取帧。这样,即使在外部调用avi_load时,video_read也已经有了正确的上下文,因此可以正常工作。

    评论

报告相同问题?