我的应用程序应该使用欧元硬币作为参考来估计物体的长度(以毫米为单位).这是一个截图示例:
为了得到所拍摄硬币的直径,我首先计算了一个圆通过表格中这 3 个点的方程
x^2 + y^2 + ax + by + c = 0
然后我得到直径
2 * square_root((a/2)^2 + (b/2)^2 -c).
最后我可以执行以下比例得到红笔的长度:
/* length_estimated_pen (mm) : distance_green_pins (points) = real_diameter_coin (mm) : diameter_on_screen (points) */让 distanceGreen:Double = Double(sqrt(pow(self.greenLocationA.center.x - self.greenLocationB.center.x, 2.0) + pow(self.greenLocationA.center.y - self.greenLocationB.center.y, 2.0)))让estimatedMeasure:Double = (distanceGreen * Double(ChosenMeter.moneyDiameter))/直径在 ChosenMeter.moneyDiameter 中存储了所选硬币的实际直径作为参考(通过单击下面的 3 个按钮之一).
我需要使用 Double 而不是 CGFloat 因为
[注]
选择此图像是为了强调倾斜,但您应该使用与芯片表面几乎平行的平面图像以避免透视失真.这张图片不是一个很好的例子,立方体离相机比硬币更远......
为此,请参阅不同投影的选择标准
My app is supposed to estimate the length (in millimeters) of an object using euro coins as reference. This is a screenshot example:
To get the diameter of the photographed coin I first calculate the equation of a the circle passing through those 3 points of the form
x^2 + y^2 + ax + by + c = 0
and then I have the diameter by
2 * square_root((a/2)^2 + (b/2)^2 -c).
Finally I can perform the following proportion to get the length of the red pen:
/* length_estimated_pen (mm) : distance_green_pins (points) = real_diameter_coin (mm) : diameter_on_screen (points) */
let distanceGreen:Double = Double(sqrt(pow(self.greenLocationA.center.x - self.greenLocationB.center.x, 2.0) + pow(self.greenLocationA.center.y - self.greenLocationB.center.y, 2.0)))
let estimatedMeasure:Double = (distanceGreen * Double(ChosenMeter.moneyDiameter)) / diameter
where in ChosenMeter.moneyDiameter there is stored the real diameter of the chosen coin as reference (by clicking one of the 3 buttons below).
I need to work with Double instead of CGFloat because this tutorial to solve a system of linear equations (to get a,b,c coefficient of circle equation) works with Double.
The problem is the estimated length of the red pen is always overestimated of more than 10 mm. I guess I should apply a correction factor or complicate the calculus taking into consideration other factors, but which? Can you give me some hints? Any help would be useful to me.
find the coin (green bounding box rectangle)
either manually or by some search for specific color,pattern,hough transform,segmentation... This will limit the area to search for next steps
find the boundary (distinct red edge in color intensity)
so create a list of points that are the coin boundary (be careful with shadows) just scan for high enough intensity bumps.
compute the circle center
just average of all border points...
test all boundary points for min/max distance to center
if the tilt is small then you will have many points with min and max radius so take the middle from them. If the |max-min| is very small then you got no tilt. Linebetween min/max distance point and center gives you black basis vectors.
use black basis vectors to measure
So select 2 points (red line d) to measure and cast green rays from them parallel to basis vectors. Their intersection will create 2 lines a,b. from that it is easy:
d = sqrt((a*a)+(b*b))where a,b is the size of the lines in units. you can obtain it like:
a_size_unit = a_size_pixel * coin_r_unit / rmax_pixelb_size_unit = b_size_pixel * coin_r_unit / rmin_pixel[note]
This image was selected to emphasize the skew but you should use images of planes almost paralel to chip surface to avoid perspective distortion. This image is not a good example the cube is more distant to camera then coin ...
To account for this see selection criteria for different projections
这篇关于哪种方法是估计拍摄物体尺寸的最佳方法?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持html5模板网!
如何使用 Quartz Core 绘制星星?How to draw stars using Quartz Core?(如何使用 Quartz Core 绘制星星?)
为什么给 addArcWithCenter 一个 0 度的 startAngle 使它Why does giving addArcWithCenter a startAngle of 0 degrees make it start at 90 degrees?(为什么给 addArcWithCenter 一个 0 度的 startAngle 使它从
在与中心点成给定角度的直线相交的 UIView 矩形上Find the CGPoint on a UIView rectangle intersected by a straight line at a given angle from the center point(在与中心点成给定角度的直线相交
在 Swift 2.0 中将字符转换为 IntConvert Character to Int in Swift 2.0(在 Swift 2.0 中将字符转换为 Int)
如何在 Swift 中将 Int 转换为字符How to convert an Int to a Character in Swift(如何在 Swift 中将 Int 转换为字符)
在 Swift 3 中,当结果变得太高时如何计算阶乘?In Swift 3, how to calculate the factorial when the result becomes too high?(在 Swift 3 中,当结果变得太高时如何计算阶乘?)