Silverlight中摄像头的运用—part2

Silverlight 4 中摄像头的运用—part1
将跟踪颜色视作输入 

好了,我们能够跟踪到这个颜色了,那这么做的意义是什么呢?实际上,我们可以根据它的位置来移动东西。接下来的例子中,创建的一个球会跟随这个颜色一起移动。你可以用来作出很诡异的对象跟随画面移动的效果。 

关键代码:

===================================
//part2
Ellipse ball = new Ellipse();
CompositeTransform ballctf;

 


ball.Width = 20;
ball.Height = 20;
ball.Fill = new SolidColorBrush(Colors.Orange);
ballctf = new CompositeTransform();
ball.RenderTransform = ballctf;


            labRes.Content = "捕获颜色=" + found.ToString();
            labPoint.Content = "坐标=" + _lastPoint.X.ToString() + "," + _lastPoint.Y.ToString();

            ballctf.TranslateX = _lastPoint.X;
            ballctf.TranslateY = _lastPoint.Y;

            Debug.WriteLine(found);

===================================
File?id=df5kjk97_1136ffdqp5c3_b

 

分析移动区域

    在这一节,我们虽然还不去涉及如何跟踪物体的具体轨迹,但会知道如何判断是否有移动。  一个基本概念是:如果有移动,每帧的画面会明显不同。所以,如果发现两帧画面中位图的像素有不同的地方,就能知道发生了移动。 

有两个潜在元素。第一,我们需要两张位图。第二,我们还需要一个比较函数。如果,你正在想着是否需要遍历所有像素来进行比较,那么我告诉你,这里有一个很实用的技巧:使用混合模式。绘制时如果不指定混合模式,新的像素值就会完全覆盖以取代存在的像素值。这也是我们至今为止一直在做的事情。如果使用混合模式,新的像素会影响已存在的像素,两张图片会以一种特别的方式混合在一起。而此刻,我们要用的混合模式叫做difference(差异),它对两张图片的红、绿、蓝三个通道的每个像素进行一次比较,然后给出它们之间的相减所得的差值。如果两个像素完全一致,那么结果就是0,也就是黑色,否则就是别的其它什么值(颜色)。这样,我们就把跟踪移动的问题简化了,只要寻找非黑色区域即可。 
===================================
public partial class MotionTracking : UserControl
    {
        CaptureSource _captureSource;
        VideoCaptureDevice _video;
        VideoBrush _videoBrush;
        Rectangle _rect;
        Image _wb_image;
        WriteableBitmap _wb = null;
        bool _isEnableCamera = false;

        WriteableBitmap _newFrameBitmap;
        WriteableBitmap _oldFrameBitmap;

        Image _newFrame;
        Image _oldFrame;

        public MotionTracking()
        {
            InitializeComponent();

            _captureSource = new CaptureSource();
            _video = CaptureDeviceConfiguration.GetDefaultVideoCaptureDevice();
            if (_video != null)
            {
                _video.DesiredFormat = _video.SupportedFormats[1];
                _captureSource.VideoCaptureDevice = _video;
                _videoBrush = new VideoBrush();
                _videoBrush.SetSource(_captureSource);
            }
            CompositionTarget.Rendering += new EventHandler(OnRender);

            btnStart.Click += new RoutedEventHandler(btnStart_Click);


            this.imageEffectsListBox.Items.Add(new NormalEffect());

            this.imageEffectsListBox.Items.Add(new DarkenEffect());
            this.imageEffectsListBox.Items.Add(new MultiplyEffect());
            this.imageEffectsListBox.Items.Add(new ColorBurnEffect());
            this.imageEffectsListBox.Items.Add(new LinearBurnEffect());

            this.imageEffectsListBox.Items.Add(new LightenEffect());
            this.imageEffectsListBox.Items.Add(new ScreenEffect());
            this.imageEffectsListBox.Items.Add(new ColorDodgeEffect());
            this.imageEffectsListBox.Items.Add(new LinearDodgeEffect());

            this.imageEffectsListBox.Items.Add(new OverlayEffect());
            this.imageEffectsListBox.Items.Add(new SoftLightEffect());
            this.imageEffectsListBox.Items.Add(new HardLightEffect());
            this.imageEffectsListBox.Items.Add(new VividLightEffect());
            this.imageEffectsListBox.Items.Add(new LinearLightEffect());
            this.imageEffectsListBox.Items.Add(new PinLightEffect());

            this.imageEffectsListBox.Items.Add(new DifferenceEffect());
            this.imageEffectsListBox.Items.Add(new ExclusionEffect());

            this.imageEffectsListBox.Items.Add(new GlowEffect());
            this.imageEffectsListBox.Items.Add(new ReflectEffect());

            this.imageEffectsListBox.Items.Add(new HardMixEffect());
            this.imageEffectsListBox.Items.Add(new NegationEffect());
            this.imageEffectsListBox.Items.Add(new PhoenixEffect());

            this.imageEffectsListBox.Items.Add(new AverageEffect());

            this.imageEffectsListBox.SelectedIndex = 0;
        }

        void btnStart_Click(object sender, RoutedEventArgs e)
        {
            if (CaptureDeviceConfiguration.AllowedDeviceAccess ||
                CaptureDeviceConfiguration.RequestDeviceAccess())
            {
                _rect = new Rectangle();
                _rect.Width = 320;
                _rect.Height = 240;

                _rect.Fill = _videoBrush;
                _rect.Visibility = Visibility.Collapsed;
                video_Canvas.Children.Add(_rect);

                _newFrameBitmap = new WriteableBitmap(_rect, null);
                _oldFrameBitmap = new WriteableBitmap(_rect, null);

                _newFrame = new Image();
                _newFrame.Width = 320;
                _newFrame.Height = 240;
                _newFrame.Source = _newFrameBitmap;
                _newFrame.Visibility = Visibility.Collapsed;

                _oldFrame = new Image();
                _oldFrame.Width = 320;
                _oldFrame.Height = 240;
                _oldFrame.Source = _oldFrameBitmap;

                video_Canvas.Children.Add(_oldFrame);
                video_Canvas.Children.Add(_newFrame);

                

                _captureSource.Start();
                _isEnableCamera = true;



                Thread thread = new Thread(new ThreadStart(ThreadProc));
                thread.Start();

            }
        }

        void OnRender(object sender, EventArgs e)
        {
            if (_isEnableCamera)
            {
                MatrixTransform transform = new MatrixTransform();
                transform.Matrix = new Matrix(-1, 0, 0, 1, 320, 0);
                
                _newFrameBitmap.Render(_rect, transform);
                _newFrameBitmap.Invalidate();
            }
        }

        void ThreadProc()
        {
            while (true)
            {
                Thread.Sleep(20);

                //Do the action in the UI thread
                Dispatcher.BeginInvoke(ThreadUpdate);
            }
        }

        void ThreadUpdate()
        {
            if (_isEnableCamera)
            {
                _oldFrameBitmap.Render(_newFrame, null);
                _oldFrameBitmap.Invalidate();
            }
        }

        private void imageEffectsListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            BlendModeEffect effect = e.AddedItems[0] as BlendModeEffect;
            if (effect != null)
            {
                if (_oldFrameBitmap != null)
                {
                    ImageBrush _newImageBrush = new ImageBrush();
                    _newImageBrush.ImageSource = _newFrameBitmap;
                    ImageBrush _oldImageBrush = new ImageBrush();
                    _oldImageBrush.ImageSource = _oldFrameBitmap;

                    //effect.AInput = _oldImageBrush;
                    effect.BInput = _newImageBrush;
                    this._oldFrame.Effect = effect;
                }
            }
        }
    }
