Help me to optimize this code to perform better Image Processing
Ältere Kommentare anzeigen
I am working on a Computer Vision project which involves analyzing and exporting Pixel intensities of RGB over a Region of Interest from a frame. Please look into the code i have attached here and suggest me some best ways to optimize this code. It's taking me a minimum of 5 seconds to maximum of 7 seconds per frame, to analyze and export desired data.
path='/Users/sathwikchowda/Desktop/morselab/matlab-testing/videos/1Hz-Transmission.avi';
video_files = dir(fullfile(path,'*.avi'));
movieFullFileName = fullfile(path,video_files.name);
tic
videoObject = VideoReader(movieFullFileName);
% Determine how many frames there are.
numberOfFrames = videoObject.NumFrames;
%numberOfFrames = 1000; % <-------------------------------- For changing number of frames
vidHeight = videoObject.Height;
vidWidth = videoObject.Width;
numberOfFramesWritten = 0;
% Loop through the movie, writing all frames out.
% Each frame will be in a separate file with unique name.
meanGrayLevels = zeros(numberOfFrames, 1);
meanRedLevels = zeros(numberOfFrames, 1);
meanGreenLevels = zeros(numberOfFrames, 1);
meanBlueLevels = zeros(numberOfFrames, 1);
bits = zeros(numberOfFrames,1);
thisFrame = read(videoObject, 1);
imshow(thisFrame, []);
axis on;
set(gcf, 'Position', get(0,'Screensize')); % Maximize figure.
h_rect = imrect();% this helps us to draw over the frame
% Rectangle position is given as [x, y, width, height]
pos_rect = h_rect.getPosition();
% Round off so the coordinates can be used as indices
pos_rect = round(pos_rect);
disp(pos_rect)
for frame = 1 : numberOfFrames
% Extract the frame from the movie structure.
thisFrame = read(videoObject, frame);
thisFrame = imcrop(thisFrame,pos_rect);
% Calculate the mean gray level.
grayImage = rgb2gray(thisFrame);
meanGrayLevels(frame) = mean(grayImage(:));
% Calculate the mean R, G, and B levels.
meanRedLevels(frame) = mean(mean(thisFrame(:, :, 1)));
meanGreenLevels(frame) = mean(mean(thisFrame(:, :, 2)));
meanBlueLevels(frame) = mean(mean(thisFrame(:, :, 3)));
%THRESHOLD
threshold = mean(meanBlueLevels);
Levels = table(meanRedLevels,meanBlueLevels,meanGreenLevels,meanGrayLevels, 'VariableNames',{'Red-Pixel-Intensity','Blue-Pixel-Intensity','Green-Pixel-Intensity','Gray-Levels'});
writetable(Levels,'5Hz-PI-info.csv');
type 5Hz-PI-info.csv
% bit-stream to csv file
if (meanBlueLevels(frame) ~=0)
if (meanBlueLevels(frame) >= threshold )
bits = 1;
else
bits = 0;
end
% dlmwrite('5Hz-binary.csv', bits, '-append')
writematrix(bits,'5Hz-binary.csv','WriteMode','append')
T3 = table(pos_rect(1),pos_rect(2),pos_rect(3),pos_rect(4),'VariableNames',{'X-coordinates','Y-coordinates','Width','Height'});
writetable(T3,'5Hz-ROI-position-coordinates.csv');
type 5Hz-ROI-position-coordinates.csv
end
progressIndication = sprintf('Processed frame %4d of %d.', frame, numberOfFrames);
disp(progressIndication)
end
toc
Akzeptierte Antwort
Weitere Antworten (0)
Kategorien
Mehr zu Image Data Acquisition finden Sie in Hilfe-Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!