問題描述
我的應(yīng)用程序應(yīng)該使用歐元硬幣作為參考來估計物體的長度(以毫米為單位).這是一個截圖示例:
為了得到所拍攝硬幣的直徑,我首先計算了一個圓通過表格中這 3 個點(diǎn)的方程
x^2 + y^2 + ax + by + c = 0
然后我得到直徑
2 * square_root((a/2)^2 + (b/2)^2 -c)
.
最后我可以執(zhí)行以下比例得到紅筆的長度:
/* 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
中存儲了所選硬幣的實(shí)際直徑作為參考(通過單擊下面的 3 個按鈕之一).
我需要使用 Double
而不是 CGFloat
因?yàn)?
[注]
選擇此圖像是為了強(qiáng)調(diào)傾斜,但您應(yīng)該使用與芯片表面幾乎平行的平面圖像以避免透視失真.這張圖片不是一個很好的例子,立方體離相機(jī)比硬幣更遠(yuǎn)......
為此,請參閱不同投影的選擇標(biāo)準(zhǔn)
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 centerif 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 youblack
basis vectors.use
black
basis vectors to measureSo select 2 points (
red
line d) to measure and castgreen
rays from them parallel to basis vectors. Their intersection will create2
linesa,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_pixel
b_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
這篇關(guān)于哪種方法是估計拍攝物體尺寸的最佳方法?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網(wǎng)!