├── rgb_to_gray.m ├── README.md ├── Combine_videos.m ├── Intermediate_Files └── Thresholding.m ├── edge_detect.m ├── grayop_plus_edgeop.m ├── bg_sub_offline_mean.m ├── morpho.m ├── bg_sub_approxmedian.m ├── bg_sub_running_mean.m ├── connected_comp.m ├── ambulance_detect_image.m └── vehicle_count.m /rgb_to_gray.m: -------------------------------------------------------------------------------- 1 | xyloObj = VideoReader('traffic_4.mp4'); 2 | writerObj = VideoWriter('4_rgb2gray'); 3 | writerObj.FrameRate=30; 4 | 5 | open(writerObj); 6 | 7 | nFrames = xyloObj.NumberOfFrames; 8 | vidHeight = xyloObj.Height; 9 | vidWidth = xyloObj.Width; 10 | 11 | considerFrames=nFrames; 12 | 13 | for k = 1 : considerFrames 14 | k=k 15 | frame = read(xyloObj, k); 16 | frame=(rgb2gray(frame)); 17 | frame=imresize(frame,[360 480]); 18 | writeVideo(writerObj, frame); 19 | end 20 | 21 | close(writerObj); 22 | 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Traffic-CONTROL-System---MATLAB 2 | A traffic control system which counts the number of vehicles and detects passage of any emergency vehicle. This will help in dynamic traffic signal system which will lead to an efficient passage of traffic. 3 | # 4 | The CODE is entirely written in MATLAB. 5 | # 6 | FILES : 7 | Vehicle_count.m : This is a merging of all the other files. You can RUN this file alone to get the intermediate as well as the final results. 8 | # 9 | All other files should be RUN in a particular order which generates an output which the other file uses as INPUT. 10 | -------------------------------------------------------------------------------- /Combine_videos.m: -------------------------------------------------------------------------------- 1 | close all 2 | clc 3 | clear 4 | vid1 = VideoReader('5_rgb2gray.avi'); 5 | vid2 = VideoReader('5_morpho.avi'); 6 | 7 | % New video 8 | outputVideo = VideoWriter('5_combine_rgb2gray_plus_morpho.avi'); 9 | outputVideo.FrameRate = vid1.FrameRate; open(outputVideo); 10 | 11 | while hasFrame(vid1) && hasFrame(vid2) 12 | img1 = readFrame(vid1); 13 | img2 = readFrame(vid2); 14 | imgt = horzcat(img1, img2); 15 | writeVideo(outputVideo, imgt); 16 | % play video step(videoPlayer, imgt); 17 | % record new video writeVideo(outputVideo, imgt); 18 | end 19 | close(outputVideo); 20 | -------------------------------------------------------------------------------- /Intermediate_Files/Thresholding.m: -------------------------------------------------------------------------------- 1 | xyloObj = VideoReader('4_gray_bg_sub_median.avi'); 2 | 3 | writerObj1 = VideoWriter('4_thresholded_without_addition'); 4 | open(writerObj1); 5 | 6 | nFrames = xyloObj.NumberOfFrames; 7 | vidHeight = xyloObj.Height; 8 | vidWidth = xyloObj.Width; 9 | 10 | considerFrames=nFrames; 11 | n=20; 12 | 13 | for k = 1 : considerFrames 14 | frame = read(xyloObj, k); 15 | frame=uint8(rgb2gray(frame)); 16 | 17 | k=k 18 | im_bw=uint8(imbinarize(frame,0.1)*255); %BEST TILL NOW 19 | 20 | writeVideo(writerObj1, im_bw); 21 | end 22 | 23 | close(writerObj1); 24 | -------------------------------------------------------------------------------- /edge_detect.m: -------------------------------------------------------------------------------- 1 | xyloObj = VideoReader('4_rgb2gray.avi'); 2 | 3 | writerObj1 = VideoWriter('4_edge_Canny'); 4 | open(writerObj1); 5 | 6 | nFrames = xyloObj.NumberOfFrames; 7 | vidHeight = xyloObj.Height; 8 | vidWidth = xyloObj.Width; 9 | 10 | considerFrames=nFrames; 11 | n=20; 12 | 13 | h=fspecial('Sobel'); 14 | 15 | for k = 1 : considerFrames 16 | frame = read(xyloObj, k); 17 | frame=double(rgb2gray(frame)); 18 | k=k 19 | % Using Sobel operator 20 | %im_edge=uint8(imfilter(frame,h)+imfilter(frame,h')); 21 | 22 | % Using Canny edge detection 23 | im_edge=uint8(edge(frame,'Canny')*255); 24 | writeVideo(writerObj1, im_edge); 25 | end 26 | 27 | close(writerObj1); -------------------------------------------------------------------------------- /grayop_plus_edgeop.m: -------------------------------------------------------------------------------- 1 | medianObj = VideoReader('4_gray_bg_sub_median.avi'); 2 | edgeObj = VideoReader('4_sobel_bg_sub_median.avi'); 3 | 4 | writerObj1 = VideoWriter('4_median_plus_sobeledge'); 5 | open(writerObj1); 6 | 7 | nFrames = medianObj.NumberOfFrames; 8 | vidHeight = medianObj.Height; 9 | vidWidth = medianObj.Width; 10 | 11 | considerFrames=nFrames; 12 | n=20; 13 | 14 | for k = 1 : considerFrames 15 | medianframe = read(medianObj, k); 16 | medianframe=double(rgb2gray(medianframe)); 17 | 18 | edgeframe = read(edgeObj, k); 19 | edgeframe=double(rgb2gray(edgeframe)); 20 | 21 | im_new=uint8((medianframe+edgeframe)/2); 22 | k=k 23 | %im_sub=uint8( bwconvhull(im_sub,'objects')*255) ; 24 | writeVideo(writerObj1, im_new); 25 | end 26 | 27 | close(writerObj1); 28 | -------------------------------------------------------------------------------- /bg_sub_offline_mean.m: -------------------------------------------------------------------------------- 1 | xyloObj = VideoReader('4_rgb2gray.avi'); 2 | 3 | writerObj1 = VideoWriter('4_bg_sub_offline_mean'); 4 | open(writerObj1); 5 | 6 | nFrames = xyloObj.NumberOfFrames; 7 | vidHeight = xyloObj.Height; 8 | vidWidth = xyloObj.Width; 9 | 10 | considerFrames=300; 11 | n=20; 12 | 13 | bgrnd_img=double(zeros(vidHeight,vidWidth)); 14 | 15 | %mov(1:considerFrames) = struct('cdata', zeros(vidHeight, vidWidth,3, 'uint8'), 'colormap', []); 16 | 17 | for k = 1 : considerFrames 18 | frame = read(xyloObj, k); 19 | frame=double(rgb2gray(frame)); 20 | 21 | bgrnd_img=bgrnd_img+(frame); 22 | end 23 | 24 | mean_bg=bgrnd_img/considerFrames; 25 | 26 | for k = 1 : considerFrames 27 | frame = read(xyloObj, k); 28 | frame=double(rgb2gray(frame)); 29 | 30 | im_sub=uint8(frame - mean_bg); 31 | writeVideo(writerObj1, im_sub); 32 | end 33 | 34 | mean_bg=uint8(mean_bg); 35 | imshow(mean_bg); 36 | close(writerObj1); -------------------------------------------------------------------------------- /morpho.m: -------------------------------------------------------------------------------- 1 | xyloObj = VideoReader('4_thresholded.avi'); 2 | 3 | writerObj1 = VideoWriter('4_morpho'); 4 | open(writerObj1); 5 | writerObj2 = VideoWriter('4_morpho_conv'); 6 | open(writerObj2); 7 | writerObj3 = VideoWriter('4_morpho_erode'); 8 | open(writerObj3); 9 | 10 | 11 | nFrames = xyloObj.NumberOfFrames; 12 | vidHeight = xyloObj.Height; 13 | vidWidth = xyloObj.Width; 14 | 15 | considerFrames=nFrames; 16 | n=20; 17 | 18 | SE_dilate = strel('square', 31); 19 | SE_erode = strel('disk', 41); 20 | 21 | for k = 1 : considerFrames 22 | frame = read(xyloObj, k); 23 | frame=(rgb2gray(frame)); 24 | 25 | k=k 26 | 27 | im_conv=uint8( bwconvhull(frame,'objects')*255) ; 28 | writeVideo(writerObj2, uint8(im_conv)); 29 | 30 | im_erode=uint8(imerode(im_conv,SE_erode)); 31 | writeVideo(writerObj3, uint8(im_erode)); 32 | 33 | im_dilate=uint8(imdilate(im_erode,SE_dilate)); 34 | 35 | writeVideo(writerObj1, uint8(im_dilate)); 36 | end 37 | 38 | close(writerObj1); 39 | close(writerObj2); 40 | close(writerObj3); 41 | -------------------------------------------------------------------------------- /bg_sub_approxmedian.m: -------------------------------------------------------------------------------- 1 | xyloObj = VideoReader('4_edge_Sobel.avi'); 2 | 3 | writerObj1 = VideoWriter('4_Sobel_bg_sub_median'); 4 | writerObj2 = VideoWriter('4_Sobel_bg_median'); 5 | open(writerObj2); 6 | open(writerObj1); 7 | 8 | nFrames = xyloObj.NumberOfFrames; 9 | vidHeight = xyloObj.Height; 10 | vidWidth = xyloObj.Width; 11 | 12 | considerFrames=nFrames; 13 | n=10; 14 | 15 | bg=double(zeros(vidHeight,vidWidth)); 16 | bgrnd_img=double(zeros(vidHeight,vidWidth)); 17 | 18 | for k = 1 : considerFrames 19 | frame = read(xyloObj, k); 20 | frame=double(rgb2gray(frame)); 21 | k=k 22 | if(k>n) 23 | for i = 1 : vidHeight 24 | for j = 1 : vidWidth 25 | if( frame(i,j)> bg(i,j) ) 26 | bg(i,j)=bg(i,j)+1; 27 | else 28 | bg(i,j)=bg(i,j)-1; 29 | end 30 | end 31 | end 32 | bg=double(bg); 33 | im_sub=uint8(frame - bg); 34 | else 35 | bgrnd_img=bgrnd_img+(frame); 36 | bg= bgrnd_img/k; 37 | im_sub=uint8(bg); 38 | end 39 | 40 | %im_sub=uint8(imbinarize(im_sub,0.10)*255); %BEST TILL NOW 41 | writeVideo(writerObj2, uint8(bg)); 42 | writeVideo(writerObj1, im_sub); 43 | end 44 | 45 | %bgrnd_img=uint8(bgrnd_img); 46 | close(writerObj1); 47 | close(writerObj2); -------------------------------------------------------------------------------- /bg_sub_running_mean.m: -------------------------------------------------------------------------------- 1 | xyloObj = VideoReader('4_rgb2gray.avi'); 2 | 3 | writerObj1 = VideoWriter('4_bg_sub_running_mean'); 4 | writerObj2 = VideoWriter('4_bg_running_mean'); 5 | 6 | open(writerObj1); 7 | open(writerObj2); 8 | 9 | nFrames = xyloObj.NumberOfFrames; 10 | vidHeight = xyloObj.Height; 11 | vidWidth = xyloObj.Width; 12 | 13 | considerFrames=nFrames; 14 | n=20; 15 | 16 | bgrnd_img=double(zeros(vidHeight,vidWidth)); 17 | 18 | %mov(1:considerFrames) = struct('cdata', zeros(vidHeight, vidWidth,3, 'uint8'), 'colormap', []); 19 | 20 | for k = 1 : considerFrames 21 | frame = read(xyloObj, k); 22 | frame=double(rgb2gray(frame)); 23 | k=k 24 | %bgrnd_img=bgrnd_img+(im1); 25 | 26 | if(k>n) 27 | im_n = read(xyloObj, k-n); 28 | im_n=double(im_n); 29 | bgrnd_img=bgrnd_img+frame-im_n; 30 | mean_bg= bgrnd_img/n; 31 | else 32 | bgrnd_img=bgrnd_img+(frame); 33 | mean_bg= bgrnd_img/k; 34 | end 35 | 36 | im_sub=uint8(frame - mean_bg); 37 | 38 | % % Generate horizontal edge using sobel filter 39 | % h = fspecial('sobel'); 40 | % % Apply filter to get horizontal edges 41 | % im_sub = uint8(imfilter(im_sub,h) + imfilter(im_sub,h')); 42 | % 43 | writeVideo(writerObj2,uint8(mean_bg) ); 44 | writeVideo(writerObj1, im_sub); 45 | end 46 | 47 | close(writerObj1); 48 | close(writerObj2); 49 | -------------------------------------------------------------------------------- /connected_comp.m: -------------------------------------------------------------------------------- 1 | Obj = VideoReader('4_morpho.avi'); 2 | Obj1 = VideoReader('traffic_4.mp4'); 3 | writerObj1 = VideoWriter('4_connected'); 4 | writerObj2 = VideoWriter('4_connected_plus_orig'); 5 | writerObj2.FrameRate=25; 6 | 7 | open(writerObj1); 8 | open(writerObj2); 9 | 10 | nFrames = Obj.NumberOfFrames; 11 | vidHeight = Obj.Height; 12 | vidWidth = Obj.Width; 13 | 14 | clr=[0 250 0]; 15 | 16 | considerFrames=nFrames; 17 | n=20; 18 | % New - Create structuring element 19 | se = strel('square', 3); 20 | 21 | disp("Traffic count after every 2 seconds"); 22 | for k = 1 : considerFrames 23 | % centroid=double(zeros(vidHeight,vidWidth)); 24 | 25 | frame = read(Obj, k); 26 | frame_orig = read(Obj1, k); 27 | frame=(im2bw(frame)); 28 | 29 | frame_orig=(imresize(rgb2gray(frame_orig),[360 480])); 30 | frame_orig=(imresize(frame_orig,[360 480])); 31 | 32 | k=k; 33 | CC = bwconncomp(frame,8); 34 | num=CC.NumObjects; 35 | 36 | S = regionprops(CC,'Centroid','Area'); 37 | 38 | %Every 2 seconds 39 | if(mod(k,30)==0) 40 | disp((k/30)+"secs : "+num) 41 | end 42 | 43 | % Perimeter of connectetd components 44 | im_new = bwperim(frame,8)*255; 45 | im_new=cat(3,im_new,frame*0,frame*0); 46 | frame_orig=cat(3,frame_orig,frame_orig,frame_orig); 47 | 48 | im_sum=frame_orig+uint8(im_new); 49 | 50 | writeVideo(writerObj1, uint8(im_new)); 51 | writeVideo(writerObj2, uint8(im_sum)); 52 | 53 | end 54 | 55 | close(writerObj1); 56 | close(writerObj2); -------------------------------------------------------------------------------- /ambulance_detect_image.m: -------------------------------------------------------------------------------- 1 | % xyloObj = VideoReader('amb.mp4'); 2 | % 3 | % writerObj1 = VideoWriter('amb_red'); 4 | % open(writerObj1); 5 | % 6 | % nFrames = xyloObj.NumberOfFrames; 7 | % vidHeight = xyloObj.Height; 8 | % vidWidth = xyloObj.Width; 9 | % 10 | % considerFrames=nFrames; 11 | % n=10; 12 | 13 | %for k = 1 : considerFrames 14 | frame = imread('amb3.jpg'); 15 | frame = imresize(frame,[360,480]); 16 | %frame=(rgb2gray(frame)); 17 | 18 | %z=double(zeros(vidHeight,vidWidth,3)); 19 | 20 | 21 | %im_sub=uint8(imbinarize(im_sub,0.10)*255); %BEST TILL NOW 22 | %for i = 1 : 3 23 | other_thresh=50; 24 | blue_other_thresh=100; 25 | red_thresh=180; 26 | blue_thresh=180; 27 | 28 | red=frame(:,:,1); 29 | red(and(and(frame(:,:,1)>=red_thresh,frame(:,:,2)<=other_thresh),frame(:,:,3)<=other_thresh) )=255; 30 | red(and(or(frame(:,:,3)>=other_thresh,frame(:,:,2)>other_thresh),frame(:,:,1)>red_thresh) )=0; 31 | red(frame(:,:,1)=blue_thresh,frame(:,:,1)<=blue_other_thresh),frame(:,:,2)<=blue_other_thresh) )=255; 35 | blue(and(or(frame(:,:,1)>=blue_other_thresh,frame(:,:,2)>blue_other_thresh),frame(:,:,3)>blue_thresh) )=0; 36 | blue(frame(:,:,3)