emgucv 抠图[通俗易懂]

我的环境的KinectSDK2.0+EmguCV3.0.0依旧还是WinFrom和ImageBox因为需要用到BodyIndex的数据,但BodyIndex的分辨率和RGB图像的分辨率不同,所以需要用的CoordinateMap类中的坐标转换函数。然后直接对colorimage的像素点进行操作。同样,需要用的指针,要把项目调整为允许不安全的代码。代码和注释如

大家好,又见面了,我是你们的朋友全栈君。

我的环境的KinectSDK2.0+EmguCV3.0.0

依旧还是WinFrom和ImageBox

因为需要用到BodyIndex的数据,但BodyIndex的分辨率和RGB图像的分辨率不同,所以需要用的CoordinateMap类中的坐标转换函数。

 

 

代码和注释如下:

[csharp] 
view plain  
copy

 
print
?

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.ComponentModel;  
  4. using System.Data;  
  5. using System.Drawing;  
  6. using System.Linq;  
  7. using System.Text;  
  8. using System.Windows.Forms;  
  9. using Microsoft.Kinect;  
  10. using Emgu.CV;  
  11. using Emgu.CV.Structure;  
  12. using Emgu.Util;  
  13.   
  14. namespace Kinect_koutu_2  
  15. {  
  16.     public partial class Form1 : Form  
  17.     {  
  18.         KinectSensor kinect = null;  
  19.         MultiSourceFrameReader framereader = null;  
  20.         FrameDescription fd = null;  
  21.         FrameDescription cfd = null;  
  22.         CoordinateMapper coordinate = null;  
  23.         Image<Bgra, byte> colorimg = null;  
  24.         DepthSpacePoint[] colorMappedToDepthPoints = null;  
  25.         byte[] colordata = null;  
  26.         public Form1()  
  27.         {  
  28.             InitializeComponent();  
  29.             CvInvoke.UseOpenCL = true;  
  30.             kinect = KinectSensor.GetDefault();  
  31.             coordinate = kinect.CoordinateMapper;  
  32.             framereader = kinect.OpenMultiSourceFrameReader(FrameSourceTypes.Depth | FrameSourceTypes.Color | FrameSourceTypes.BodyIndex);  
  33.             framereader.MultiSourceFrameArrived += Framereader_MultiSourceFrameArrived;  
  34.             fd = kinect.BodyIndexFrameSource.FrameDescription;  
  35.             cfd = kinect.ColorFrameSource.FrameDescription;  
  36.             colorMappedToDepthPoints = new DepthSpacePoint[cfd.Width * cfd.Height];  
  37.             colorimg = new Image<Bgra, byte>(cfd.Width, cfd.Height);  
  38.             colordata = new byte[colorimg.Bytes.Count<byte>()];  
  39.             kinect.Open();  
  40.         }  
  41.         private void Framereader_MultiSourceFrameArrived(object sender, MultiSourceFrameArrivedEventArgs e)  
  42.         {  
  43.             MultiSourceFrame multiSourceFrame = e.FrameReference.AcquireFrame();  
  44.             if (multiSourceFrame == null)  
  45.                 return;  
  46.             ColorFrame cFrame = multiSourceFrame.ColorFrameReference.AcquireFrame();  
  47.             BodyIndexFrame bframe = multiSourceFrame.BodyIndexFrameReference.AcquireFrame();  
  48.             DepthFrame dframe = multiSourceFrame.DepthFrameReference.AcquireFrame();  
  49.             if (dframe == null || bframe == null || cFrame == null)  
  50.             {  
  51.                 Console.WriteLine(“null”);  
  52.                 return;  
  53.             }  
  54.             cFrame.CopyConvertedFrameDataToArray(colordata, ColorImageFormat.Bgra);  
  55.             //colorimg.Bytes = colordata;  
  56.             //imageBox1.Image = colorimg;  
  57.             using (KinectBuffer dB = dframe.LockImageBuffer())  
  58.             {  
  59.                 coordinate.MapColorFrameToDepthSpaceUsingIntPtr(dB.UnderlyingBuffer, dB.Size, colorMappedToDepthPoints);       //坐标转换并储存到数组  
  60.             }  
  61.               
  62.             using (KinectBuffer kB = bframe.LockImageBuffer())  
  63.             {  
  64.                 ProcessBodyIndexFrameData(kB.UnderlyingBuffer);  
  65.                 colorimg.Bytes = colordata;  
  66.                 imageBox1.Image = colorimg;  
  67.             }  
  68.               
  69.             dframe.Dispose();  
  70.             cFrame.Dispose();  
  71.             bframe.Dispose();  
  72.         }  
  73.   
  74.         private unsafe void ProcessBodyIndexFrameData(IntPtr bodyIndexFrameData)  
  75.         {  
  76.             byte* frameData = (byte*)bodyIndexFrameData;  
  77.             int colorMappedToDepthPointCount = this.colorMappedToDepthPoints.Length;  
  78.             fixed (DepthSpacePoint* colorMappedToDepthPointsPointer = this.colorMappedToDepthPoints)  
  79.             {  
  80.                 for (int i = 0; i < colorMappedToDepthPointCount; ++i)  
  81.                 {  
  82.                     float colorMappedToDepthX = colorMappedToDepthPointsPointer[i].X;  
  83.                     float colorMappedToDepthY = colorMappedToDepthPointsPointer[i].Y;  
  84.                     int depthX = (int)(colorMappedToDepthX + 0.5f);         //colorimage的像素点的位置在景深图的对应位置  
  85.                     int depthY = (int)(colorMappedToDepthY + 0.5f);  
  86.                     if ((depthX >= 0) && (depthX < 512) && (depthY >= 0) && (depthY < 424))  
  87.                     {  
  88.                         int depthIndex = (depthY * 512) + depthX;  
  89.                         if (frameData[depthIndex] ==255)             //在检测范围内frameData[depthIndex] !=255 为检测到人的像素点,不予以操作,并将其他像素点设置为黑色  
  90.                         {  
  91.                             colordata[i * 4] = 0;  
  92.                             colordata[i * 4 + 1] = 0;  
  93.                             colordata[i * 4 + 2] = 0;  
  94.                             colordata[i * 4 + 3] = 255;  
  95.                         }  
  96.                     }  
  97.                     else  
  98.                     {  
  99.                         colordata[i * 4] = 0;  
  100.                         colordata[i * 4 + 1] = 0;  
  101.                         colordata[i * 4 + 2] = 0;  
  102.                         colordata[i * 4 + 3] = 255;  
  103.                     }  
  104.                 }  
  105.             }  
  106.         }  
  107.   
  108.         private void Form1_FormClosing(object sender, FormClosingEventArgs e)  
  109.         {  
  110.             if (this.kinect != null)  
  111.             {  
  112.                 this.kinect.Close();  
  113.                 this.kinect = null;  
  114.             }  
  115.         }  
  116.     }  
  117. }  
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/128495.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • django 聚合函数_sql聚合函数的用法

    django 聚合函数_sql聚合函数的用法前言orm模型中的聚合函数跟MySQL中的聚合函数作用是一致的,也有像Sum、Avg、Count、Max、Min,接下来我们逐个介绍聚合函数所有的聚合函数都是放在django.db.models

    2022年7月31日
    4
  • ffmpeg 从入门到精通 笔记《1》「建议收藏」

    ffmpeg 从入门到精通 笔记《1》「建议收藏」ffmpeg从入门到精通笔记《1》

    2022年6月26日
    24
  • java递归函数详解_java保存递归结果

    java递归函数详解_java保存递归结果一、递归函数,通俗的说就是函数本身自己调用自己…如:n!=n(n-1)!你定义函数f(n)=nf(n-1)而f(n-1)又是这个定义的函数。。这就是递归二、为什么要用递归:递归的目的是简化程序设计,使程序易读三、递归的弊端:尽管非递归函数效率高,但较难编程,可读性较差。递归函数的缺点是添加�了系统开销,也就是说,每递归一次,栈内存就多占用一截四、递归的条件:需有完毕任务的语句,需满足递归的要求…

    2022年9月18日
    0
  • img图片加载失败?

    img图片加载失败?问题场景在工作中经常会使用标签进行图片展示,但是经常有图片加载失败的情况发生(图片地址不存在、图片已经删除等)。场景再现图片加载失败时的用户体验是很不好的。虽然标签有alt属性可以展示文本,但是用户体验依然差。代码:&amp;amp;amp;amp;amp;amp;lt;imgalt=&amp;amp;amp;amp;amp;quot;头像&amp;amp;amp;amp;amp;quot;src=&amp;amp;amp;amp;amp;quot;$

    2022年6月2日
    50
  • 5分钟入门Cinemachine智能相机系统

    5分钟入门Cinemachine智能相机系统摘要:相机是Unity世界的眼睛,一个智能相机更是能帮咱们节省大把的时间和精力。Cinemachine现在已经大量应用到各种项目中,如果你还没有用过Cinemachine,墙裂建议你来体验一下。你好,我是跟着大智学Unity的萌新,我叫小新,这是我本周的学习总结报告哦。Cinemachine入门Cinemachine入门还是很容易的,5分钟足矣,但是深入去研究里面也有很多门道。安装C…

    2022年5月28日
    43
  • 手机APP自动化 Appium教程

    手机APP自动化 Appium教程Appium原理与安装Appium是一个移动App(手机应用)自动化工具。手机APP自动化有什么用?自动化完成一些重复性的任务比如微信客服机器人爬虫自动化测试Appium自动化方案的特点:开源免费支持多个平台支持多种类型的自动化支持多种编程语言自动化原理我们先来看一下Appium自动化的原理图这图是不是很眼熟?对啦,和Selenium原理图很像。因为Appium自动化架构就是借鉴的Selenium。大家看看这幅图,包含了3个主体部分:自动化程序

    2022年6月14日
    66

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号