Приложете Linux изпълним файл върху множество аргументи

Имам изпълним „сегмент“ за Linux, който приема изображение като вход inputImage.ppm, сегментира го на суперпиксели и изходът е друго изображение outputImage.pnm.

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

Опитах това:

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

Където първите три аргумента (0.8,100,100) са параметри.

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


person Arabasta    schedule 18.03.2015    source източник
comment
Казвате, Опитах това, но не посочих дали това работи или не и как се е провалило, ако е така. Сам ли си написал segment или се дава? И ако не, имате ли страница с ръководство за това, за да знаете какви аргументи може да приеме? От въпроса ви не става ясно дали дори приема множество файлови аргументи или какви други аргументи приема.   -  person lurker    schedule 18.03.2015
comment
ми беше предоставен сегмент, когато го приложа върху едно изображение, той работи добре и получавам изходното изображение. Но когато се опитам да приложа това, което споменах във въпроса си, към група изображения в папка с име image0, ... image399, използвайки начина, който описах по-горе, получавам следната грешка: зареждане на входно изображение. terminate, извикан след хвърляне на екземпляр на 'pnm_error' Прекратено (ядрото е изхвърлено)   -  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

Искате да кажете, че искате да напишете makefile, за да направите това? Примерът, който давате по-горе, трябва ли да бъде makefile?

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
Предполагам, че OP просто е поставил грешен етикет makefile, тъй като той не споменава makefiles другаде - person marek.jancuska; 18.03.2015
comment
Не, не е makefile, имам изпълним файл, който получавам, след като компилирам C++ проект (не е написан от мен), така че получавам изпълнимия сегмент, който мога да го приложа върху едно изображение, например image0.ppm, за да получа изходното изображение0 .pnm..... Просто търся начин, по който мога да го приложа към група изображения вместо това, от терминала, по начин, подобен на начина, по който опитах, който е включен във въпроса ми по-горе. - person Arabasta; 18.03.2015
comment
Е, един от начините е да напишете makefile. Този, който предоставих, ще направи това, което искате. Ако не искате да направите това, тогава ще трябва да напишете цикъл на скрипт на обвивката. - person MadScientist; 18.03.2015
comment
Предимството (?) на makefile пред shell скрипт е, че ако актуализирате само няколко от PPM файловете, можете да стартирате отново make и той ще преобразува само тези модифицирани файлове в PNM файлове, така че да не трябва да преобразувате всички тях, както би направил цикълът for-shell. Но може би не ги променяте поотделно. - person MadScientist; 18.03.2015