aboutsummaryrefslogtreecommitdiff
path: root/matlab/traffic_lights.m
diff options
context:
space:
mode:
Diffstat (limited to 'matlab/traffic_lights.m')
-rw-r--r--matlab/traffic_lights.m69
1 files changed, 69 insertions, 0 deletions
diff --git a/matlab/traffic_lights.m b/matlab/traffic_lights.m
new file mode 100644
index 0000000..8804778
--- /dev/null
+++ b/matlab/traffic_lights.m
@@ -0,0 +1,69 @@
+clf
+clc
+hold on;
+
+x = imread('010.jpg');
+x = imrotate(x, 180);
+o = x;
+x = rgb2hsv(x);
+
+t = x(:,:,3);
+t = imadjust(t);
+t = t < 0.15;
+
+[lmap, lcount] = bwlabel(t);
+
+imshow(label2rgb(lmap, 'jet', 'black'));
+imshow(o);
+for i = 1:lcount
+ s = regionprops(lmap == i, 'BoundingBox').BoundingBox;
+ sx = s(1);
+ sy = s(2);
+ lx = s(1) + s(3);
+ ly = s(2) + s(4);
+ width = lx - sx;
+ height = ly - sy;
+ area = width * height;
+ if area < 450
+ continue
+ end
+ aspect = height / width;
+ % stoplichten zullen wel een verhouding van ongeveer 2.2 hebben
+ if abs(aspect - 2.2) > 0.5
+ continue
+ end
+
+ red_light = [round(sx + width / 2), round(sy + 0.2 * height)];
+ yellow_light = [round(sx + width / 2), round(sy + 0.5 * height)];
+ green_light = [round(sx + width / 2), round(sy + 0.8 * height)];
+
+ light_status = 0; % 0 = geen lamp, 1 = rood, 2 = geel, 3 = groen
+
+ % x(red_light(2), red_light(1), :)
+ if (light_status == 0) && ...
+ (abs(x(red_light(2), red_light(1), 1) - 0.5) > 0.4) && ...
+ (x(red_light(2), red_light(1), 2) > 0.4)
+ light_status = 1;
+ plot(red_light(1), red_light(2), '.');
+ end
+ if (light_status == 0) && ...
+ (abs(x(yellow_light(2), yellow_light(1), 1) - 0.1) < 0.1) && ...
+ (x(yellow_light(2), yellow_light(1), 2) > 0.4)
+ light_status = 2;
+ plot(yellow_light(1), yellow_light(2), '.');
+ end
+ if (light_status == 0) && ...
+ (abs(x(green_light(2), green_light(1), 1) - 0.4) < 0.1) && ...
+ (x(green_light(2), green_light(1), 2) > 0.4)
+ light_status = 3;
+ plot(green_light(1), green_light(2), '.');
+ end
+
+ if light_status == 0
+ continue
+ end
+
+ rectangle('Position', [s(1) s(2) s(3) s(4)], 'EdgeColor', 'green');
+ status = ["rood" "geel" "groen"]; status(light_status)
+end
+