本例演示了如何从相机preview缓冲区获取YCbCr模块,并且转化为ARGB。

1. 什么是YCbCr

  • y:像素的亮度。以范围从 0 到 255 的字节值形式返回(亮度值始终为正值)。

  • cr:像素的红色色差(色差)。以有符号值的形式返回,范围从 -128 到 127 的整数值。

  • cb:像素的蓝色色差(色差)。以有符号值的形式返回,范围从 -128 到 127 的整数值。

常见的3 个基本色彩模型是RGB,CMYKYUV

YCbCr是YUV压缩和偏移的版本,但是Cb,Cr 同样都指色彩,只是在表示方法上不同而已。在YUV 家族中,YCbCr 是在计算机系统中应用最多的成员,其应用领域很广泛,JPEGMPEG均采用此格式。

YCbCr是DVD、摄像机、数字电视等消费类视频产品中,常用的色彩编码方案。YCbCr 有时会称为 YCC.。Y'CbCr 在模拟分量视频(analog component video)中也常被称为 YPbPr。YCbCr不是一种绝对色彩空间,是YUV压缩和偏移的版本。

2. YCbCr与RGB的相互转换

主要的采样格式有: YCbCr 4:2:0、YCbCr 4:2:2、YCbCr 4:1:1和 YCbCr 4:4:4。其中YCbCr 4:1:1 比较常用,其含义为:每个点保存一个 8bit 的亮度值(也就是Y值),每 2x2 个点保存一个 Cr 和Cb 值,图像在肉眼中的感觉不会起太大的变化。所以,原来用 RGB(R,G,B 都是 8bit unsigned) 模型,每个点需要 8x3=24 bits(如下图第一个图). 而现在仅需要 8+(8/4)+(8/4)=12bites,平均每个点占12bites。这样就把图像数据压缩了一半。

YCbCr与RGB的相互转换
Y=0.299R+0.587G+0.114B
Cb=0.564(B-Y)
Cr=0.713(R-Y)
-------------------------------------------------------------
R=Y+1.402Cr
G=Y-0.344Cb-0.714Cr
B=Y+1.772Cb

3. WP中相机获取相机缓冲区

WP中,您可以采用编程方式访问设备相机。除了拍摄照片之外,您还可以访问相机预览缓冲区以实时处理相机帧。PhotoCamera 类的GetPreviewBuffer 方法采用两种格式(ARGB 和 YCbCr)提供相机预览缓冲区中的帧。ARGB 是用于描述应用程序 UI 中颜色的格式。YCbCr 启用高效的图形处理,但不能由 Silverlight 使用。如果您想在您的应用程序中操作某个 YCbCr 帧,则需要将该帧转换为 ARGB,然后该帧才能显示。

详细见:

http://technet.microsoft.com/zh-cn/subscriptions/hh394035

代码分析:

1. Rectangle由一个VideoBrush填充。

            <Rectangle.Fill>
<VideoBrush x:Name="viewfinderBrush">
<VideoBrush.RelativeTransform>
<RotateTransform CenterX="0.5" CenterY="0.5" x:Name="viewfinderBrushTransformation" />
</VideoBrush.RelativeTransform>
</VideoBrush>
</Rectangle.Fill>

VideoBrush 是一种类似于 LinearGradientBrush 或 ImageBrush 对象的 Brush 对象,可以用来填充Fill或者设置ForeGround,BackGround。

2. 为VideoBrush设置Srouce

                cam = new PhotoCamera();
cam.Initialized += new EventHandler<CameraOperationCompletedEventArgs>(cam_Initialized);
viewfinderBrush.SetSource(cam);

3. 在后台线程中处理 相机预览缓冲区的 Frame

            if (cam != null)
{
Dispatcher.BeginInvoke(delegate()
{
// Set the orientation of the viewfinder.
viewfinderBrushTransformation.Angle = cam.Orientation;
}); // Start the background worker thread that processes the camera preview buffer frames.
bgPleaseExit = false;
bgThread = new Thread(colorConversionBackgroundWorker);
bgThread.Start();
}

4. colorConversionBackgroundWorker函数 实现

        private void colorConversionBackgroundWorker()
{
// Grouping the property change notifications in a batch.
List<PropertyChangedEventArgs> changeCache = new List<PropertyChangedEventArgs>();
changeCache.Add(new PropertyChangedEventArgs("CbText"));
/*
// For binding from the color plane label.
public string CbText
{
get { return string.Format("Cb = {0}", Cb); }
} <TextBlock Canvas.Left="16" Canvas.Top="114" Text="{Binding CbText}" />
*/
changeCache.Add(new PropertyChangedEventArgs("CrText"));
changeCache.Add(new PropertyChangedEventArgs("CrOffset"));
changeCache.Add(new PropertyChangedEventArgs("CbOffset"));
changeCache.Add(new PropertyChangedEventArgs("YOffset"));
changeCache.Add(new PropertyChangedEventArgs("ArgbText"));
changeCache.Add(new PropertyChangedEventArgs("ArgbBrush")); // 获取相机YCbCr的像素布局. 它包含了cr, cb等offset, pitch等信息
var bufferLayout = cam.YCbCrPixelLayout; // 获取容纳YCbCr的一帧的缓冲区大小
byte[] currentPreviewBuffer = new byte[bufferLayout.RequiredBufferSize]; // 循环获取相机缓冲区
while (!bgPleaseExit)
{
// 取得当前相机的帧的YCbCr数据
cam.GetPreviewBufferYCbCr(currentPreviewBuffer); // The output parameters used in the following method.
byte y;
int cr;
int cb; // 从bufferLayout中获取 Y,Cb,Cr的值
// This location is estimated to be X=320, Y=240. Adjust as desired.
GetYCbCrFromPixel(bufferLayout, currentPreviewBuffer, , , out y, out cr, out cb); // Set page-level properties to the new YCbCr values.
Y = y;
Cb = cb;
Cr = cr; Dispatcher.BeginInvoke(delegate()
{
// not threadsafe, but unlikely to be a problem in this case // Consolidating change notifications
if (PropertyChanged != null)
{
foreach (var change in changeCache)
PropertyChanged(this, change);
}
});
}
}

