Error with matrix dimensions

3 views (last 30 days)
Srdjan
Srdjan on 18 Nov 2014
Commented: Srdjan on 18 Nov 2014
Hi, I'm making a code for scene cut detection, but I always get an error for line 14: matrix dimensions must agree... How do I fix this? Thank you.
THRESH = 0.5;
video = mmreader('rhinos.avi');
numFrames = video.NumberOfFrames;
prevHist = zeros(256*3,1);
diffHist= zeros(numFrames,1);
cutInd = 1;
for i = 1 : numFrames
currFrame = read(video, i);
currHistR = imhist(currFrame(:, :, 1));
currHistG = imhist(currFrame(:, :, 2));
currHistB = imhist(currFrame(:, :, 3));
currHist = [currHistR currHistG currHistB];
whos prevHist currHist;
diffHist(i) = sqrt(sum((currHist - prevHist).^2));
if (diffHist(i) > THRESH)
cutFrames(:, :, :, cutInd) = currFrame(:, :, :);
cutInd = cutInd + 1;
end
prevHist = currHist;
end
stem(diffHist);
figure;
montage(cutFrames);
  4 Comments
Andrew Reibold
Andrew Reibold on 18 Nov 2014
Nevermind, I see you have a solution! Best wishes

Sign in to comment.

Accepted Answer

MA
MA on 18 Nov 2014
you have two mistake:
prevHist = zeros(256*3,1)
and
diffHist(i) = sqrt(sum((currHist - prevHist).^2))
your correct code should be:
clear all
close all
clc;
THRESH = 0.5;
video = mmreader('rhinos.avi');
numFrames = video.NumberOfFrames;
prevHist = zeros(256,3);
diffHist= zeros(numFrames,1);
cutInd = 1;
for i = 1 : numFrames
currFrame = read(video, i);
currHistR = imhist(currFrame(:, :, 1));
currHistG = imhist(currFrame(:, :, 2));
currHistB = imhist(currFrame(:, :, 3));
currHist = [currHistR currHistG currHistB];
whos prevHist currHist;
diffHist(i) = sqrt(sum((currHist(i) - prevHist(i)).^2));
if (diffHist(i) > THRESH)
cutFrames(:, :, :, cutInd) = currFrame(:, :, :);
cutInd = cutInd + 1;
end
prevHist = currHist;
end
stem(diffHist);
figure;
montage(cutFrames);
  1 Comment
Srdjan
Srdjan on 18 Nov 2014
Thx mate, it works fine. :)

Sign in to comment.

More Answers (2)

MA
MA on 18 Nov 2014
you have two mistake:
prevHist = zeros(256*3,1)
and
diffHist(i) = sqrt(sum((currHist - prevHist).^2))
your correct code should be:
clear all
close all
clc;
THRESH = 0.5;
video = mmreader('rhinos.avi');
numFrames = video.NumberOfFrames;
prevHist = zeros(256,3);
diffHist= zeros(numFrames,1);
cutInd = 1;
for i = 1 : numFrames
currFrame = read(video, i);
currHistR = imhist(currFrame(:, :, 1));
currHistG = imhist(currFrame(:, :, 2));
currHistB = imhist(currFrame(:, :, 3));
currHist = [currHistR currHistG currHistB];
whos prevHist currHist;
diffHist(i) = sqrt(sum((currHist(i) - prevHist(i)).^2));
if (diffHist(i) > THRESH)
cutFrames(:, :, :, cutInd) = currFrame(:, :, :);
cutInd = cutInd + 1;
end
prevHist = currHist;
end
stem(diffHist);
figure;
montage(cutFrames);

Kevin Claytor
Kevin Claytor on 18 Nov 2014
Let's take a look at the definition of;
diffHist= zeros(numFrames,1);
This is a [numFrames x 1] size array. Into this you're trying to put;
sqrt(sum((currHist - prevHist).^2));
So, first in regards to the sizes, you can only subtract them if they're the same size;
>> size(currHist)
>> 256x3
>> size(prevHist)
>> 768x1
Which you seem to have resolved in your comments. But now you're trying to put a 256x3 array (sqrt(...)) into a 1x1 slot (diffHist(i)). Either you want the entire array;
diffHist = zeros(256, 3, numFrames);
diffHist(:, :, i) = sqrt(...)
Or you just want some representative value of the difference histogram;
temp_dist_hist = sqrt(...);
representative_value = sum(temp_dist_hist(:)); % Just an example, depends on what you're trying to do
diffHist(i) = representative_value;
Hope, this helps.
  1 Comment
Srdjan
Srdjan on 18 Nov 2014
Your example helped a lot, thank you.

Sign in to comment.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!