片刻之前,我查找了SIFT算法来处理我的图像..
如果您使用http://www.cs.ubc.ca/~lowe/keypoints/中的SIFT,则会有一个名为“match”的可执行文件,以获取一个到另一个图像的相关性。
这是一个例子..
./match -im1 book.pgm -k1 book.key -im2 scene.pgm -k2 scene.key > out.pgm
所以..
我意识到我需要使用bash脚本来加速我的进程..即使默认的“匹配”只接受了2张图像和2张与该图像相关的密钥,关联两个以上的图像..然后..
这是我的代码..
i = 1
s = ""
for item in *.key
do
s += "-im$((i)) ${item%.*}.pgm -k$((i++)) $item"
done
./match s > out.pgm
现在的情景,
基于我的代码,
如果我在第6行使用echo
echo "-im$((i)) ${item%.*}.pgm -k$((i++)) $item"
并评论了最后一行
#! ./match s > out.pgm
然后我得到了我想要的清单..
但..
如果我完全运行我的代码{基于我评论的答案}我的终端窗口中存在一个问题
Error: Invalid command line argument: -im3
是的,请帮帮我吗?
^^
如果我的英语不好,我很抱歉..
答案 0 :(得分:2)
变量赋值中不允许使用空格,因此:
i=1
s=
for item in *.key
do
s+="-im$i ${item%.*}.pgm -k$((i++)) $item"
done
./match "$s" > out.pgm
答案 1 :(得分:2)
如果任何*.key
文件的任何名称包含空格,则在单个字符串中累积命令选项的方法将失败。在bash
中,最好使用数组。
i=1
s=()
for item in *.key
do
s+=( "-im$i" "${item%.*}.pgm" "-k$i" "$item" )
((i++))
done
./match "${s[@]}" > out.pgm
答案 2 :(得分:0)
检查第32行到52之前的文件match.c中的“匹配”代码
/* Parse command line arguments and read given files. The command line must specify two input images and two files of keypoints using command line arguments as follows: match -im1 i1.pgm -k1 k1.key -im2 i2.pgm -k2 k2.key > result.v */ while (++arg < argc) { if (! strcmp(argv[arg], "-im1")) im1 = ReadPGMFile(argv[++arg]); else if (! strcmp(argv[arg], "-im2")) im2 = ReadPGMFile(argv[++arg]); else if (! strcmp(argv[arg], "-k1")) k1 = ReadKeyFile(argv[++arg]); else if (! strcmp(argv[arg], "-k2")) k2 = ReadKeyFile(argv[++arg]); else FatalError("Invalid command line argument: %s", argv[arg]); } if (im1 == NULL || im2 == NULL || k1 == NULL || k2 == NULL) FatalError("Command line does not specify all images and keys."); FindMatches(im1, k1, im2, k2); exit(0);
在http://www.cs.ubc.ca/~lowe/keypoints/siftDemoV4.zip
我应该在代码中添加一些变量或者使用集合来补充所有变量..因为我的真实代码是用Java实现的。(^^)9
无论如何..感谢bash脚本的回答..所有答案都很有用..(^^)v