【问题标题】:Calculate size of an object inside a picture计算图片内对象的大小
【发布时间】:2017-07-19 11:26:17
【问题描述】:

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

当照片在面板前拍摄时,我的程序运行良好,我得到 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);

}

现在我正在尝试做完全相同的事情,但是当照片不是在面板前拍摄时,就像这样: 你可以用这张图片试试同样的代码here

使用这张图片,我的工作表尺寸为 0.405*0.254,虽然不算远,但还不够好。我想要更准确的东西,但我不知道该怎么做,我想我可能需要考虑更多的参数,但我对摄影不太了解,我有点迷路了。

任何帮助将不胜感激:)

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

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

【问题讨论】:

    标签: javascript jquery html image image-processing


    【解决方案1】:

    你必须找到你视角的vanishing points,并用它来计算平行线的cross-ratio。详情请见this question


    正如答案中所说,您的第一个示例有效,因为:

    如果给定线的消失点在无穷远处,例如水平 图片中的线条,那么它们只会受到仿射 变换,因此这些线上的长度比由 透视投影。

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

    假设您有一个坐标系,原点为 O(面板的一侧)和轴 x(与 O 的消失点方向相反)。 A 是消失点,B 是面板的另一侧,C 和 D 是 x 轴与板材的交点。

    交叉比率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

    你必须在另一个方向上做同样的事情,沿着蓝线。

    如果您的工作表未与面板方向对齐,您只需计算面板轴定义的坐标系中每个角的坐标。原理还是一样的。

    【讨论】:

    • 这正是我所需要的,非常感谢一切!
    • 其实我有一点关于消失点的问题。我是采用工作表的边框还是面板的边框来获得消失点?我认为这是工作表的边框,但我不太确定:/
    • 你需要拿你的参考的边框,所以面板的边框。在这种情况下,纸张和面板对齐,这就是我们可以做 CD=OD-OC 的原因。但在更一般的情况下,您必须在面板参考系中找到板材每个角的坐标 (x,y),然后计算角之间的距离。
    • 我更正了我的代码,现在更好了,当我使用在面板前面拍摄的照片时,我的尺寸正确(jsfiddle.net/darzang/4nav5a5o)从侧面拍摄的图像(你为了解释计算)但是当我尝试使用另一张图像时,我得到了一些奇怪的东西。 (jsfiddle.net/darzang/4nav5a5o/1) 如果我尝试在面板顶部获取 A3 纸的尺寸,我会得到很好的宽度,但不是很好的高度,当我尝试使用右侧的 A4 纸时,我会得到相反的结果(高度好但宽度不好)。
    • 这里是图片的直接链接,因为它们在 jsfiddle 中真的很糟糕:hostingpics.net/viewer.php?id=801464photodeface.jpghostingpics.net/viewer.php?id=815557test2.jpg
    猜你喜欢
    • 2020-11-20
    • 1970-01-01
    • 1970-01-01
    • 2011-05-25
    • 2015-02-26
    • 2022-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多