计算图片中物体的大小

5
我想要计算一张粘贴在面板上的纸张的真实尺寸,我已知道面板的尺寸。以下是一个小例子:enter image description here
当图片正对着面板时,我的程序可以很好地工作,我得到了0.416 * 0.294的结果,而我的纸张的真实尺寸是0.420 * 0.297,这非常令人满意。您可以在此处尝试我的代码。 下面是我用于计算的函数。
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。 您可以使用此图像此处尝试相同的代码。
对于这张图片,我的板材尺寸为0.405*0.254,这还不错,但并不够精确。我想要更准确的结果,但我不知道该如何做到,我认为我可能需要考虑更多参数,但我对摄影不是很了解,所以有些迷茫。
任何帮助都将不胜感激:)
编辑:由于没有答案,并且我在Google上没有找到成功的答案,我开始觉得我没有足够的数据来进行这样的计算。那现在如果:
- 我有焦距和传感器尺寸 - 我有相机和点1,2和3之间的距离 - 我两者都有
您能否帮忙呢?
1个回答

3
你需要找到你透视图的消失点,并用它来计算平行线的交叉比率。更多细节请参见这个问题
如答案中所说,你的第一个例子之所以有效是因为:
如果给定线的消失点在无穷远处,例如你图片中的水平线,则它们仅受仿射变换的影响,因此这些线上的长度比保持透视投影不变。
对于你的第二个例子,你需要使用答案中提供的方法。
让我们考虑你有一个坐标系,原点为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

你需要按照蓝线的方向做同样的事情。

如果你的纸张没有与面板方向对齐,那么你只需要计算每个角落在由面板轴定义的坐标系中的坐标。原理仍然是相同的。


这正是我所需要的,非常感谢你的一切! - darzang
其实,我有一个关于消失点的小问题。我应该取纸张的边界还是我的面板的边界来获取消失点?我认为应该是纸张的边界,但我不太确定:/ - darzang
你需要考虑参考物的边界,也就是面板的边界。在这种情况下,纸张和面板是对齐的,所以我们可以计算CD=OD-OC。但在更一般的情况下,你需要找到纸张每个角落在面板参考系中的坐标(x,y),然后计算角落之间的距离。 - Gwen
我已经纠正了我的代码,现在它更好了。当我使用我在面板前拍摄的照片(https://jsfiddle.net/darzang/4nav5a5o/)以及从侧面拍摄的图像(您为了解释计算而拍摄的那个)时,我有了正确的尺寸。但是当我尝试使用另一张图片时,我得到了一些奇怪的东西。(https://jsfiddle.net/darzang/4nav5a5o/1/)如果我尝试获取放置在面板顶部的A3纸张的尺寸,我可以得到正确的宽度,但高度不对,而当我尝试使用放置在右侧的A4纸张时,情况相反(高度正确但宽度错误)。 - darzang
这是图片的直接链接,因为在 jsfiddle 中它们看起来非常糟糕: http://www.hostingpics.net/viewer.php?id=801464photodeface.jpg http://www.hostingpics.net/viewer.php?id=815557test2.jpg - darzang
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接