通过bash在SIFT上的“匹配”中循环连接4个以上的字符串

时间:2013-03-26 11:35:35

标签: string bash loops concatenation sift

片刻之前,我查找了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
是的,请帮帮我吗? ^^

如果我的英语不好,我很抱歉..

3 个答案:

答案 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