帮酷LOGO
0 0 评论
文章标签:范围  Finder  FIND  
Sample Image

目录

简介

在旅行之后,当你看到旅行照片时,有时你想知道那里对象的距离或者大小。 在某种情况下。

如果你能在照片中找到一些对象,你可以测量它们的距离,如果你知道物体的距离。 例如如果你知道特殊建筑物的高度( 比如。 星塔或者塔,你可以远离它,你可以用简单的照片来测量距离。 有时候很有趣 !

如何工作

光线通过透镜并聚焦于 Surface 时折射光线。 这种效果在我们的眼睛和类似设备中被用作照相机。显微镜。望远镜等。

在摄像机中,有一组镜头( 而不是一个) 可以一起工作,以便更好地控制光和获得更好的质量。

但是单个镜头或者一组镜头的规则是一样的。 在我们的计算中,有四个变量是重要的。

  • 对象的大小( Y1 )
  • 对象与镜头的距离( X1 )
  • 传感器或者胶片上的图像的大小( Y2 )
  • 传感器与透镜之间的距离( X2 )

我们的变量有一个等式: x1/y1 = x2/y2

我们怎么找到这个方程式?

如果我们看上一个图,我们可以找到两个右三角形。 关于三角形有一些规则,我们在这个例子中使用它们。

a1 = a2 ==> 标记 a1 = 标记 a2

切线= 相对边/相邻的

标记 a1 = y1/x1

标记 a2 = y2/x2

tag = tag ==/x1 = y2/x2 ==> 我们可以反转等式 ==>/y1 = x2/y2 = x2/y2

既然我们找到了公式,如果我们知道三个变量,那么第四个就是我们的手。

好消息是我们总是知道X2大小。 通常的NAME 大小的是透镜的焦距和制造商在透镜( 以毫米为单位测量)的体上打印它。 以下镜头的焦距为 50毫米。

有些镜头的焦距可变。 他们叫他们变焦镜头。 下图显示了 18到 55毫米变焦镜头。

这个图形是一个点,拍摄相机的焦距范围从 7.4到 44.4毫米。

但是记住镜头的焦距很困难,特别是当我们拍摄带有不同缩放值的图片时。 好消息是每个数码相机在图像文件中保存了一些有用的数据,而焦距就是其中之一。 所以我们不需要记住任何东西。 如果要查看与图像一起保存的数据,只需按如下方式操作:

  • 右键点击图像
  • 选择属性
  • 点击 ,然后选择 Details ( Windows XP ) Details Details Details Details Tab Tab Tab Tab Tab Tab Tab

这些数据被命名为"exif"信息。

我们需要测量的第二个变量是传感器( Y2 ) 上的图像大小。 我们可以通过一些计算来测量。 这里的重要值是传感器和高度的宽度,以及图像的宽度和高度。 同样有好的news: 我们可以在in信息中找到这些值。

如果裁剪或者调整图像文件的大小,请考虑无法测量正确的值。 所以使用原始映像文件而不更改。

现在我们的方程一边。 在另一边还有 2个变量。 它意味着如果你知道对象( Y1 )的大小,可以计算距离: 磅 X1 = Y1 *。

当你知道( X1 )的距离,你可以计算大小: 英镑 = X1/(X2/Y2)

照片中通常有一些标志,比如你的朋友,历史,塔,汽车,标志等等。 ( 上数字:我在乌克兰的朋友)

使用代码的

这里算法类似于:

变量

最初我声明了一些变量和一个( Camera ) 类,用于收集关于照相机的所有信息。 假设我们的EXIF信息没有传感器宽度或者高度,但它包含相机 NAME。 我添加了一个外部文件( Camera.lst ),它包含流行的数码相机传感器大小,按名称排序相机。

我还将相机模型添加到主菜单,因此如果图像文件不包含EXIF信息,可以手动添加值。

privatefloat myZoom = 1;privateint startX = 0;privateint startY = 0;privateint movedX = 0;privateint movedY = 0;privatedouble myMeasure = 0;privatedouble mySize = 0;privatedouble myDistance = 0;privatedouble mySizeScale =. 01;privatedouble myDistanceScale = 1;privateint myMeasureStartX = 0;privateint myMeasureStartY = 0;privatebool horiZontal = true;private Bitmap myBitmap;class Camera
{
 internalstring Factory="";
 internalstring Model = "";
 internalstring AliasName = "";
 internalstring SensorType = "";
 internalfloat SensorWidth = 0;
 internalfloat SensorHeight = 0;
}private List<camera/> allCameraInfo=new List<camera/> ();privatevoid loadCameraInfo()
{
 // Open the file string dataFile=Application.StartupPath +"Datacamera.lst";
 if (System.IO.File.Exists(dataFile))
 {
 using (System.IO.StreamReader sr = System.IO.File.OpenText(dataFile))
 {
 string myLine = "";
 while ((myLine = sr.ReadLine())!= null)
 {
 if (!myLine.StartsWith("//") && myLine.Trim()!= "")
 {
 string[] myData;
 myData = myLine.Split(new string[] { "," }, StringSplitOptions.None);
 try {
 //Add Camera information to list collection Camera myCameraInfo = new Camera();
 myCameraInfo.Factory = myData[0].Trim ();
 myCameraInfo.Model = myData[1].Trim ();
 myCameraInfo.AliasName = myData[2].Trim ();
 myCameraInfo.SensorType = myData[3].Trim();
 myCameraInfo.SensorWidth = Convert.ToSingle(myData[4]);
 myCameraInfo.SensorHeight = Convert.ToSingle(myData[5]);
 allCameraInfo.Add(myCameraInfo);
 //Add Camera manufacturer to the menubool newFactory = true;
 foreach (ToolStripMenuItem mi in mnuCamera.DropDownItems )
 {
 if (mi.Text.Contains(myCameraInfo.Factory)) 
 newFactory = false;
 }
 if (newFactory)mnuCamera.DropDownItems.Add(myCameraInfo.Factory);
 // Add cameral model to the menuforeach (ToolStripMenuItem mi in mnuCamera.DropDownItems)
 {
 if (mi.Text.Contains(myCameraInfo.Factory)) 
 mi.DropDownItems.Add(myCameraInfo.Model + 
 (myCameraInfo.AliasName == ""? "" : " -" + 
 myCameraInfo.AliasName ),null, mnuCamera_Click);
 }
 }
 catch (Exception ) { }
 }
 }
 }
 }
}

加载新图像

然后程序准备好了。 每次从硬盘加载图片时,以下过程都会检查它的传感器宽度。高度和相机图片,如果在数据目录中可用。

//Finding camera info and pictureprivatevoid cameraSerach()
{
 txtSensorHeight.Text = "";
 txtSensorWidth.Text = "";
 txtSensorType.Text = "";
 picCamera.Image = Properties.Resources.noPhoto;
 toolTip1.SetToolTip(picCamera, "");
 string camControl = "MRK"; // this is for preventing finding // camera names like D300 instead of D3 string camName = txtCameraFactory.Text.Replace
 ("", "").Replace("-", "").ToLower() + camControl;
 bool camFound = false;
 byte camLoop = 0;
 do {
 foreach (Camera thisCamera in allCameraInfo)
 {
 if (camName.Contains(thisCamera.Factory.Replace("", "").ToLower()) 
 &&!camFound )
 {
 if (camName.Contains(thisCamera.Model.Replace
 ("", "").Replace("-", "").ToLower() + camControl) || 
 (camName.Contains(thisCamera.AliasName.Replace
 ("", "").Replace("-", "").ToLower() + camControl) && 
 thisCamera.AliasName!= ""))
 {
 txtSensorType.Text = thisCamera.SensorType;
 txtSensorWidth.Text = thisCamera.SensorWidth.ToString();
 txtSensorHeight.Text = thisCamera.SensorHeight.ToString();
 toolTip1.SetToolTip(picCamera, thisCamera.Factory + "" + 
 thisCamera.Model);
 string picFile = Application.StartupPath + "Data" + 
 thisCamera.Factory + "_" + 
 thisCamera.Model.Replace("", "") + ".gif";
 if (System.IO.File.Exists(picFile)) picCamera.Image = 
 Image.FromFile(picFile);
 camFound = true;
 }
 }
 }
 camControl = "";
 camLoop++;
 } while (!camFound && camLoop <2);
} 

35毫米等效值

在数字时代之前,我们通常使用 35毫米胶片相机。 薄膜尺寸( 传感器大小) 固定于 36毫米X 24毫米。 在这种类型的摄像机中,50毫米透镜的角度为 46度( 等于我们的眼睛),称为正常镜头。 所有焦距较低的透镜,它的焦距为宽角( 比如。 28毫米和具有较高值的镜头称为焦镜( 比如 )。 200 mm )。

数码相机具有不同的传感器尺寸,因为一些数学原因,镜头的焦距不同。 例如 35毫米宽角度镜头在全帧相机上用作 35mm ( 比如 )。 Canon EOS ),在相机尺寸为aps的相机上起大约10毫米的正常镜头( 比如 )。 Nikon D60 ),and telephoto telephoto sensor sensor sensor sensor sensor sensor sensor sensor sensor。 Olympus E-520 )。

