Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
291 views
in Technique[技术] by (71.8m points)

ios - Which is the best way to estimate measure of photographed things?

My app is supposed to estimate the length (in millimeters) of an object using euro coins as reference. This is a screenshot example:

enter image description here

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.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)
  1. 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

  2. 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.

  3. compute the circle center

    just average of all border points...

  4. 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.

  5. 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_pixel
    • b_size_unit = b_size_pixel * coin_r_unit / rmin_pixel

coin

[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


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...