一般来说,我们采用针孔相机模型,也就是认为它用到的是小孔成像原理。
在相机坐标系下,一般来说,我们用到的单位长度,不是“米”这样的国际单位,而是相邻像素的长度。而焦距在相机坐标系中的大小,是在图像处理领域的一个非常重要的物理量。
假设我们已经根据相机参数,得到镜头的物理焦距大小(focal length),和相机胶片的宽度(CCD width),以及照片的横向分辨率(image width),则具体计算公式为:
Focal length in pixels = (image width in pixels) * (focal length on earth) / (CCD width on earth)
比如说对于Canon PowerShot S100, 带入公式得
Focal length in pixels = 1600 pixels * 5.4mm / 5.27mm = 1639.49 pixels
现在,请您写一段通用的程序,来求解焦距在相机坐标系中的大小。
多组测试数据。首先是一个正整数T,表示测试数据的组数。
每组测试数据占一行,分别为
镜头的物理焦距大小(focal length on earth)
相机胶片的宽度(CCD width on earth)
照片的横向分辨率大小(image width in pixels),单位为px。
之间用一个空格分隔。
每组数据输出一行,格式为“Case X: Ypx”。 X为测试数据的编号,从1开始;Y为焦距在相机坐标系中的大小(focallength in pixels),保留小数点后2位有效数字,四舍五入取整。
对于小数据:focal length on earth和CCD width on earth单位都是毫米(mm)
对于大数据:长度单位还可能为米(m), 分米(dm), 厘米(cm), 毫米(mm), 微米(um),纳米(nm)
1 2 2 5.4mm 5.27mm 1600px 3 5400um 0.00527m 1600px
Case 1: 1639.47px Case 2: 1639.47px
最近刚上手编程,本着学习的态度参加了这次的编程之美比赛,二三两题看不懂,第一题焦距做的也是波波折折,到动手的时候才发现自己欠缺的实在太多,以后应该多练手。犯了几个错误:1.单位转换弄反了; 2.之前写过一个大整数运算的类,这次本想直接套用,到后来才意识到是浮点运算; 3.感觉代码对大数还是感到无力。
学到几点:
1.cin与空格 通常,运算符‘>>‘将忽略空格,读入后面与变量相对应的值,这样一组用例含多个变量即可用空格隔开;
2.字符串转数字,这里写的比较全<转>http://www.cnblogs.com/processakai/archive/2011/06/24/2089348.html
代码如下。菜鸟一只,欢迎指正错误。
/*2014-4-19 描述 一般来说,我们采用针孔相机模型,也就是认为它用到的是小孔成像原理。 在相机坐标系下,一般来说,我们用到的单位长度,不是“米”这样的国际单位,而是相邻像素的长度。而焦距在相机坐标系中的大小,是在图像处理领域的一个非常重要的物理量。 假设我们已经根据相机参数,得到镜头的物理焦距大小(focal length),和相机胶片的宽度(CCD width),以及照片的横向分辨率(image width),则具体计算公式为: Focal length in pixels = (image width in pixels) * (focal length on earth) / (CCD width on earth) 比如说对于Canon PowerShot S100, 带入公式得 Focal length in pixels = 1600 pixels * 5.4mm / 5.27mm = 1639.49 pixels 现在,请您写一段通用的程序,来求解焦距在相机坐标系中的大小。 */ #include <iostream> #include <string> #include "stdlib.h" using namespace std ; double ConvertStrToDouble( string &str ) { int len = str.length() ; //原始字符串长度,含单位 int i ; int flag ; //判别单位标识 double data ; //返回的浮点数 char head[30] ; //将string类中字符转储,以便使用atof函数进行字符串向浮点数的转换 for( i = 0 ; i < len ; i++ ) { head[i] = str[i] ; } head[i] = ‘\0‘ ; data = atof( head ) ; flag = str[len-2] ; if( flag == ‘n‘ ) //nm { data = data / 1000000 ; } else if( flag == ‘u‘) //um { data = data / 1000 ; } else if( flag == ‘d‘ ) //dm { data = data * 100 ; } else if( flag == ‘c‘ ) //cm { data = data * 10 ; } else if( flag == ‘m‘ ) //mm { } else if( flag == ‘p‘ ) //px { } else //m { data = data * 1000 ; } //if return data ; } int main(int argc, char* argv[]) { string str1 , str2 , str3 ; int T , S ;//数据组数 double d1 , d2 , d3 , res ; cin>>T; S = T ; while( T-- ) { cin>>str1>>str2>>str3 ; d1 = ConvertStrToDouble( str1 ) ; d2 = ConvertStrToDouble( str2 ) ; d3 = ConvertStrToDouble( str3 ) ; res = d1 * d3 / d2 ; printf( "Case %d: %.2fpx\n" , S-T , res ) ; }//while(T--) return 0 ; }
原文:http://www.cnblogs.com/aichiniudeluke/p/3675370.html