如何单从照片里判断一个人的身高?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何单从照片里判断一个人的身高?相关的知识,希望对你有一定的参考价值。

利用其他景物的大小算出照片与真实场景的比例
然后可以算出来
但是因为角度等因素的不同
算出来肯定有误差

陌上人如玉,公子世无双。
宗之潇洒美少年,举觞白眼望青天,皎如玉树临风前。

看拍照角度,如果镜头朝上,可以把人拉高,如果镜头朝下,会把人拍矮,所以尽可能利用人物身边的东西作参照物,对比一下即可。

找个附近的参照物

如何单从照片里判断一个人的身高? -
。。。^_^ 当然是根据 照片中其他物体的高度来计算了.如果是白背景那就惨了…… 如果是全身照,可以看看他的全身长是头部的长度的几倍.不论人的升高差异多大,脑袋的差异都不会太大,你可以取一个头部长度的平均值来计算他的全身高度.例如模特一般都是9头身,就是用头的长度x9=身高 一般侏儒就是5头身.身高是 头的长度x5 我想这个方法应该可以算个大概出来.

从照片里可以算出一个人的身高吗? -
。。。^_^ 对啊 利用其他景物的大小算出照片与真实场景的比例 然后可以算出来 但是因为角度等因素的不同 算出来肯定有误差

手机拍的照片能看出一个人的身高吗? -
。。。^_^ 我个人认为,用手机拍照片可以看出人的身高.但要看拍照的时候,他是否附近有参照物,如果拍照的时候拍拍到他附近的参照物,就能大概的估计到是个人的身高.如果在给这个人拍照的时候附近一点参照物都没有的话,是很难估计这个人身高的.

怎样从一张照片中辨别一个女孩的身高?我没有见过这女孩,只看过照片,不知道如何知道她的身高? -
。。。^_^ 一般在照片里面不怎么能看出身高,如果照片里面有什么参照物的话,可以对照一下能推出身高.

看照片能看出一个人身高吗? -
。。。^_^ 用背景和人对此一下……能看出个大概!但前提是不要PS过的……这样才真实.

怎么凭相片判断一个人的身高 -
。。。^_^ 根据参照物和人体比例可以近似估计 但误差很大

有谁可以从照片看出一个人的身高,有的联系我,我给照片,别瞎猜,要有得出的过程和依据
。。。^_^ 照片上要有参照物才行,比如树,栏杆等,单单一张脸是无法看出来的.

可以从照片上推断出一个人的身高吗?七寸照片怎么算比例? -
。。。^_^ 除非在这个人的旁边有参照的物体,否则算不出来,如果没有参照物是数码的PS后就根本算不出来了.比如同一张照片PS一下,这个身高比例是不是就变了.

从照片能看出我有身高有多高吗 -
。。。^_^ 一米五左右吧

看照片怎么能看出一个人有多高 -
。。。^_^ 要有全身图,然后看有几头身,一个头基本都是20多厘米,大概就可以算出身高了
参考技术A 视觉是感知世界最重要的手段,但仅凭视觉方法就想准确地测定现实中的目标尺寸,往往需要复杂的标定或传感器配置才能完成。如果能够通过单张图片直接测出目标的尺度,就能大大拓展视觉的应用范围、便捷地测量三维世界了。

近日,加州大学圣迭戈分校和Adobe的研究人员提出了一种基于单目视觉的测量方法,它可通过测量照片内目标的高度、相机的高度和视角朝向参数来恢复出场景及目标的绝对尺度,这项技术可以在非受限的环境中利用单目视觉精确实现。

最懂你的交友平台,一秒匹配和你最契合的人

最懂你的交友平台,一秒匹配和你最契合的人
基于单目视觉的度量方法,主要依赖于数据驱动的深度学习网络。通过充分利用车辆、行人等常见目标的尺度作为先验信息作为参考,单目视觉度量方法构建了一套基于重投影的优化模型,实现了精确的目标高度、相机高度、朝向和焦距的估计。

上图显示了尺度估计的处理流程,在图像输入后,单目视觉度量方法可以重建场景和相机参数 (这些参数与全局尺度相关),随后通过精确估计3D相机参数和目标高度的绝对尺度来实现对真实场景的精确测量。

三维尺度重建

