0

I'm working on a smartcar project in which on detecting red color the car should stop and on detecting green color it should start running. I am using Matlab for color detection and Arduino to run the car. But the problem is I m not able to detect the green color, the code only detect red color and stop the car. I am not able to figure out the problem.

My code is:

vid = videoinput('winvideo',1 ,'YUY2_320x240');

s=serial('COM9','BAUD',9600);
fopen(s); %open serial port
set(vid, 'FramesPerTrigger', Inf);
set(vid, 'ReturnedColorspace', 'rgb')
vid.FrameGrabInterval = 10;
start(vid)
%set a loop that stop after 100 frames of aquisition
for i=1:100

IMRED = getsnapshot(vid); % get the snapshot of the current frame

diff_im = imsubtract(IMRED(:,:,1), rgb2gray(IMRED)); % subtract red component from the grayscale image to extract the red component in image.
gr=graythresh(diff_im); 

diff_im1 = imsubtract(IMRED(:,:,2), rgb2gray(IMRED)); %subtract green component from the grayscale image to extract the green component in image.
gr1=graythresh(diff_im1);

diff_im = medfilt2(diff_im, [3 3]); % median filter to filter the noise.
diff_im1 = medfilt2(diff_im1, [3 3]);

% convert the resulting grayscale image into a binary image.
diff_im = im2bw(diff_im,.18);
diff_im1 = im2bw(diff_im1,.05);

% Remove all those pixels less than 300px  
diff_im = bwareaopen(diff_im,300);
diff_im1 = bwareaopen(diff_im1,300);

% Label all the connected components in the image
[bw bw1] = bwlabel(diff_im, 8);
[L bw2] = bwlabel(diff_im1, 8);

 if (bw1<=0 && bw2 <=0)  % if no color detected run forward
     fprintf(s,100);

 elseif (bw1>=1) % if red detected stop the car
     while (bw1>=1);
         fprintf(s,101);
     end

     while(~(bw2>=1)) % start the car if green detected
         fprintf(s,101);
     end

     fprintf(s,100); 

     if (bw2>=1)
        fprintf(s,100);
     else 
        fprintf(s,101);
     end

 else
    fprintf(s,100);
 end
 imshow( IMRED )
 hold on
 hold off
end
stop(vid);
flushdata(vid);
delete(vid);
clear vid;
fclose(s);
clear all;
clc

I'm getting such output:

code output data

juzer tarwala
  • 41
  • 1
  • 7

1 Answers1

0

I guess that you are trying to find the pixels that have high green values,

I tried that in the past and it didn't work because of the difficulty of deciding the threshold under changing lighting and exposure conditions.

Instead, try converting the rgb values to hue, saturation and lightness (HSL) or HSV; and then see if given pixel's hue is close to the hue of green. That has worked for me as it ignores saturation and lightness of the pixel, the two values that can change wildly.

https://en.wikipedia.org/wiki/HSL_and_HSV

and

https://uk.mathworks.com/help/matlab/ref/rgb2hsv.html

also note, that for some cheap cameras, high intensity green might not look like green at all on the screen. You might need to adjust the camera's exposure manually to get a correct read-out of the hue.

George Rey
  • 450
  • 3
  • 7