===================================
File?id=df5kjk97_1137c4kpw3fp_b
File?id=df5kjk97_1138gwgvvwc8_b
当运行刚启动,会出现一张纯黑色的矩形。但接着就会看到鬼一样移动的轮廓。这个轮廓就是两帧画面的不同之处。

接下来再使用threshold滤镜来对图片进行一下处理,对移动区域做更加精细的捕捉。

参考这里:http://kodierer.blogspot.com/2009/07/livin-on-edge-silverlight-parametric_4324.html
File?id=df5kjk97_1139d6c823hs_b

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/298277.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

同学,解决下这个 Bug!

一些解决 Bug 的小技巧大家好,我是鱼皮。学编程的过程中,我们会遇到各式各样的 Bug,也常常因为它们而感到头秃。但随着你不断解决 Bug、积累经验,就会发现其实解决 Bug 也是有套路的。今天分享下鱼皮自己总结的解决 Bug 套路&…

如果给你一个亿,你想去干嘛?各专业的科研狗是这样回答的……

全世界只有3.14 % 的人关注了爆炸吧知识“如果现在给你一个亿,你想去做什么?”每天都被穷醒的小天一看到,立马展开了丰富的想象力:首先,当然少不了买买买,将一切之前想要的、不想要的,贵的、更贵…

头文件定义全局变量_5.2 C++局部变量与全局变量 | 输出局部全局变量

C局部变量C局部变量是指:在一个函数内部定义的变量,它只在本函数范围内有效,也就是说只有在本函数内才能使用它,在此函数以外是不能使用这些变量的。同样,在复合语句中定义的变量只在本复合语句范围内有效,…

java float转换成long_在Java中如何将float转换为long或int数据类型?

float f1.2f;double dDouble.parseDouble(String.valueOf(f));System.out.println(d);直接转换会设计到精度问题,所以需要借助字符串 保证不丢失数据www.shufadashi.com防采集。楼主您好,如果float是个整数,强制转换即可,可以捕捉…

Spark 1.2 发布,开源集群计算系统

2019独角兽企业重金招聘Python工程师标准>>> Spark 1.2 发布,此版本包括 172 位贡献者和超过 1000 个 commits。 此版本包括 Spark 核心操作和性能改进;添加新的网络传输子系统,进行了较大的改进;Spark SQL 引入了一个…

[转载].SSRAM、SDRAM和Flash简要介绍