从图像中重建场景的三维形貌是计算机视觉领域的基础问题。尽管近年来实现了巨大发展,但多数基于图像进行场景重建的方法缺乏准确的尺度信息,包括非标定下的SFM、单目深度估计、单目视觉标定等任务中都存在这些问题。这一尺度信息的缺失来源于成像过程中的透视变换,解决这一问题需要额外的信息,比如目标在图像中的尺度。

图像中的尺度测量问题,主要研究了在非受限条件下如何利用图像计算出物体的尺寸,通过估计绝对尺寸来实现几何标定,包括恢复相机的朝向 (图像中的水平面)、视场、相机与地面的绝对高度。有了这些信息,就能将图像中的二维测量转换为真实空间中的三维测量了。

这一工作的目标主要在于,利用深度学习网络建立起稳定、鲁棒、自动化的单目视觉度量方法,可以广泛应用到多种场景的图像测量中去。实现这一目标最直接的方法就是,通过监督学习的方法,利用已知相机参数的大规模数据集直接从图像中估计出场景的尺度。

但目前还缺乏如此大规模的包含相机参数标注的数据集,只能通过间接利用2D标注数据来实现,并创造性地选择了最普遍的人体和汽车来作为参考物体实现3D尺度推理。

在前人的基础上,研究人员拓展了模型的假设、基于弱监督的方式充分利用2D标注数据,利用端到端的方式完成了对于所有相机参数的估计,并在多个数据集上取得了非常好的效果。

基于2D标注的3D参数估计

这整套方法首先从建立完整有效的几何约束开始,基于成像过程建立了目标的高度、2D bbox尺度、相机的参数朝向和距地面的高度等变量间的约束关系。下图显示了研究中提出的成像过程。

图中显示了相机对场景的成像过程和在图像上的2D测量结果。其中pitch是相机朝向与水平面的夹角 (yaw和roll假设为0) ;v0是相机所在高度水平面在图像中的位置,vc是相机光心在图像上位置,vt和vb是目标在图像中的顶部和底部。黑色为像平面,相机焦距为f (红色) ,高度为hcam,图中目标人的高度为hobj。

根据三角形的关系,可以利用焦距、图像中心vc水平位置v0表示出pitch角度:

假设目标人站在地面上其脚部坐标为 [x,0,z]’ ,顶部坐标为 [x,hobj,z]’ ,那么将三维点投影到uv平面上就能得到下面的表达:

其中 [uc,vc] 是相机的光心坐标假设已知。从上面的公式中可以利用焦距f、pitch角、相机高度和目标高度等计算出出vt。再假设pitch角度很小,那么上面的式子可以简化为:、

基于这一公式,只要得到相机参数就可以利用图像平面上的2D bbox来辅助计算目标的真实尺度了。在这一约束的基础上,下面将要建立ScaleNet用于从图像中预测相机的三维参数。下图显示了基于参数估计和重投影误差优化的整体网络结构:

网络主要分为参数估计和重投影优化两个部分。第一部分的相机标定模块可以预测相机的视野和朝向pitch,目标估计模块可以得到目标的关键点、高度和检测bbox。得到的参数按照图中的组合再进一步放入相机高度估计模块进行处理,随后基于相机高度计算重投影误差来不断优化相机高度和目标高度的计算结果。

首先通过几何相机标定网络将同时估计出目标bbox和除相机高度外的所有相机参数,这些参数可以通过现有的数据集进行直接的监督训练。随后级联的网络用于优化相机高度,这一部分通过bbox的重投影误差进行弱监督训练。

实验中发现,预测相机的视场比直接预测焦距要容易,视场hθ可以通过下面的公式转化为焦距和中心坐标,其中him是图像的像素高度。

在这一工作中使用了Mask-RCNN的主干网络,除了前面估计相机参数外,还增加了bbox和人体关键点估计的分支 (高度与位姿紧密相关) 从ROI特征中进行预测,所以这一部分将会同时构成相机标定损失、目标检测损失和关键点估计损失。

但这些预测的结果还不足以获得绝对的尺度,场景尺度依旧无法确定。为此,研究人员利用了数据集中的先验信息来为目标建立监督。具体来讲,通过数据集中的统计信息来拟合高斯先验 (人体高度1.70±0.09m,车辆1.59±0.21m) 。针对高度为hobj的目标和先验高斯分布P,可以将损失定义为下面的形式:

