请,我试图检测手指'视频中的动作。首先,我想应用肤色检测将手与背景分开,然后我找到手计数器,然后计算凸点以检测手指。我现在想从这个视频中看到的是一个新视频,只显示两个敲击手指(或它们的轮廓)的移动,如图所示。
我使用此代码检测肤色:
function OutImg=Skin_Detect(I)
% clear
% I=imread('D:\New Project\Movie Frames from RLC_L_FTM_IP60\Frame
0002.png');
I=double(I);
[hue,s,v]=rgb2hsv(I);
cb = 0.148* I(:,:,1) - 0.291* I(:,:,2) + 0.439 * I(:,:,3) + 128;
cr = 0.439 * I(:,:,1) - 0.368 * I(:,:,2) -0.071 * I(:,:,3) + 128;
[w h]=size(I(:,:,1));
for i=1:w
for j=1:h
if 138<=cr(i,j) && cr(i,j)<=169 && 136<=cb(i,j) && cb(i,j)<=200 &&
0.01<=hue(i,j) && hue(i,j)<=0.2
segment(i,j)=1;
else
segment(i,j)=0;
end
end
end
% imshow(segment);
OutImg(:,:,1)=I(:,:,1).*segment;
OutImg(:,:,2)=I(:,:,2).*segment;
OutImg(:,:,3)=I(:,:,3).*segment;
% figure,imshow(uint8(im));
当我将它应用于图像时,相同的代码工作正常,但是当我将其应用于视频时,我没有检测到任何内容,如下所示:
videoFReader = vision.VideoFileReader('RLC_L_FT_IP60.m4v');
% Create a video player object for displaying video frames.
videoPlayer = vision.DeployableVideoPlayer;
% Display the original video
while ~isDone(videoFReader)
videoFrame = step(videoFReader);
% Track using the Hue channel data
Out=Skin_Detect(videoFrame);
step(videoPlayer,Out);
end
请问,有什么建议和想法可以解决这个问题吗?
如果有人可以用不同的代码帮助解决这个问题,我将非常感激。 提前谢谢。
答案 0 :(得分:0)
我有类似的问题。我认为一种正确的方法是使用分类器,即使它是一个简单的&#34;分类器......这是我在解决方案中遵循的步骤:
1)我使用了RGB色彩空间和Mahalanobis距离作为肤色模型。它速度快,工作得很好。
2)连接组件:使用小结构元素的简单形态学关闭操作可用于连接在不完美阈值处理期间可能断开连接的区域,如手的手指。
3)特征提取:例如,区域,周长和周长区域的比率。
4)分类:使用SVM分类器执行最终分类。我希望你已经标记了该过程的培训数据。
我并没有完全解决你的具体问题,但也许它可以给你一些想法...... :)
答案 1 :(得分:0)
如果您不坚持自己写作,则可以使用Google的MediaPipe进行手部和手指跟踪。
信息:
https://ai.googleblog.com/2019/08/on-device-real-time-hand-tracking-with.html
台式机和Android的示例:
https://github.com/google/mediapipe/blob/master/mediapipe/docs/hand_tracking_mobile_gpu.md