如何使用LPSolve进行2D图像拼接

时间:2014-05-23 17:42:54

标签: linear-programming image-stitching lpsolve

我是LPSolve和工具包的新手。我尝试使用LPSolve IDE缝合4张图像1024x1024图块。为了简化任务,我只使用了瓷砖的x坐标。

    -------------------------------
   | Tile1         |Tile2          |
   |               |               |
   |               |               |
   |               |               |
   --------------------------------
   | Tile3         | Tile4         |
   |               |               |
   |               |               |
   |               |               |
   --------------------------------

如果我按以下方式定义关系

   min: +d1 +d3 +d4 +d6;

   -x1 +x2 -1024 +d1 <=0.1;
   -x1 +x2 -1024 +d1 >=-0.1;
   -x1 +x3 +1    +d2 <=0.1;
   -x1 +x3 +1    +d2 >=-0.1;
   -x2 +x4       +d3 <=0.1;
   -x2 +x4       +d3 >=-0.1;
   -x3 +x4 -1024 +d4 <=0.1;
   -x3 +x4 -1024 +d4 >=-0.1;
   x1=1024;
   x2=2048;
   x3=1023;
   x4=2047;

LPSolve产生正确的结果

   d1=0
   d2=0
   d3=0.900000000000091
   d4=0
   x1=1024
   x2=2048
   x3=1023
   x4=2047

如果我将模型更改为以下内容,即将Tile4移动一个像素

   min: +d1 +d2 +d3 +d4;

   -x1 +x2 -1024 +d1 <=0.1;
   -x1 +x2 -1024 +d1 >=-0.1;
   -x1 +x3 +1    +d2 <=0.1;
   -x1 +x3 +1    +d2 >=-0.1;
   -x2 +x4       +d3 <=0.1;
   -x2 +x4       +d3 >=-0.1;
   -x3 +x4 -1024 +1 +d4 <=0.1;
   -x3 +x4 -1024 +1 +d4 >=-0.1;
   x1=1024;
   x2=2048;
   x3=1023;
   x4=2047;

LPSolve响应&#34;模型是不可能的&#34;,而我认为响应应该是

 d1=1
   d2=0
   d3=0.900000000000091
   d4=1

我做错了什么?

1 个答案:

答案 0 :(得分:0)

您正在遇到扩展问题。 lpsolve有很多。

如果你做了一个小小的改动,你可以自己看看: 我在最后两个约束中替换了x3和x4的值:

 min: +d1 +d3 +d4 +d2;

   -x1 +x2 - 1024 +d1 <=0.1;
   -x1 +x2 - 1024 +d1 >=-0.1;
   -x1 +x3 +1    +d2 <=0.1;
   -x1 +x3 +1    +d2 >=-0.1;
   -x2 +x4      +d3 <=0.1;
   -x2 +x4       +d3 >=-0.1;
   -1023 + 2047  -1024 + 1 + d4 <= 0.1;
   -1023 +  x4   -1024 + 1 + d4 >=-0.1;
   x1=1024;
   x2=2048;
   x3=1023;
   x4=2047;

您收到此警告/错误:

initialize_solution: Invalid rebounding; variable 10 at refact 0, iter 0
check_solution: Variable   d4 =                  0 is above its upper bound               -0.9

Seriously low accuracy found ||*|| = 0.9 (rel. error 0.473684)
lp_solve failed

然而,当我尝试替代自己时:

 min: +d1 +d3 +d4 +d2;

   -x1 +x2 - 1024 +d1 <=0.1;
   -x1 +x2 - 1024 +d1 >=-0.1;
   -x1 +x3 +1    +d2 <=0.1;
   -x1 +x3 +1    +d2 >=-0.1;
   -x2 +x4      +d3 <=0.1;
   -x2 +x4       +d3 >=-0.1;
//   -1023 + 2047  -1024 + 1 + d4 <= 0.1;
//   -1023 +  x4   -1024 + 1 + d4 >=-0.1;
  d4 <= 0.1;
  d4 >-0.1;
   x1=1024;
   x2=2048;
   x3=1023;
   x4=2047;

我们得到了解决方案并且没有不可行性:

Actual values of the variables:
d1                              0
d3                            0.9
d4                           -0.1
d2                              0
x1                           1024
x2                           2048
x3                           1023
x4                           2047

This link告诉你发生了什么。

从最后一行引用:

  

结论。你应该总是做一些缩放。它开始的时候   你设计模型。额外的缩放可以由其中一个完成   lp_solve的缩放选项。

希望有所帮助。