例子:Camera Color Picker Sample (YCbCr->ARGB)的更多相关文章

  1. [wordpress]后台自定义菜单字段和使用wordpress color picker

    Wordpress Version 4.4.2 参考链接 插件使用wordpress color picker:Add A New Color Picker To WordPress 后台菜单自定义字 ...

  2. 【WPF/C#】图层筛选/拾取——Color Picker

    文章标题实在不懂怎么表述才清楚. 描述问题:多个图片(图层)重叠时,如何通过鼠标点击来拾取到相应的图层.因为图层中会有很多空白的地方(比如图片四周),要求是获取鼠标点击位置的像素颜色值,如果为空白时或 ...

  3. 使用canvas制作的移动端color picker

    使用canvas制作的移动端color picker 项目演示地址(用手机或者手机模式打开) 我在另一个中demo,需要用到color picker,但是找不到我需要的移动端color picker, ...

  4. NX二次开发-Block UI C++界面Object Color Picker(对象颜色拾取器)控件的获取(持续补充)

    Object Color Picker(对象颜色拾取器)控件的获取 NX9+VS2012 #include <uf.h> #include <uf_obj.h> UF_init ...

  5. 例子:Execution Model Sample - 应用状态保存

    WP中,当你的应用被切换到后台 后,就进入了休眠状态,然后当一个应用从墓碑恢复时,如何恢复相应的状态,该例子就演示了如何保存和恢复UI以及APP相关状态. 这里有一篇很好的文章,请参见: http:/ ...

  6. 例子:RSS Reader Sample

    本例演示了Rss xml信息的获取,以及如何使用SyndicationFeed来进行符合Rss规范的xml进行解析. SyndicationFeed 解析完成后 可以得到SyndicationItem ...

  7. 例子:Basic Lens sample

    本例演示了如何自己扩展一个Camera Lens. 1. UI界面是一个MediaViewer <controls:MediaViewer x:Name="MediaViewer&qu ...

  8. [UE4] C++实现Delegate Event实例(例子、example、sample)

    转自:http://aigo.iteye.com/blog/2301010 虽然官方doc上说Event的Binding方式跟Multi-Cast用法完全一样,Multi-Cast论坛上也有很多例子, ...

  9. 颜色采集器colpick Color Picker

    简单 RGB.HSB.十六进制颜色选取器 jQuery 插件. 非常直观类似 Photoshop 的界面. 光明和黑暗很容易自定义 CSS3 外观. 28 KB 总由浏览器加载看起来不错甚至在 IE7 ...

随机推荐

  1. winform异步系统升级—BackgroundWorker

    BackgroundWorker用法实例 自己的代码,就是要执行的代码写到dowork里,ProgressChanged事件是控制进度时用的,最后的Completed事件进度完成,也就是dowork里 ...

  2. [阅读笔记]Zhang Y. 3D Information Extraction Based on GPU.2010.

    1.立体视觉基础 深度定义为物体间的距离 视差定义为同一点在左图(reference image) 和右图( target image) 中的x坐标差. 根据左图中每个点的视差得到的灰度图称为视差图. ...

  3. .ashx datatable转excel

    using System;using System.Collections;using System.Collections.Generic;using System.Data;using Syste ...

  4. java:StringBuffer字符处理对象

    1.添加字符 public class StringBufferDemo { public static void main(String args[]) { StringBuffer sbf = n ...

  5. LogConfigruration

    import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import ...

  6. 搭建nginx+tomcat+Java的负载均衡环境

    转载  未测 供参考 另外这篇文章也不错.http://blog.csdn.net/wang379275614/article/details/47778201 一.简介: Tomcat在高并发环境下 ...

  7. MySQL 日期时间相关函数整理

    -- 为日期增加一个时间间隔:date_add() SELECT NOW(); YEAR); MONTH); DAY); HOUR); MINUTE); SECOND); MICROSECOND); ...

  8. final发布评语

    final发布评语: 1.约跑(nice!)发布者:组长李权以及组员刘芳芳和于淼,对于约跑APP,final发布主要完成对于用户提出的(1.对话字数多导致头像被挤掉2.返回时没有完全退出)问题修改成功 ...

  9. C++语法-指针 (1)

    <C++程序设计> 谭浩强  清华大学出版社 2016-08-03 1.P167 一般的C++编译系统为每个指针变量分配4个字节的存储单元,用来存放变量的地址. 2.P169 .cpp文件 ...

  10. JavaScript的面向对象编程(OOP)(二)——原型

    关于JavaScript的原型模式,下面的是学习后的个人理解,若是有偏差,还请指出,谢谢 JavaScript原型模式 1.什么是原型? 原型是一个对象,其他的对象可以通过它实现属性的继承,所有的对象 ...