在预测得到前面的相机参数和目标参数基础上就可以开始预测相机的高度了。这一模块通过相机高度与2D bbox和其他相关参数间的几何约束来进行预测。例如在下图中,两个图片中都有站着的人,但水平线都不完整。粗略一看拍摄图片的相机都有相同的朝向,但高度却大相径庭。这样的情况下直接从图像进行估计会带来较大的误差,所以模型使用了中层的特征表达 (包括目标的bbox和估计出的水平线) 来进行相机估计,输入包含了光心、bbox、检测框的偏置以及目标高度共八个参数,最后通过预测出概率分布的加权平均得到相机的高度。

相似的bbox但相机高度差异很大

在获得相机高度后还需要进行级联优化。这一部分主要基于bbox的重投影误差来进行优化。例如下图中,重投影bbox (蓝) 小于图像中原来的bbox (绿) ,这就会产生重投影误差。为此网络会减小相机的高度以减小这一误差。后续模块估计出需要调整的残差与先前预测的值相加,最终一步步优化得到重投影误差满足要求的结果。

图中显示了重投影误差优化的过程,每次优化估计出需要调整的值并计算出最后的结果。上半部分显示了相机高度优化过程,下半部分显示了人体高度的优化过程。

通过各个阶段的参数估计和优化,整体网络的损失可以写成下面的形式,其中M是优化层数。

模型结果

模型在筛选过的COCO数据集上进行了训练,并在KITTI和IMDB-23K数据集上进行了验证,下图展示本文提出模型的精度,相较于先前的PGM方法有了较大的提升
参考技术B 一般人身长在七个头到八个头,头宽十五到二十厘米。手长18-25cm。脚长35-45cm。
可以借此估计。如果照片有背景可以根据背景标志物大致大小来估计。望有帮助~
犯罪心理学的应用哦~追问

有参照物怎么算?

参考技术C 看角度,还有判断力,可以想象,或者身边的参照物等等可以大致推断出追问

可以详细的说一下吗?

追答

有照片?

拍照可以立体,斜体,正体拍摄,立体也就是拍照的人蹲着或趴着拍这样被拍的人身高就会更突出,让人看不出身高。斜体拍摄是指摄像师弯腰或者身体倾斜拍摄,这样照片上的人只能看到上半身或者测面,正体拍摄就是平时我们拿手机摆正了拍

追问

有参照物,参照物是农用喷雾器,不过参照物也在图片里面啊,怎么算哦??

追答

能把图片发我看看?

参考技术D 不能追答

不好看

2022-07-29:一共有n个人,从左到右排列,依次编号0~n-1, h[i]是第i个人的身高, v[i]是第i个人的分数, 要求从左到右选出一个子序列,在这个子序列中的人,从左到右身高是不下降的。

2022-07-29:一共有n个人,从左到右排列,依次编号0~n-1,
h[i]是第i个人的身高,
v[i]是第i个人的分数,
要求从左到右选出一个子序列,在这个子序列中的人,从左到右身高是不下降的。
返回所有符合要求的子序列中,分数最大累加和是多大。
n <= 10的5次方, 1 <= h[i] <= 10的9次方, 1 <= v[i] <= 10的9次方。
来自字节。

答案2022-07-29:

线段树。

代码用rust编写。代码如下:

use rand::Rng;
fn main() 
    let nn: i32 = 30;
    let vv: i32 = 100;
    let test_time: i32 = 20000;
    println!("测试开始");
    for _ in 0..test_time 
        let n = rand::thread_rng().gen_range(0, nn) + 1;
        let mut h = random_array(n, vv);
        let mut v = random_array(n, vv);
        if right(&mut h, &mut v) != max_sum(&mut h, &mut v) 
            println!("出错了!");
            break;
        
    
    println!("测试结束");


// 为了测试
// 绝对正确的暴力方法
fn right(h: &mut Vec<i32>, v: &mut Vec<i32>) -> i32 
    return process(h, v, 0, 0);


fn process(h: &mut Vec<i32>, v: &mut Vec<i32>, index: i32, pre_value: i32) -> i32 
    if index == h.len() as i32 
        return 0;
    
    let p1 = process(h, v, index + 1, pre_value);
    let p2 = if h[index as usize] >= pre_value 
        v[index as usize] + process(h, v, index + 1, h[index as usize])
     else 
        0
    ;
    return get_max(p1, p2);


fn get_max<T: Clone + Copy + std::cmp::PartialOrd>(a: T, b: T) -> T 
    if a > b 
        a
     else 
        b
    


