查看: 11402|回复: 29|关注: 0

[我分享] 分享一个基于特征点的人脸检测跟踪程序吧

[复制链接]

MATLAB 图像处理与计算机视觉
版块优秀回答者

入门

105 麦片

财富积分


50500


11

主题

472

帖子

18

最佳答案
  • 关注者: 23
发表于 2014-3-27 19:09:53 | 显示全部楼层 |阅读模式
最近一直在看computer vison toolbox。里面有个例子是讲基于点跟踪的PointTracker类。稍微改写了一下这个例子,可以直接在摄像头里来跟踪。这个程序只适合单个人脸的跟。出现跟丢的情况的话,程序会自动进行检测,直到检测出人脸后,才开始继续跟踪。
  1. function PointBasedTrackFace()
  2. %% 摄像头格式,根据实际情况自行设定
  3. Format =  'YUY2_320x240';
  4. %==========================================================================
  5. %% 创建窗口.
  6. figure_handle = figure('Name', 'Camera Demo',...
  7.     'MenuBar', 'none',...
  8.     'NumberTitle', 'off',...
  9.     'ToolBar', 'none',...
  10.     'Tag', 'camera_demo',...
  11.     'Units', 'pixels');
  12. myhandles.figure_handle = figure_handle;
  13. %==========================================================================
  14. %% 设置参数
  15. myhandles.vid = videoinput('winvideo', 1, Format);
  16. vidRes = get(myhandles.vid, 'VideoResolution');
  17. set(myhandles.vid, 'ReturnedColorSpace', 'rgb',...
  18.     'TimerPeriod', 0.1);
  19. triggerconfig(myhandles.vid, 'manual');
  20. set(figure_handle, 'Position', [500 300 vidRes(1)+10 vidRes(2)+100]);

  21. %==========================================================================
  22. %% 界面设计
  23. myhandles.axes = axes('Parent', figure_handle,...
  24.     'Tag', 'image',...
  25.     'Units', 'pixels',...
  26.     'Position',[0 100 vidRes(1) vidRes(2)],...
  27.     'Color', [0 0 0],...
  28.     'XTick',[],...
  29.     'YTick',[]);
  30. myhandles.button_startStop = uicontrol('Parent', figure_handle,...
  31.     'Style', 'pushbutton',...
  32.     'Units', 'pixels',...
  33.     'String', 'Start',...
  34.     'Position', [20 30 60 30],...
  35.     'CallBack',{@startStop_callback, myhandles});
  36. myhandles.button_close = uicontrol('Parent', figure_handle,...
  37.     'Style', 'pushbutton',...
  38.     'Units', 'pixels',...
  39.     'String', 'Close',...
  40.     'Position', [230 30 60 30],...
  41.     'CallBack', {@close_callback, myhandles});
  42. %==========================================================================
  43. %% 设置videoinput对象的定时器回调函数
  44. set(myhandles.vid, 'TimerFcn', {@camera_TimerFcn, myhandles});
  45. %% 将界面移到屏幕中心
  46. movegui(figure_handle, 'center');
  47. end

  48. %==========================================================================
  49. %% callback函数
  50. %--------------------------------------------------------------------------
  51. % 摄像头的定时器callback函数
  52. function camera_TimerFcn(hObject, eventdata, varargin)
  53. global start_flag pointTracker oldPoints flag
  54. if start_flag
  55.     frame = getsnapshot(hObject);
  56.     if ~flag
  57.         [pointTracker, oldPoints] = face_points_detect(frame);
  58.     end
  59.     if ~isempty(oldPoints)
  60.         flag = true;
  61.     end
  62.     if flag
  63.         %disp('tracking...');
  64.         [points, isFound] = step(pointTracker, rgb2gray(frame));
  65.         visiblePoints = points(isFound, :);
  66.         oldInliers = oldPoints(isFound, :);
  67.         
  68.         if size(visiblePoints, 1) >= 2 % need at least 2 points
  69.             % Estimate the geometric transformation between the old points
  70.             % and the new points and eliminate outliers
  71.             [~, ~, visiblePoints] = estimateGeometricTransform(...
  72.                 oldInliers, visiblePoints, 'similarity', 'MaxDistance', 4);
  73.             % Display tracked points
  74.             frame = insertMarker(frame, visiblePoints, 'plus', ...
  75.                 'Color', 'red');
  76.             
  77.             % Reset the points
  78.             oldPoints= visiblePoints;
  79.             setPoints(pointTracker, oldPoints);
  80.         else
  81.             flag = false;
  82.         end
  83.     end
  84.     if ~flag
  85.         frame = insertText(frame, [10 10], 'detecting...', 'FontSize', 18);
  86.     else
  87.         frame = insertText(frame, [10 10], 'tracking...', 'FontSize', 18);
  88.     end
  89.     imshow(frame);
  90. end
  91. end
  92. %--------------------------------------------------------------------------
  93. % 开始停止按钮的callback函数
  94. function startStop_callback(hObject,eventdata, varargin)
  95. global start_flag flag
  96. myhandles = varargin{1};
  97. vid = myhandles.vid;
  98. if strcmp('Stop', get(hObject, 'String'))
  99.     stop(vid);
  100.     set(hObject, 'String', 'Start');
  101.     start_flag = false;
  102. elseif strcmp('Start', get(hObject, 'String'))
  103.     start(vid);
  104.     start_flag = true;
  105.     flag = false;
  106.     set(hObject, 'String', 'Stop');
  107. end
  108. end
  109. %--------------------------------------------------------------------------

  110. %--------------------------------------------------------------------------
  111. % 关闭按钮的callback函数
  112. function close_callback(hObject,eventdata, varargin)
  113. global start_flag
  114. start_flag = false;
  115. myhandles = varargin{1};
  116. vid = myhandles.vid;

  117. choice = questdlg('Would you want to exit?', 'warning','Yes','No','No');
  118. switch choice
  119.     case 'Yes'
  120.         stop(vid);
  121.         delete(vid)
  122.         close;
  123.     case 'No'
  124.         start_flag = true;
  125.         return;
  126. end
  127. end
  128. %--------------------------------------------------------------------------

  129. %--------------------------------------------------------------------------
  130. % 检测人脸的函数
  131. function [pointTracker, oldPoints] = face_points_detect(frame)
  132. oldPoints = [];
  133. pointTracker = [];
  134. faceDetector = vision.CascadeObjectDetector();
  135. bbox = step(faceDetector, frame);

  136. if ~isempty(bbox)
  137.     max_area = 0;
  138.     for i = 1: size(bbox, 1)
  139.         if bbox(i,3)*bbox(i,4) > max_area
  140.             max_area = bbox(i,3)*bbox(i,4);
  141.             max_idx = i;
  142.         end
  143.     end
  144.     % Detect feature points in the face region.
  145.     points = detectMinEigenFeatures(rgb2gray(frame), 'ROI', bbox(max_idx,:));
  146.     if ~isempty(points)
  147.         oldPoints= points.Location;
  148.         pointTracker = vision.PointTracker('MaxBidirectionalError', 2);
  149.         initialize(pointTracker, oldPoints, rgb2gray(frame));
  150.     end
  151. end
  152. end
