MATLAB中文论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 16937|回复: 79|关注: 0

视频跟踪标记

  [复制链接]

83

主题

3392

帖子

63

最佳答案
  • 关注者: 199
发表于 2011-9-1 12:52:04 | 显示全部楼层 |阅读模式
简介
通过帧差法进行视频跟踪,并做标记。

代码

  1. % By lyqmath @ Matlab中文论坛
  2. clc; clear all; close all;
  3. avi = mmreader('samplevideo.avi');
  4. for i = 1 : avi.NumberOfFrames
  5.     img = read(avi, i);
  6.     pixels(:, :, :, i) = img;
  7.     figure(1); imshow(img, []);
  8.     text(1, 15, sprintf('原视频:%d帧 By lyqmath', i), 'FontWeight', 'Bold', 'Color', 'r');
  9. end
  10. tracking(pixels);
复制代码


  1. function d = tracking(video)
  2. if ischar(video)
  3.     % 载入视频数据
  4.     for i = 1 : avi.NumberOfFrames
  5.         img = read(avi, i);
  6.         pixels(:, :, :, i) = img;
  7.     end
  8. else
  9.     pixels = video;
  10. end
  11. nFrames = size(pixels, 4);
  12. rows = size(pixels, 1);
  13. cols = size(pixels, 2);
  14. % 转换成灰度图像
  15. for i = 1 : nFrames
  16.     pixel(:, :, i) = (rgb2gray(pixels(:,:,:,i)));
  17. end
  18. for i = 2 : nFrames
  19.     d(:, :, i) = (abs(pixel(:,:,i) - pixel(:,:,i-1)));
  20.     bw(:, :, i) = im2bw(d(:, :, i), 0.2);
  21.     % 寻找上下边界
  22.     cou=1;
  23.     for h = 1:rows
  24.         for w = 1:cols
  25.             if bw(h, w, i) > 0.5
  26.                 bottomEdge = h;
  27.                 if cou == 1
  28.                     topEdge = bottomEdge;
  29.                 end
  30.                 cou = cou+1;
  31.                 break;
  32.             end
  33.         end
  34.     end
  35.     % 寻找左右边界
  36.     coun=1;
  37.     for w = 1:cols
  38.         for h = 1:rows
  39.             if bw(h, w, i) > 0.5
  40.                 rightEdge = w;
  41.                 if coun == 1
  42.                     leftEdge = rightEdge;
  43.                     coun = coun+1;
  44.                 end
  45.                 break;
  46.             end
  47.         end
  48.     end
  49.     % 矩形框生成
  50.     wd = rightEdge-leftEdge;
  51.     hg = bottomEdge-topEdge;
  52.    
  53.     widt = wd/2;
  54.     heit = hg/2;
  55.     cenx = leftEdge+widt;
  56.     ceny = topEdge+heit;
  57.     % 显示并标记
  58.     figure(1);
  59.     imshow(pixels(:, :, :, i), []);
  60.     hold on
  61.     rectangle('Position',[leftEdge topEdge wd hg], 'EdgeColor', 'r', 'LineWidth', 2);
  62.     plot(cenx, ceny, 'ko', 'MarkerFaceColor', 'y', 'MarkerSize', 20, 'LineWidth', 2);
  63.    
  64.    
  65.     text(1, 15, sprintf('跟踪视频:%d帧 By lyqmath', i), 'FontWeight', 'Bold', 'Color', 'r');
  66.     hold off
  67.   
  68. end
复制代码

视频文件
SampleVideo.zip (610.02 KB, 下载次数: 59401)

83

主题

3392

帖子

63

最佳答案
  • 关注者: 199
 楼主| 发表于 2011-9-1 13:12:26 | 显示全部楼层
ce1_0.gif ce2_0.gif

[ 本帖最后由 lyqmath 于 2011-9-1 13:45 编辑 ]

新手

5 麦片

财富积分


050


0

主题

60

帖子

0

最佳答案
发表于 2011-9-4 11:36:53 | 显示全部楼层
谢谢分享:)

新手

10 麦片

财富积分


050


0

主题

43

帖子

0

最佳答案
发表于 2011-9-4 12:40:43 | 显示全部楼层
简单实用,不错。

新手

5 麦片

财富积分


050


10

主题

66

帖子

0

最佳答案
发表于 2011-9-5 08:55:55 | 显示全部楼层
为什么直接把代码复制到m文件里不能能根执行呢?怎么改呢?不懂啊

新手

5 麦片

财富积分


050


10

主题

66

帖子

0

最佳答案
发表于 2011-9-5 11:02:42 | 显示全部楼层
明白了 得分别复制到两个m文件里才能运行

新手

7 麦片

财富积分


050


3

主题

156

帖子

0

最佳答案
发表于 2011-9-6 11:27:28 | 显示全部楼层
谢谢分享

新手

5 麦片

财富积分


050


0

主题

9

帖子

0

最佳答案
发表于 2011-9-9 19:30:59 | 显示全部楼层
感谢分享

新手

5 麦片

财富积分


050


0

主题

9

帖子

0

最佳答案
发表于 2011-9-9 19:35:16 | 显示全部楼层
感谢分享

新手

5 麦片

财富积分


050


1

主题

20

帖子

0

最佳答案
  • 关注者: 1
发表于 2011-9-10 12:17:25 | 显示全部楼层
感谢楼主
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

联系我们|版权保护|小黑屋|Archiver|手机版|MATLAB中文论坛 ( 苏ICP备08100737号

GMT+8, 2017-4-26 06:09 , Processed in 0.255776 second(s), 89 queries , XCache On.

Powered by Discuz! X3.3

© 2001-2013 Comsenz Inc.

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