Применить исполняемый файл Linux к нескольким аргументам

У меня есть исполняемый «сегмент» Linux, который принимает изображение в качестве входного inputImage.ppm, сегментирует его на суперпиксели, а на выходе другое изображение outputImage.pnm.

Я хотел бы применить этот исполняемый файл ко всему набору изображений, который у меня есть в папке (400 изображений), как я могу это сделать?

Я пробовал это:

    ./segment 0.8 100 100 ..pathToInFolder../image%d.ppm ..pathToOutFolder../image%d.pnm

Где первые три аргумента (0,8 100 100) являются параметрами.

Кстати, изображения хранятся с именами image0, image1, ...., image399.


person Arabasta    schedule 18.03.2015    source источник
comment
Вы говорите: Я пробовал это, но не указываете, сработало это или нет, и почему это не удалось, если сработало. Вы сами написали segment или это дано? А если нет, есть ли у вас справочная страница для него, чтобы вы знали, какие аргументы он может принимать? Из вашего вопроса неясно, принимает ли он даже несколько аргументов файла или какие другие аргументы он принимает.   -  person lurker    schedule 18.03.2015
comment
сегмент был предоставлен мне, когда я применяю его к одному изображению, он отлично работает, и я получаю выходное изображение. Но когда я пытаюсь применить то, что я упомянул в своем вопросе, к группе изображений в папке с именем image0,... image399, используя способ, описанный выше, я получаю следующую ошибку: загрузка входного изображения. завершение вызывается после создания экземпляра 'pnm_error' Aborted (дамп ядра)   -  person Arabasta    schedule 18.03.2015


Ответы (3)


for i in $(seq 0 399); do
     ./segment 0.8 100 100 ..pathToInFolder../image${i}.ppm ..pathToOutFolder../image${i}.pnm
done

Обратите внимание, что ${i} вместо вашего %d. Предполагая bash и стандартные инструменты, которые должны содержать команду «seq».

person marek.jancuska    schedule 18.03.2015
comment
В этом случае лучше принять ответ, чтобы вопрос отображался как закрытый, а лучший ответ отображался первым. (Это общее правило, конечно, в данном случае это улучшает мою репутацию :)) И, возможно, ставьте лайки комментариям, которые помогли вам. - person marek.jancuska; 18.03.2015
comment
Спасибо, я здесь новичок, и я начну голосовать за другие ответы, как только получу свои первые 15 репутаций. - person Arabasta; 18.03.2015

попробуй это:

for file in /path/To/In/Folder/*
do
  /full/path/to/segment 0.8 100 100 $file /path/To/Out/Folder/$file.pnm
done
person candymanuu    schedule 18.03.2015
comment
у этого есть проблема, что $file будет /path/To/In/Folder/file1.pnm , поэтому вам нужно будет удалить путь - например, используя basename. - person marek.jancuska; 18.03.2015

Вы говорите, что хотите написать make-файл для этого? Является ли приведенный выше пример make-файлом?

PARAMS := 0.8 100 100

INPUTDIR := ..pathToInFolder..
OUTPUTDIR := ..pathToOutFolder..

INPUTS := $(wildcard $(INPUTDIR)/image*.ppm)

OUTPUTS := $(patsubst $(INPUTDIR)/image%.ppm,$(OUTPUTDIR)/image%.pnm,$(INPUTS))

.PHONY: all
all: $(OUTPUTS)

$(OUTPUTDIR)/image%.pnm : $(INPUTDIR)/image%.ppm ./segment
            ./segment $(PARAMS) $< $@
person MadScientist    schedule 18.03.2015
comment
Я предполагаю, что ОП просто поместил неправильный make-файл тега, так как он не упоминает никаких make-файлов в другом месте. - person marek.jancuska; 18.03.2015
comment
Нет, не makefile, у меня есть исполняемый файл, который я получаю после компиляции проекта C++ (не написанного мной), поэтому я получаю исполняемый сегмент, который я могу применить к одному изображению, например, image0.ppm, чтобы получить выходное изображение0 .pnm..... Я просто ищу способ применить его к группе изображений вместо этого, с терминала, аналогично тому, как я пытался, что включено в мой вопрос выше. - person Arabasta; 18.03.2015
comment
Ну, один из способов — написать make-файл. Тот, что я предоставил, будет делать то, что вы хотите. Если вы не хотите этого делать, вам придется написать цикл сценария оболочки. - person MadScientist; 18.03.2015
comment
Преимущество (?) make-файла по сравнению со сценарием оболочки заключается в том, что если вы обновите всего несколько файлов PPM, вы можете повторно запустить make, и он только повторно преобразует эти измененные файлы в файлы PNM, поэтому вы не будете нужно повторно преобразовать их все, как это сделала бы оболочка for-loop. Но, возможно, вы не изменяете их по отдельности. - person MadScientist; 18.03.2015