如果相机拍摄相机时,所有的相机都使用相同的值来显示相机的焦距,为了避免混淆,所有厂家都会使用相同的值。 例如以下相机( Canon A590 ) 有一个焦距为 5.8到 23.2的变焦镜头,但是在目录中,你可以看到它们使用的是 35 mm的equivalent equivalent。

计算等值值时,需要将相机的对角线尺寸分为相机( 这里是 7.18毫米)的对角线尺寸。 结果值被命名为焦距乘数。 最后的公式如下:

焦距等效= 焦距 * 流乘法器。

在上述相机中,我们的计算如下:

流乘法器= 43.27/7.18 = 6

最小焦距= 5.8 * 6 =34.8

最大焦点 length=23。2 * 6 = 139.2

我使用以下代码计算 35毫米等效焦距:

privatevoid txtPicFL_TextChanged(object sender, EventArgs e)
{
 string myEquivalent = "";
 try {
 double eq =Math.Pow ( (Math.Pow(Convert.ToSingle(txtSensorWidth.Text), 2) + 
 Math.Pow(Convert.ToSingle(txtSensorHeight.Text), 2)),.5);
 eq = Math.Round ((43.2666/eq) * Convert.ToSingle(txtPicFL.Text ));
 myEquivalent = eq.ToString();
 }
 catch (Exception) { }
 txtPicEquivalent.Text = myEquivalent;
}

