繁体   English   中英

播放视频时手部检测代码不起作用?

[英]Hand detection code not working while playing video?

我正在进行手部检测和跟踪。 问题是我已经开发了用于检测图像中的手及其代码(如下图所示)的代码(如下所示),但是问题是,当我使用录制的视频运行相同的代码时,没有检测到甚至跟踪到手(如图所示)。

手动检测录制视频的图像片段

视频片段未检测到手

视频的代码是

filename = 'hand_2.wmv';
video = vision.VideoFileReader(filename);
player = vision.DeployableVideoPlayer('Location', [10,100],'FrameRate',60);

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);

为了检测单个图像,代码为:

%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;

我最初以为这是因为视频的帧速率,但是更改它也无济于事。 并且如上所述,当我运行视频进行检测和跟踪代码失败时。 任何帮助将不胜感激。

发生这种情况的原因是,当您从png文件中读取图像时,会得到一个uint8图像,其像素值介于0到255之间。另一方面, vision.VideoFileReader为您提供了一个类为single的图像,其像素值归一化为介于0和255之间1.您可以通过将“ VideoOutputDataType”设置为“ uint8”来解决此问题:

video = vision.VideoFileReader(filename, 'VideoOutputDataType', 'uint8');

在另一个主题上,如果要跟踪手,则可能要尝试使用vision.HistogramBasedTrackervision.PointTracker

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM