2017-01-08 26 views
0

Я написал сценарий, который разбивает видеофайл на фреймы с использованием cv2 и некоторых других модулей. До сих пор я был счастлив вставлять файлы в файлы и запускать код, но теперь я хочу, чтобы пользователь вводил пути и имена файлов в ответ на приглашение. Это должно быть легко, но у меня много проблем, чтобы работать с os.path. Основная проблема заключается в том, что я хочу, чтобы имя каждого файла изображения (например, фрейм) содержало в нем число, которое показывает, где оно входит в последовательность. Приведенный ниже код является то, что у меня есть:Форматирование файловых путей с использованием переменных в os.path

filepath = input('Please enter the filepath for the clip: ') 

clip = cv2.VideoCapture(filepath) 

#### This code splits the clip into scenes 

filepath1 = input('Please enter the filepath for where the frames should be saved: ') 

name = input('Please enter the name of the clip: ') 

ret, frame = clip.read() 
count = 0 
ret == True 
while ret: 
    ret, frame = clip.read() 
    cv2.imwrite((os.path.join(filepath1,name, '(%d)','.png') % count, frame)) 
    count += 1 

Однако производит следующее сообщение об ошибке:

cv2.imwrite((os.path.join(filepath1,name, '(%d)','.png') % count, frame)) 
    TypeError: Required argument 'img' (pos 2) not found 

В том числе % count, frame переменных в скобках в команде os.path.join дает другую ошибку:

TypeError: not all arguments converted during string formatting 

Что он должен сделать, это написать несколько .png файлов, называемых name(x) на месте, как MYcomputer/mydesktop/myfolder/. Я не уверен, что здесь не так - любая помощь ценится!

ответ

2

Ваше размещение скобка, а также использование join неправильно Это

cv2.imwrite((os.path.join(filepath1,name, '(%d)','.png') % count, frame)) 

следует исправить следующим образом:

cv2.imwrite(os.path.join(filepath1, name+'(%d).png'%count), frame) 

Для дальнейшего улучшения кода я хотел бы предложить

fname = "{name}({count}).png".format(name=name, count=count) 
cv2.imwrite(os.path.join(filepath1, fname), frame) 

Здесь краткое описание os.path.join: Это конка записывает все аргументы с разделителем пути вашей ОС («/» в Unix-based и «\» в Windows). В результате ваш исходный код приведет к следующей строке:

filepath1 = "some_dir" 
name = "some_name" 
count = 10 
print(os.path.join(filepath1, name, '(%d)' % count,'.png')) 
>>> "some_dir/some_name/10/.png" 
+0

Спасибо, что расчистили это для меня! Тем не менее, теперь я получаю другую ошибку: 'cv2.imwrite ((os.path.join (filepath1, name + '(% d) .png'% count), frame)) ТипError: Требуемый аргумент 'img '(поз. 2) не найдено' Любые мысли по этому поводу? – Lodore66

+0

Как я уже сказал, проверьте ваше «(» и «)» место;) imwrite нуждается в 1-м аргументе путь к файлу, а затем изображение. вы передаете кортеж с файловым путем и изображением. Таким образом, двойной - "(" и - ")" слишком много. – BloodyD

+0

Ах да, я вижу <кашель смущенно>. Спасибо миллион, за исправление и образование! Прекрасно работает – Lodore66