测量传感器上物体的尺寸。

当用户通过拖动选择图像的一部分时,下面的代码在传感器上测量它的大小。 它考虑了图像( 横向或者纵向)的方向,并在状态栏上显示了结果。

// measuring the selected part's size on the sensordouble xDiff = Math.Abs(myMeasureStartX - e.X) * myZoom * 
 Convert.ToSingle(txtSensorWidth.Text)/
 Convert.ToSingle(horiZontal? txtPicWidth.Text : txtPicHeight.Text);double yDiff = Math.Abs(myMeasureStartY - e.Y) * myZoom * 
 Convert.ToSingle(txtSensorHeight.Text)/
 Convert.ToSingle(horiZontal? txtPicHeight.Text : txtPicWidth.Text);
myMeasure = Math.Pow((Math.Pow(xDiff, 2) + Math.Pow(yDiff, 2)),. 5);
tssStatusM.Text = "Measure (mm):" + myMeasure.ToString();// Drawing a red line to show the size of your selectionpicMain.Refresh();
Graphics g = picMain.CreateGraphics();
g.ResetClip();
g.DrawLine(new Pen(Color.Red), myMeasureStartX, myMeasureStartY, e.X, e.Y);

最终计算结果

现在,如果你知道对象( X1 )的距离,我们可以在传感器( Y2 ) 上使用焦距( X2 ) 和大小,你可以使用下面的代码:

mySize = myDistance * (myMeasure/Convert.ToDouble(txtPicFL.Text));
tstSize.Text = Convert.ToString(Math.Round ( mySize/mySizeScale,2));

如果知道( Y1 )的大小,下面的代码将计算对象的距离:

myDistance = mySize/(myMeasure/Convert.ToDouble(txtPicFL.Text));
tstDistance.Text = Convert.ToString( Math.Round( myDistance/myDistanceScale,2));

车间

现在,我们要尝试应用程序。 我从影像资源网站下载了以下图片,并将它的保存到我的硬盘。 你也可以试试。

加载图片。程序从文件获取所需信息并在左侧面板显示它。

点击左上角的缩略图图片,你可以快速移动到选中的部分。 我在这里找到一个标志。

然后,将缩放栏移动到右侧。 你也可以通过在主图像上拖动鼠标来移动图像。

如果你尝试更多的话你可以找到这个地方。

再放大你就能看到建筑上的旗子。

现在单击工具栏上的钢笔按钮,然后在标记( 作为它的高度) 上绘制一行。 程序在传感器上测量尺寸,并在状态栏显示它。

如果标志大小不正确,但我想它必须是大约 150,如果是,在对象大小框中键入。 程序计算距离大约 3公里。

精度标准

这种方法的准确性取决于相机传感器尺寸。镜头质量。噪声。你可以通过在已知的距离上放置标尺来测试相机,并使用一个图片来拍摄。 然后用这个程序来测量。

平均精度大于 95%。

兴趣点

本文的部分内容是关于摄影和照相机。 这里有一些有趣的点。

当你谈论数码相机时,你可以考虑的第一件事是它的。 通常人们认为更多的字符串更好,但在这个万字节比赛中,制造商不认识。

当传感器的大小相同时,更多的图像不但不意味着更好的图像,有时它会产生更低的质量。 制造商必须在传感器上制造更小的像素,这意味着传感器的每个像素收集的光量较少。 在这种情况下,对光的处理能力较少,每个像素上的噪声都。 你有一个更多像素和更多噪音的图像。 这个问题在光线较低的情况下。

如果你想为数码相机付更多钱,那就把它花在它的传感器尺寸上。 具有 8位和 1/1. 7"。使用 1/2. 5,传感器大小更适合 12百万像素"传感器尺寸的数码相机。 8万桶的水是超过 12杯的水。

历史记录

  • ( April年) 年)
  • 更新 1 ( 四月 22,2009 )
    • 飞行计算
  • 更新 2 ( 四月 30,2009 )
    • 某些欧洲语言的小数问题( 逗号代替点)


文章标签:FIND  范围  Finder  

Copyright © 2011 HelpLib All rights reserved.    知识分享协议 京ICP备05059198号-3  |  如果智培  |  酷兔英语