转CalmBright兄的博文:http://www.cnblogs.com/CalmBright/archive/2009/07/19/1526569.html Abstract 在用NIos II 调试sdram遇到了其容量计算的问题,现介绍如下 Introduction 问题1:什么是DRAM、SRAM、SDRAM? 答:名词…

调整 Docker 中 nginx 的日志级别

调整 Docker 中 nginx 的日志级别Intro最近发现我们的一个应用产生了很多日志,而这些日志大多都是 nginx 的 access_log,我们默认会把标准输出收集到 es 里分析应用日志,但是很多都是 access_log 就可能会掩盖掉真实的错误日志,所…

Oracle B-Tree Index 原理

一. B-Tree Index 原理 官网说明: No index structure can satisfy all needs, but the self-balancing B-tree index comes closest to optimizing the performance of searches on large sets of data. Each B-tree node holds multiple keys and pointers. The m…

曾改变世界的最强科学,为什么我们对它的误解却越来越多?

古往今来,我们评价一个人有学识,总是形容:“上知天文下知地理”。也会要求一个人“读万卷书,行万里路”。美国认知心理学家Nora S. Newcombe认为:孩子常常看地图、爱看地图,能提高他们的空间想象力&#xf…

多线程环境下,程序真是危机四伏

姿势在不断的更新迭代, 太卷了。你管这也叫线程安全?最近大意了,竟然想将《面试官:实现一个带值变更通知能力的Dictionary》一文中的临界锁只应用到写操作。内心旁白:读操作又不会修改数据,无论是新值还是旧…

眼见不一定为实!18个神奇的视错觉,看完不相信眼睛系列

全世界只有3.14 % 的人关注了爆炸吧知识来源:普象工业设计小站在家长时间网上冲浪总有时候感觉眼睛出了毛病不信,你看为啥这个明明是个三棱锥怎么突然变成了正方体我是“瞎”了么啊啊啊啊后来,去找了资料才发现这原来是一家幻觉博物馆的展品玩…

怎么用java ee编程_Java EE应用程序入门 - 编程入门网

Java EE应用程序入门时间:2011-07-06 netbeans.org本文将详细介绍使用 EJB 3.0 技术开发企业应用程序的基础知识,而 EJB 3.0 是 Java EE 5 平台的组成部分。本文还将阐述如何通过 EJB 3.0 技术简化开发企业应用程序的流程。本文使用的是 NetBeans IDE 6.0 发行版。先…

vb6 由于超出容量限制 不能创建新事务_分布式限流?你也能轻松玩转(没啥新技术)...

点击蓝色「日拱一兵」关注,持续侦破 Java 技术案件一、什么是限流?为什么要限流?不知道大家有没有做过帝都的地铁,就是进地铁站都要排队的那种,为什么要这样摆长龙转圈圈?答案就是为了限流!因为…

Managing Gigabytes--文本压缩

开门见山,文本压缩可以归纳为两大类, 符号方法和字典方法, 下面分别介绍下: 1)符号方法,symbolwise method普通编码方式是每个字符都采用相同位数编码, 比如asc码, 每个字符都是8位编码。那么现…

基于事件驱动架构构建微服务第8部分:在应用程序上实现事件溯源

原文链接:https://logcorner.com/building-microservices-through-event-driven-architecture-part8-implementing-eventsourcing-on-application/在本文中,我将讨论应用程序上的事件溯源实现。该层围绕领域并实现用例(特定于应用程序的业务规…

我们来聊点成年人的话题!

1 这个话题透漏着成年人都存在的问题,其中心思想行走在道德底线,让人不得不深思,句句入心2 哈哈哈哈哈哈哈哈哈哈哈哈哈画面惊人 图自动漫次元酱3 对不起,我不是你家的鸡,我是一只大鸟!!&#x…

yum安装最新的 LNMP

2019独角兽企业重金招聘Python工程师标准>>> 先添加几个源: rpm -Uvh http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-1.noarch.rpm rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm 1,安装nginx&a…

C#新版本风格项目文件(SDK风格项目 SDK-style project)

在VisualStudio中创建NetCore以上版本的项目,使用的都是新版本风格的项目文件。和旧版本.NetFramework版本的项目文件区别:双击项目可直接打开csproj文件进行编辑配置项目文件内容的改变项目属性文件夹图标更改项目引用去除,改成依赖项Nuget包…

史上最丧心病狂的商品定价套路:如何从数学角度,榨干你身上的每一分钱

全世界只有3.14 % 的人关注了爆炸吧知识世上没有精明的买家,只有精明的卖家。的确,卖家的嘴,骗人的鬼。在买与卖的博弈中,没有一个买家可以取胜。别不信,今天就让你见识下“卖家套路终极奥义”。按量定价,是…

东北大姐剪纸被误认为油画,遭人质疑二十多年,只因太过逼真,看完后:真香!不愧是天下第一剪!...

全世界只有3.14 % 的人关注了爆炸吧知识“这是剪纸?太惟妙惟肖了,我还以为是水彩画呢!”这是一位网友的留言。茂盛的树木、潺潺的流水……这些栩栩如生的场景,真难想象竟是出自,一双巧手和一把剪刀。这些作品,全部来自…