FileNotFoundError: [Errno 2] Нет такого файла или каталога: 'frame0.png', но на самом деле имеет - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть проблема, аналогичная многим постам о проблеме пути, но я не могу найти решение, чтобы решить мою проблему

Итак, во-первых, у меня есть функция, в которой я создаю каталог, в котором будут храниться все извлеченные кадры извидео

def extract_frame(video,folder):

    os.mkdir(folder)
    vidcap = cv2.VideoCapture(video)
    success,image = vidcap.read()
    fps = vidcap.get(cv2.CAP_PROP_FPS)
    count = 0
    success = True
    while success:  #os.path.join(pathOut,(name+'.png'))
      cv2.imwrite(os.path.join(folder,"frame%d.png" % count), image)         
      success,image = vidcap.read()
      print('Read a new frame: ', success) 
      count += 1

, которое работает довольно хорошо, и я хочу, чтобы весь кадр обрабатывался, поэтому я написал

def rm_green(pathOut):   

    for f in os.listdir(pathOut):   
        if f[-3:] == "png":         
            name, ext = os.path.splitext(f)
            im = Image.open(f)
            im = im.convert('RGBA')
            .
            .
            . ## and some other line of code blah blah

, затем я наконец вызываю функцию:

extract_frame('vid.mp4', 'test1')
pathIn='./test1/'
rm_green(pathIn)

Отсюда хорошо работает функция extract_frame (), которая создает папку с именем 'test1' и в ней есть все фреймы.Но есть ошибка

File "C:\Users\DELL\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py", line 705, in runfile
execfile(filename, namespace)

File "C:\Users\DELL\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py", line 102, in execfile
exec(compile(f.read(), filename, 'exec'), namespace)

File "C:/Users/DELL/Desktop/Senior/video/bg/use this/extract-remove-green-combinevid.py", line 113, in <module>
rm_green(pathIn)

File "C:/Users/DELL/Desktop/Senior/video/bg/use this/extract-remove-green-combinevid.py", line 61, in rm_green
im = Image.open(f)

FileNotFoundError: [Errno 2] No such file or directory: 'frame0.png'

, которую я не знаю, почему это происходит, поскольку в папке test1 есть фреймы.Что-то не так в том, как я написал путь?Как это может произойти, так как он читает «frame0.png», который находится в папке test1?Или эта ошибка связана с Image.open (f) из библиотеки PIL?

Спасибо

РЕДАКТИРОВАТЬ: os.listdir() Код из файла py с именем extract-remove-green .. >> Правильно ли работает этот os.listdir ()?

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Вот подсказка, как получить полный путь к каталогу файла:

import path
script_dir = path.dirname(path.abspath(__file__))

Затем вы можете использовать объединение или конкатенацию, чтобы получить полный путь к вашему файлу или подкаталогу:

file_path = script_dir.join("\\the_name_of_file_or_directory") 
# file_path  = script_dir + "\\the_name_of_file_or_directory"
0 голосов
/ 20 сентября 2018

Я вижу, что вы пытаетесь использовать f непосредственно из переменной цикла.Но это будет просто имя файла, а не путь к файлу.Возможно, вам придется сделать os.abspath(f), чтобы получить полный путь к вашему файлу, а затем выполнить необходимую операцию над ним.

for f in os.listdir(pathOut):
    file_path = os.path.abspath(os.path.join(pathOut, f))
    if f[-3:] == "png":         
        name, ext = os.path.splitext(f)
        im = Image.open(file_path)
        im = im.convert('RGBA')

Надеюсь, это вам поможет.Спасибо.

...