复制代码
回复主题 已获打赏: 0 积分

举报

新手

18 麦片

财富积分


050


6

主题

45

帖子

0

最佳答案
  • 关注者: 2
发表于 2014-4-20 19:33:01 | 显示全部楼层
参数设置这部分可否将下,我联想笔记本电脑,怎么设置
回复此楼 已获打赏: 0 积分

举报

MATLAB 图像处理与计算机视觉
版块优秀回答者

入门

105 麦片

财富积分


50500


11

主题

472

帖子

18

最佳答案
  • 关注者: 23
 楼主| 发表于 2014-4-22 09:18:57 | 显示全部楼层
HerT 发表于 2014-4-20 19:33
参数设置这部分可否将下,我联想笔记本电脑,怎么设置

什么参数?
回复此楼 已获打赏: 0 积分

举报

新手

18 麦片

财富积分


050


6

主题

45

帖子

0

最佳答案
  • 关注者: 2
发表于 2014-4-22 12:54:58 | 显示全部楼层

设置电脑摄像头参数这部分语句不太懂
回复此楼 已获打赏: 0 积分

举报

新手

18 麦片

财富积分


050


6

主题

45

帖子

0

最佳答案
  • 关注者: 2
发表于 2014-4-22 13:07:50 | 显示全部楼层

myhandles.vid = videoinput('winvideo', 1, Format);
这句出错,错误如下
>> PointBasedTrackFace
Undefined function 'videoinput' for input arguments of type 'char'.

Error in PointBasedTrackFace (line 15)
myhandles.vid = videoinput('winvideo', 1, Format);
回复此楼 已获打赏: 0 积分

举报

MATLAB 图像处理与计算机视觉
版块优秀回答者

入门

105 麦片

财富积分


50500


11

主题

472

帖子

18

最佳答案
  • 关注者: 23
 楼主| 发表于 2014-4-22 14:28:31 | 显示全部楼层
HerT 发表于 2014-4-22 12:54
设置电脑摄像头参数这部分语句不太懂

这个你得去看帮助文档啊。你先查看自己的摄像头支持的格式,然后把Format换成需要格式
回复此楼 已获打赏: 0 积分

举报

新手

18 麦片

财富积分


050


6

主题

45

帖子

0

最佳答案
  • 关注者: 2
发表于 2014-4-22 18:33:32 | 显示全部楼层
荒草 发表于 2014-4-22 14:28
这个你得去看帮助文档啊。你先查看自己的摄像头支持的格式,然后把Format换成需要格式 ...

不是啊,Format我电脑和你一样,Undefined function 'videoinput' for input arguments of type 'char'.这句错误是什么问题啊
回复此楼 已获打赏: 0 积分

举报

论坛优秀回答者

中级

948 麦片

财富积分


5001500


3

主题

2218

帖子

205

最佳答案
  • 关注者: 44
发表于 2014-4-22 22:39:50 | 显示全部楼层
HerT 发表于 2014-4-22 18:33
不是啊,Format我电脑和你一样,Undefined function 'videoinput' for input arguments of type 'char'. ...

你可能没有image acquisition toolbox, 所以找不到videoinput这个function.
回复此楼 已获打赏: 0 积分

举报

MATLAB 图像处理与计算机视觉
版块优秀回答者

入门

105 麦片

财富积分


50500


11

主题

472

帖子

18

最佳答案
  • 关注者: 23
 楼主| 发表于 2014-4-22 23:38:50 | 显示全部楼层
HerT 发表于 2014-4-22 18:33
不是啊,Format我电脑和你一样,Undefined function 'videoinput' for input arguments of type 'char'. ...

你matlab是哪个版本啊?还是没有安装相应的工具箱?
回复此楼 已获打赏: 0 积分

举报

新手

18 麦片

财富积分


050


6

主题

45

帖子

0

最佳答案
  • 关注者: 2
发表于 2014-4-23 12:52:43 | 显示全部楼层
bertcool 发表于 2014-4-22 22:39
你可能没有image acquisition toolbox, 所以找不到videoinput这个function.

有可能!
回复此楼 已获打赏: 0 积分

举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /4 下一条

快速回复 返回顶部 返回列表