struct.error: для распаковки требуется строковый аргумент длиной 12
Я пытаюсь следовать руководству по Coding Robin для создания классификатора HAAR: http://coding-robin.de/2013/07/22/train-your-own-opencv-haar-classifier.html.
Я нахожусь в той части, где мне нужно объединить все файлы.vec. Я пытаюсь выполнить данный скрипт на Python и получаю следующую ошибку:
Traceback (most recent call last):
File "mergevec.py", line 170, in <module>
merge_vec_files(vec_directory, output_filename)
File "mergevec.py", line 133, in merge_vec_files
val = struct.unpack('<iihh', content[:12])
struct.error: unpack requires a string argument of length 12
Вот код из скрипта Python:
# Get the value for the first image size
prev_image_size = 0
try:
with open(files[0], 'rb') as vecfile:
content = ''.join(str(line) for line in vecfile.readlines())
val = struct.unpack('<iihh', content[:12])
prev_image_size = val[1]
except IOError as e:
print('An IO error occured while processing the file: {0}'.format(f))
exception_response(e)
# Get the total number of images
total_num_images = 0
for f in files:
try:
with open(f, 'rb') as vecfile:
content = ''.join(str(line) for line in vecfile.readlines())
val = struct.unpack('<iihh', content[:12])
num_images = val[0]
image_size = val[1]
if image_size != prev_image_size:
err_msg = """The image sizes in the .vec files differ. These values must be the same. \n The image size of file {0}: {1}\n
The image size of previous files: {0}""".format(f, image_size, prev_image_size)
sys.exit(err_msg)
total_num_images += num_images
except IOError as e:
print('An IO error occured while processing the file: {0}'.format(f))
exception_response(e)
Я пытался найти решение, но не могу найти решение, которое соответствует этой конкретной проблеме. Любая помощь будет оценена.
Спасибо!
2 ответа
Я понял это, перейдя на страницу github для учебника. Видимо, мне пришлось удалить любые vec-файлы, которые имели длину ноль.
Ваша проблема в этом:
content[:12]
Строка не обязательно должна быть длиной 12 символов; это может быть меньше. Добавьте проверку длины и обработайте ее отдельно, или try: except:
и дать пользователю более разумное сообщение об ошибке типа "Неверный ввод в файл...".