// 正式方法
// 时间复杂度O(N * logN)
fn max_sum(h: &mut Vec<i32>, v: &mut Vec<i32>) -> i32 
    let n = h.len() as i32;
    let mut rank0 = h.clone();
    rank0.sort();
    let mut st = SegmentTree::new(n);
    for i in 0..n 
        let height = rank(&mut rank0, h[i as usize]);
        // 1~height max
        let t = st.max1(height);
        st.update1(height, t + v[i as usize]);
    
    return st.max1(n);


// [150, 152, 160, 175]  160
//   1    2    3    4
// 3
fn rank(rank0: &mut Vec<i32>, num: i32) -> i32 
    let mut l = 0;
    let mut r = rank0.len() as i32 - 1;
    let mut m = 0;
    let mut ans = 0;
    while l <= r 
        m = (l + r) / 2;
        if rank0[m as usize] >= num 
            ans = m;
            r = m - 1;
         else 
            l = m + 1;
        
    
    return ans + 1;


pub struct SegmentTree 
    pub n: i32,
    pub max: Vec<i32>,
    pub update: Vec<i32>,


impl SegmentTree 
    pub fn new(max_size: i32) -> Self 
        let n = max_size + 1;
        let mut max: Vec<i32> = vec![];
        let mut update: Vec<i32> = vec![];
        for _ in 0..n << 2 
            max.push(0);
            update.push(-1);
        
        Self  n, max, update 
    

    pub fn update1(&mut self, index: i32, c: i32) 
        self.update0(index, index, c, 1, self.n, 1);
    

    pub fn max1(&mut self, right: i32) -> i32 
        return self.max0(1, right, 1, self.n, 1);
    
    
    fn push_up(&mut self, rt: i32) 
        self.max[rt as usize] = get_max(
            self.max[(rt << 1) as usize],
            self.max[(rt << 1 | 1) as usize],
        );
    

    fn push_down(&mut self, rt: i32, _ln: i32, _rn: i32) 
        if self.update[rt as usize] != -1 
            self.update[(rt << 1) as usize] = self.update[rt as usize];
            self.max[(rt << 1) as usize] = self.update[rt as usize];
            self.update[(rt << 1 | 1) as usize] = self.update[rt as usize];
            self.max[(rt << 1 | 1) as usize] = self.update[rt as usize];
            self.update[rt as usize] = -1;
        
    

    fn update0(&mut self, ll: i32, rr: i32, cc: i32, l: i32, r: i32, rt: i32) 
        if ll <= l && r <= rr 
            self.max[rt as usize] = cc;
            self.update[rt as usize] = cc;
            return;
        
        let mid = (l + r) >> 1;
        self.push_down(rt, mid - l + 1, r - mid);
        if ll <= mid 
            self.update0(ll, rr, cc, l, mid, rt << 1);
        
        if rr > mid 
            self.update0(ll, rr, cc, mid + 1, r, rt << 1 | 1);
        
        self.push_up(rt);
    

    fn max0(&mut self, ll: i32, rr: i32, l: i32, r: i32, rt: i32) -> i32 
        if ll <= l && r <= rr 
            return self.max[rt as usize];
        
        let mid = (l + r) >> 1;
        self.push_down(rt, mid - l + 1, r - mid);
        let mut ans = 0;
        if ll <= mid 
            ans = get_max(ans, self.max0(ll, rr, l, mid, rt << 1));
        
        if rr > mid 
            ans = get_max(ans, self.max0(ll, rr, mid + 1, r, rt << 1 | 1));
        
        return ans;
    


// 为了测试
fn random_array(n: i32, v: i32) -> Vec<i32> 
    let mut ans: Vec<i32> = vec![];
    for _ in 0..n 
        ans.push(rand::thread_rng().gen_range(0, v) + 1);
    
    return ans;


执行结果如下:


左神java代码

以上是关于如何单从照片里判断一个人的身高?的主要内容,如果未能解决你的问题,请参考以下文章

2022-07-29:一共有n个人,从左到右排列,依次编号0~n-1, h[i]是第i个人的身高, v[i]是第i个人的分数, 要求从左到右选出一个子序列,在这个子序列中的人,从左到右身高是不下降的。

ZBH选讲·拍照

opencv怎么把一张图片上的人头框出来,(假设该图片上只有一个人)

黄晓明的个人资料

codeforces 141C Queue

spss中,如何将多个变量合并为一个变量