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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • centos7 输入 ifconfig 不显示 ip 地址 连接不上的解决方法(亲测成功)「建议收藏」

    centos7 输入 ifconfig 不显示 ip 地址 连接不上的解决方法(亲测成功)「建议收藏」最近又把自己的虚拟机打开了玩玩集群,遇到一个小问题,我发现虚拟机的内存不够了,就把虚拟机关机加大了内存,谁知道开机后,ifconfig或者ipaddr显示没有ip地址,只显示一个lo,没有ens33,没有ip地址就没法用xshell连接,很蛋疼,网上也有很多解决方案,但都写的乱七八糟的,而且很多都不好使,今天就来介绍一下我最后解决的方法.我说一下我的虚拟机的情况,我三台虚拟机,之前是mas………

    2025年8月8日
    6
  • CIDR地址块及其子网划分(内含原始IP地址分类及其子网划分的介绍)

    CIDR地址块及其子网划分(内含原始IP地址分类及其子网划分的介绍)CIDR地址块及其子网划分1.CIDR概述及其地址块计算  CIDR中文全称是无分类域间路由选择,英文全称是ClasslessInter-DomainRouting,在平常,大家多称之为无分类编址,它也是构成超网的一种技术实现。2.CIDR子网划分3.总结

    2022年4月29日
    98
  • Zigbee协议栈中文说明

    Zigbee协议栈中文说明1.概述 1.1解析ZigBee堆栈架构ZigBee堆栈是在IEEE802.15.4标准基础上建立的,定义了协议的MAC和PHY层。ZigBee设备应该包括IEEE802.15.4(该标准定义了RF射频以及与相邻设备之间的通信)的PHY和MAC层,以及ZigBee堆栈层:网络层(NWK)、应用层和安全服务提供层。图1-1给出了这些组件的概况。1.1.1ZigBee堆栈层每个Z

    2022年5月8日
    40
  • 图形推理1000题pdf_小学三年级逻辑推理题,学霸1分钟能做对4题,最后一题难坏家长…[通俗易懂]

    图形推理1000题pdf_小学三年级逻辑推理题,学霸1分钟能做对4题,最后一题难坏家长…[通俗易懂]逻辑推理是考察学生数学逻辑推理能力的重要方法,也是为了进入高年级以后锻炼解析几何和证明题的基础条件之一,一般小学生逻辑推理好的数学成绩都不会差,能够锻炼学生的发散思维能力,帮助快速的找出解题思路。不管是逻辑推理题还是证明题,都是让学生由已知条件解析出未知条件,已知条件里边有很多内在的关联信息,但是需要学生仔细观察,如果找不出内在的关系,这道题十有八九是解不出来的,这种题型不仅学生要善于分析还要懂得…

    2025年10月14日
    5
  • C#验证码的实现_验证码怎么实现

    C#验证码的实现_验证码怎么实现一.编程思想(1).验证码由四位随机数字或者字母组成,此时就要考虑怎么获取随机数(2).各个字符之间怎么进行连接(3).当点击更换时会重新生成四位随机数(4).四位字符的显示二.代码的实现(1).引入伪随机数生成器Random,生成随机数实例化Random:Randomp=newRandom();//表示伪随机数生成器Randomp=newRandom();……

    2025年10月16日
    3
  • odrive教程(处理器2O11接口)

    输入接口在开发自定义ODrive控制代码时,建议您的电动机可以自由连续旋转,并且不与行程有限的传动系统连接ODrive可以通过各种端口和协议进行控制。如果您对嵌入式熟悉的话也可以直接在ODrive上运行自定义代码。请参考ODrive固件开发指南。文章目录输入接口引脚说明引脚功能优先级模拟输入霍尔信号反馈引脚native协议Python其它编程语言ASCII协议ArduinoStep/…

    2022年4月14日
    209

发表回复

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

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