Error with matrix dimensions

2 vues (au cours des 30 derniers jours)
Srdjan
Srdjan le 18 Nov 2014
Commenté : Srdjan le 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 commentaires
Andrew Reibold
Andrew Reibold le 18 Nov 2014
Modifié(e) : Andrew Reibold le 18 Nov 2014
You will need to make them both the same size to use the subtraction operation in line 14 on them.
What code are you using to make the 768x1 into a 256x3? (What code are you using giving you the A(I)=B error. That should be easy to troubleshoot hopefully) I assume you are just trying to split it into 3 parts?
There are more efficient ways to make a new matrix, but have you tried something like this?
prevHist2(:,1) = prevHist(1:256)
prevHist2(:,2) = prevHist(257:512)
prevHist2(:,3) = prevHist(513:768)
and then using the new version of prevHist that is now rearranged?
Andrew Reibold
Andrew Reibold le 18 Nov 2014
Nevermind, I see you have a solution! Best wishes

Connectez-vous pour commenter.

Réponse acceptée

MA
MA le 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 commentaire
Srdjan
Srdjan le 18 Nov 2014
Thx mate, it works fine. :)

Connectez-vous pour commenter.

Plus de réponses (2)

MA
MA le 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 le 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 commentaire
Srdjan
Srdjan le 18 Nov 2014
Your example helped a lot, thank you.

Connectez-vous pour commenter.

Catégories

En savoir plus sur Get Started with MATLAB dans Help Center et File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by