计算图片内对象的大小

时间:2017-02-28 13:10:27

标签: javascript jquery html image image-processing

我正在尝试计算贴在我知道尺寸的面板上的纸张的实际尺寸。这是一个小例子: enter image description here

当在面板前拍摄照片时,我的程序工作正常,我得到0.416 * 0.294,而我的纸张的实际尺寸是0.420 * 0.297,这是非常令人满意的。您可以尝试我的代码here。 以下是我为计算所做的功能

window.calculer = function(){


//-------------Calcul de X ---------------------------------------------------------------------------


ag_distance_x_metres=0.9;


ag_delta_x=x2-x1;                                                                       // Calcul des ag_delta_x et ag_delta_y 
ag_delta_y=y2-y1;


ag_distance_x_pixels=Math.sqrt(Math.pow(ag_delta_x, 2) + Math.pow(ag_delta_y, 2));      // Calcul de la distance x en pixels


ag_rapport_x = ag_distance_x_pixels/ag_distance_x_metres;                               // Calcul du rapport taille pixel / taille mètres 


ag_delta_X = x5-x4;                                                                     // Calcul des ag_delta_X et ag_delta_Y 
ag_delta_Y = y5-y4;


ag_distance_X_pixels=Math.sqrt(Math.pow(ag_delta_X, 2) + Math.pow(ag_delta_Y, 2));      // Calcul de la distance X en pixels


ag_distance_X_metres=ag_distance_X_pixels/ag_rapport_x;                                 // Calcul de la distance X en mètres
alert("ag_distance_X_metres = "+ ag_distance_X_metres);


//-------------Calcul de Y -----------------------------------------------------------------------------

ag_distance_y_metres=1.20;


ag_delta_x=x3-x2;                                                                       // Calcul des ag_delta_x et ag_delta_y 
ag_delta_y=y3-y2;


ag_distance_y_pixels=Math.sqrt(Math.pow(ag_delta_x, 2) + Math.pow(ag_delta_y, 2));      // Calcul de la distance y en pixels



ag_rapport_y = ag_distance_y_pixels/ag_distance_y_metres;                               // Calcul du rapport taille pixel / taille mètres 



ag_delta_X = x6-x5;                                                                     // Calcul des ag_delta_X et ag_delta_Y 
ag_delta_Y = y6-y5;


ag_distance_Y_pixels=Math.sqrt(Math.pow(ag_delta_X, 2) + Math.pow(ag_delta_Y, 2));      // Calcul de la distance Y en pixels


ag_distance_Y_metres=ag_distance_Y_pixels/ag_rapport_y;                                 // Calcul de la distance Y en mètres
alert("ag_distance_Y_metres = "+ ag_distance_Y_metres);

}

现在我正在尝试做同样的事情,但是如果没有在面板前面拍摄照片,就像这样: enter image description here 您可以使用此图片here

尝试相同的代码

对于这张图片,我的纸张尺寸得到0.405 * 0.254,这不是那么远,但还不够好。我想要有更准确的东西,但我不知道怎么做,我想我可能需要考虑更多的参数,但我对摄影并不是很了解,我在这里丢失了。

非常感谢任何帮助:)

修改:由于没有任何答案,我在谷歌搜索没有成功,我开始认为我没有足够的数据来进行这样的计算。 现在如果:

  • 我有焦距和传感器尺寸
  • 我的相机与点1,2和3之间的距离
  • 我有两个

1 个答案:

答案 0 :(得分:2)

您必须找到视角的vanishing points,并使用它来计算平行线的cross-ratio。有关详细信息,请参阅this question

正如在答案中所说,你的第一个例子是有效的,因为:

  

如果给定线的消失点处于无穷远处,就像水平线一样   你的图片中的线条,然后它们只受到仿射   变换,因此这些线上的长度比率保留   透视投影。

对于第二个示例,您必须使用答案中给出的方法。

让我们考虑你有一个坐标系,原点为O(面板的一侧)和轴x(与O的消失点方向的倒数)。 A是消失点B,面板的另一侧,C和D是轴x与薄片的交点。 Coordinate system

交叉比例CR(A,O;B,C)((A-B)/(A-C))/((O-B)/(O-C)) = 0.189 A = -317px(已调整大小的图片中距离O到A的距离),B = 166C = 22D = 92.
因此,既然您知道OB = 90cm,那么您就有OC = 0.189 * 90 = 17 cm 对于OD, CR(A,O;B,D) = 0.654,您有OD = 0.654 * 90 = 58.9 因此,CD = OD - OC = 41.9 cm

你必须按照蓝线对另一个方向做同样的事情。

如果工作表未与面板方向对齐,则只需计算由面板轴定义的坐标系中每个角的坐标。原则保持不变。