如何使用emgucv 读取 kinect彩色影像 使用wpf

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用emgucv 读取 kinect彩色影像 使用wpf相关的知识,希望对你有一定的参考价值。

参考技术A http://www.dotblogs.com.tw/v6610688/archive/2013/10/28/emgucv_kinectsdk_wpf.aspx

这是Kinect v1的。你翻墙down 那两个工具类,然后修改 Kinect sdk带的 ColorBasic-WPF 示例代码。
我瞎胡改的,要想会用 还是得去熟悉EmguCV。
//转型成EMGU用
Image<Bgr, Byte> convertImage = colorFrame.ToOpenCVImage<Bgr, Byte>();
Image<Gray, Byte> grayFrame = convertImage.Convert<Gray, Byte>();
Image<Gray, Byte> cannyFrame = grayFrame.Canny(100.0, 60.0);
Image.Source = cannyFrame.ToBitmapSource();

colorBitmap.WritePixels(new Int32Rect(0, 0, sensor.ColorStream.FrameWidth, sensor.ColorStream.FrameHeight), colorPixels, this.colorBitmap.PixelWidth * sizeof(int), 0);

Kinect V2 基础教程之彩色图像

  本程序为自己所写,参考素材包括微软官方例子和外文资料,自己做了部分的优化。本人没有学过图像处理,解释的如果有问题,恳请大家指正.

后台代码:

using System.ComponentModel;
using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using Microsoft.Kinect;

namespace KinectV2
{
    /// <summary>
    /// MainWindow.xaml 
    /// </summary>
    public partial class MainWindow : Window
    {
        #region 定义变量

        // kinect设备
        KinectSensor kinect;

        //彩色帧读取
        ColorFrameReader colorFrameReader;

        //一帧图像的性质描述
        FrameDescription colorFrameDesc;

        //枚举类型,定义彩色帧的格式(共6种)
        //此处规定彩色帧格式为Bgra格式:4字节存储一个像素点,包含blue,green,red,alpha(即像素点亮度值)
        ColorImageFormat colorFormat = ColorImageFormat.Bgra;

        //创建用于显示图像的位图
        WriteableBitmap colorBitmap;

        //用于存放一帧彩色图像的所有信息(byte 类型,每个元素占一个字节) 
        byte[] colorBuffer;

        //一帧彩色图像的步长(物理意义:此处表示一帧图像的每一行需占用的字节个数)(作用:渲染位图时需要提供图像的步长)
        int colorStride;

        //存放彩色图像的矩形画布(作用:渲染位图时需要提供画布位置和大小)
        Int32Rect colorRect;

        #endregion


        public MainWindow()
        {
            InitializeComponent();

            #region 变量初始化、赋值

            // 获取默认的kinect传感器
            kinect = KinectSensor.GetDefault();

            //启动传感器
            kinect.Open();

            //确定彩色帧的数据类型
            colorFrameDesc = kinect.ColorFrameSource.CreateFrameDescription(colorFormat);

            // 创建并返回一个新的读取对象
            colorFrameReader = kinect.ColorFrameSource.OpenReader();

            //触发彩色帧事件
            colorFrameReader.FrameArrived += colorFrameReader_FrameArrived;

            //彩色位图初始化(96,96表示分辨率,即96像素/英寸)
            colorBitmap = new WriteableBitmap(colorFrameDesc.Width, colorFrameDesc.Height, 96, 96, PixelFormats.Bgra32, null);

            //图像步长初始化
            colorStride = colorFrameDesc.Width * (int)colorFrameDesc.BytesPerPixel;//(int)colorFrameDesc.BytesPerPixel = 4,每个像素点占4字节

            //画布矩形框初始化
            colorRect = new Int32Rect(0, 0, colorFrameDesc.Width, colorFrameDesc.Height);

            //计算总共需要多少个字节才能储存一帧图像的所有像素点
            colorBuffer = new byte[colorStride * colorFrameDesc.Height];

            //彩色位图和UI界面图片控件关联
            ImageColor.Source = colorBitmap;    //即实时的将获取的彩色帧信息描绘在ImageColor控件中

            #endregion
        }

        #region 处理来自传感器的彩色帧 事件

        //彩色帧触发事件
        void colorFrameReader_FrameArrived(object sender, ColorFrameArrivedEventArgs e)
        {
            //更新彩色帧,然后描绘彩色帧
            UpdateColorFrame(e);
            DrawColorFrame();
        }

        private void UpdateColorFrame(ColorFrameArrivedEventArgs e)
        {
            // 获取一帧彩色图像
            using (var colorFrame = e.FrameReference.AcquireFrame())
            {
                if (colorFrame == null)
                {
                    return;
                }
                // 将一帧彩色图像数据以‘colorFormat’格式拷贝放到‘colorBuffer’中
                colorFrame.CopyConvertedFrameDataToArray(colorBuffer, colorFormat);
            }
        }

        private void DrawColorFrame()
        {
            // 将获取的一帧彩色图像数据更新到位图中
            colorBitmap.WritePixels(colorRect, colorBuffer, colorStride, 0);
        }
        #endregion



        //程序窗口关闭事件
        private void Window_Closing(object sender, CancelEventArgs e)
        {
            // 释放彩色帧资源
            if (colorFrameReader != null)
            {
                colorFrameReader.Dispose();
                colorFrameReader = null;
            }
            //关闭kinect传感器
            if (kinect != null)
            {
                kinect.Close();
                kinect = null;
            }
        }

    }
}

XAML界面代码:

<Window x:Class="KinectV2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Closing="Window_Closing" >
    <Grid Width="512" Height="424">
        <Image x:Name="ImageDepth"  />
    </Grid>
</Window>

 

以上是关于如何使用emgucv 读取 kinect彩色影像 使用wpf的主要内容,如果未能解决你的问题,请参考以下文章

Kinect结合Unity基础使用(一)

Kinect For Windows V2开发日志二:Kinect V2的基本参数

通过 OpenNI 建立 Kinect 3D Point Cloud

如何在没有来自 Kinect Window SDK 的 Coordinatemapper 的情况下将 3D 骨骼关节映射回 2D 彩色图像

EmguCV:使用光流在运动物体上绘制轮廓?

标定Kinect v2彩色摄像头:使用iai_kinect2,采用qhd(960*540)大小的彩色图像