-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest_fitellipse.py
More file actions
111 lines (84 loc) · 3.49 KB
/
test_fitellipse.py
File metadata and controls
111 lines (84 loc) · 3.49 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
import cv2.cv as cv
import cv2
import numpy as np
import math
REQUIRED_CIRCLESNESS = 0.95
filename = "sample_fitellipse.png"
im = cv2.imread(filename)
#im = cv2.imread("fit_ellipse_test_bad.png")
imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(imgray,127,255,0)
is_black_y,is_black_x = np.where(thresh == np.array([0]))
is_black = np.column_stack((is_black_x,is_black_y))
ellipse = cv2.fitEllipse(is_black)
cv2.ellipse(im,ellipse,(0,255,255),2)
print ellipse
center = (int(ellipse[0][0]),int(ellipse[0][1]))
Height = ellipse[1][0]
Width = ellipse[1][1]
circleness_percent = Height / float(Width)
if circleness_percent > REQUIRED_CIRCLESNESS:
found_circle = True
else:
found_circle = False
angle_offset = ellipse[2]
print "center = {}".format(center)
print "Height = {}".format(Height)
print "Width = {}".format(Width)
print "angle_offset = {}".format(angle_offset)
print "found circle = {}".format(found_circle)
print "max D = {}".format(Width / 2.0)
print "min D = {}".format(Height / 2.0)
MinD_x = int(center[0] + math.cos(angle_offset / 180.0) * Height / 2.0)
MinD_y = int(center[1] - math.sin(angle_offset / 180.0) * Height / 2.0)
MaxD_x = int(center[0] + math.cos((angle_offset - 90) / 180.0) * Width / 2.0)
MaxD_y = int(center[1] - math.sin((angle_offset - 90) / 180.0) * Width / 2.0)
print "MaxD_x = {}".format(MaxD_x)
print "MaxD_y = {}".format(MaxD_y)
print "MinD_x = {}".format(MinD_x)
print "MinD_y = {}".format(MinD_y)
cv2.line(im,center,(MinD_x,MinD_y),(255,0,0),3)
cv2.line(im,center,(MaxD_x,MaxD_y),(255,0,0),3)
cv2.imshow("ellipse",im)
print is_black
x_delta = is_black_x - center[0]
y_delta = center[1] - is_black_y
x_square = np.square(x_delta)
y_square = np.square(y_delta)
sum_square = x_square + y_square
is_black_radii = np.sqrt(sum_square)
print is_black_radii
radians = np.arctan2(y_delta, x_delta)
angles = np.degrees(radians)
angles = [-1 * angle + 180 if angle < 0 else angle for angle in angles]
#print angles
fp = open("{}_points.csv".format(filename), 'w')
fp_angles = open("{}_angles.csv".format(filename), 'w')
fp.write("center_x,center_y,point_x,point_y,radius,angle\n")
fp_angles.write("angle,radius\n")
average_radius = np.array(np.zeros(360))
average_radius_points = np.array(np.zeros(360))
for i in range(0,len(is_black)):
fp.write("{},{},{},{},{},{},{}\n".format(center[0],center[1],is_black_x[i],is_black_y[i],is_black_radii[i],angles[i],radians[i]))
angle_index = angles[i] / 1
print angle_index
average_radius[angle_index] = average_radius[angle_index] + is_black_radii[i]
average_radius_points[angle_index] = average_radius_points[angle_index] + 1
fp.close()
for i in range(0,len(average_radius_points)):
# print average_radius[i],i
if average_radius_points[i] > 0:
average_radius[i] = average_radius[i] / float(average_radius_points[i])
fp_angles.write("{},{}\n".format(i,average_radius[i]))
fp_angles.close()
#cv.WaitKey()
#Filename, Ctr.x, Ctr.y, H, W, Pts, Thresh, OvalPct, MaxD, MaxD.x, MaxD.y, MinD, MinD.x, MinD.y
#2014_03_30_17_41_51484.png,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
#2014_03_30_17_41_51562.png,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
#2014_03_30_17_41_51640.png,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
#2014_03_30_17_41_51718.png,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
#2014_03_30_17_41_51796.png,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
#2014_03_30_17_41_51953.png,799.151,615.987,399.048,361.146,4282,56,11,174.837,697,473,34.1321,833,618
#cv2.ellipse(im,ellipse,(0,255,255),2)
#cv2.imshow("asdf",im)
#cv.WaitKey()