Detection problem in a video for hand detection?
3 次查看(过去 30 天)
显示 更早的评论
I'm doing hand detection and tracking using skin color method. I'm not using Viola-Jones method as it requires training. The problem is that when i use the detection code(shown below) the hand is detected but when i use the same code in a video nothing is detected.
The code for the detection of hand is;
%Read the image, and capture the dimensions
tic;
img_orig = imread('65.png');
height = size(img_orig,1);
width = size(img_orig,2);
%Initialize the output images
out = img_orig;
bin = zeros(height,width);
%Convert the image from RGB to YCbCr
img_ycbcr = rgb2ycbcr(img_orig);
Cb = img_ycbcr(:,:,2);
Cr = img_ycbcr(:,:,3);
%Detect Skin
[r,c,v] = find(Cb>=67 & Cb<=137 & Cr>=133 & Cr<=173);
numind = size(r,1);
numcol = size(r,2);
%Mark Skin Pixels
for i=1:numind
out(r(i),c(i),:) = [0 0 255];
bin(r(i),c(i)) = 1;
end
% Detect radius
[x1,y1] = find(out(:,:,3) == 255, 1,'first');
[x2,y2] = find(out(:,:,3) == 255, 1, 'last');
% Detect Hand Center
hits = 0;
hitsArr = zeros(1,height);
for i = 1:height
hits = numel(find(bin(i,:) == 1));
hitsArr(i) = hits;
end
maxHitr = max(hitsArr);
y = find(hitsArr == maxHitr,1,'first');
hitsArr = zeros(1,width);
for i = 1:width
hits = numel(find(bin(:,i) == 1));
hitsArr(i) = hits;
end
maxHitc = max(hitsArr);
x = find(hitsArr == maxHitc,1,'first');
label = 'Hand';
position = [x y abs(y2-y1)/2; x y 1];
img_out = insertObjectAnnotation(img_orig,'Circle',position,label);
imshow(img_orig);
figure; imshow(img_out);title('Detected hand');
imwrite(img_out,'hand_detect.jpg');
% viscircles([x y],abs(y2-y1)/2,'EdgeColor','r');
% viscircles([x y],1,'EdgeColor','r');
% figure; imshow(out);
figure; imshow(bin);
toc;
and image for the detected hand is
Now when i use the code for detection in a video nothing is detected.
the code is this;
filename = 'hand_2.wmv';
video = vision.VideoFileReader(filename);
player = vision.DeployableVideoPlayer('Location', [10,100],'FrameRate',30);
while ~isDone(video)
img_orig = step(video);
% Capture the dimensions
height = size(img_orig,1);
width = size(img_orig,2);
%Initialize the output images
out = img_orig;
bin = zeros(height,width);
%Convert the image from RGB to YCbCr
img_uint8 = uint8(img_orig);
img_ycbcr = rgb2ycbcr(img_uint8);
Cb = img_ycbcr(:,:,2);
Cr = img_ycbcr(:,:,3);
%Detect Skin
[r,c,v] = find(Cb>=67 & Cb<=137 & Cr>=133 & Cr<=173);
numind = size(r,1);
%Mark Skin Pixels
for i=1:numind
out(r(i),c(i),:) = [0 0 255];
bin(r(i),c(i)) = 1;
end
% Detect radius
[x1,y1] = find(out(:,:,3) == 255, 1,'first');
[x2,y2] = find(out(:,:,3) == 255, 1, 'last');
if isempty(y1) && isempty(y2)
y1 = 2; y2 = 0;
end
% Detect Hand Center
hits = 0;
hitsArr = zeros(1,height);
for i = 1:height
hits = numel(find(bin(i,:) == 1));
hitsArr(i) = hits;
end
maxHitr = max(hitsArr);
y = find(hitsArr == maxHitr,1,'first');
hitsArr = zeros(1,width);
for i = 1:width
hits = numel(find(bin(:,i) == 1));
hitsArr(i) = hits;
end
maxHitc = max(hitsArr);
x = find(hitsArr == maxHitc,1,'first');
label = 'Hand';
position = [x y abs(y2-y1)/2; x y 1];
img_out = insertObjectAnnotation(img_orig,'Circle',position,label);
step(player, img_out);
end
release(video);
release(player);
What could be the problem?
3 个评论
Yash Gajjar
2020-1-9
I'm working on a similar project, but I need to use webcam and not video. I have tried changing out the image code to webcam compatible code but with no success. It would be great if you could help me with this issue...thx! -ygajjar005@gmail.com
回答(1 个)
Image Analyst
2014-2-16
You might need to adjust your Cb and Cr thresholds. Otherwise use the debugger to figure out where it's coming out zeros when it should be giving something non-zero.
0 个评论
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Computer Vision with Simulink 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!