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. }  
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • stopwords.txt中英文数据集,四川大学机器智能实验室停用词库,哈工大停用词表,中文停用词表,百度停用词表百度网盘下载

    stopwords.txt中英文数据集,四川大学机器智能实验室停用词库,哈工大停用词表,中文停用词表,百度停用词表百度网盘下载今天找stopwords.txt数据集找了好长时间,真是气死了,好多都是需要金币,这数据集不是应该共享的么。故搜集了一些数据集,主要包括四川大学机器智能实验室停用词库,哈工大停用词表,中文停用词表,百度停用词表和一些其他的stopword.text。最后用python将这些数据集合并成一个完整的数据集stopword.txt。百度网盘地址在链接:https://pan.baidu.com/s/1KBkOzYk-wRYaWno6HSOE9g提取码:4sm6文件不是很大可以直接下载。下面是详细的目录。

  • ora-01006:绑定变量不存在_并非所有变量已绑定怎么解决

    ora-01006:绑定变量不存在_并非所有变量已绑定怎么解决今天碰到一个很普通的问题:ORA-01008:并非所有的变量都已绑定,看着错误的提示,总以为是自己的变量和值不是对称的,检查了很多遍,最后没撤,还是在网上搜了,搜了很多方法,都说事因为自己的变量和值没有一一对应。后来,无意看到了一句话,可能是因为变量的值是null造成的,而并非值和和变量没有一一对应。经检查发现,确实有一个值是null,不是空格,然后把值改成空格,就好了。在BS系统中,使用&nbs

  • SpringFramework5.0 @Indexed注解 简单解析

    纸上得来终觉浅 绝知此事要躬行 —陆游最近在看SpringBoot核编程思想(核心篇),看到走向注解驱动编程这章,里面有讲解到:在SpringFramework5.0引入了一个注解@Indexed ,它可以为Spring的模式注解添加索引,以提升应用启动性能。官网地址:Spring Framework 5.1.12.RELEASE beans-scanning-index…

  • errorcode=-4499 sqlstate=08001_math方法

    errorcode=-4499 sqlstate=08001_math方法java.sql.SQLException:java.lang.ClassCastException:java.math.BigIntegercannotbecasttojava.lang.Long

  • elasticsearch面试常问问题_面试题 谈谈你对加班的看法

    elasticsearch面试常问问题_面试题 谈谈你对加班的看法前言随着企业对近实时搜索的迫切需求,Elasticsearch受到越来越多的关注,无论是阿里、腾讯、京东等互联网企业,还是平安、顺丰等传统企业都对Elasticsearch有广泛的使用,但是在Elasticsearch6.8发布以前,大部分Elasticsearch功能都是付费的,开源版本的Elasticsearch在集群管控方面能力有限,鉴于此,通用的实施方案就是给Elasticsearch添加一层网关,从而实现对Elasticsearch的管控。全套Java面试资料白嫖:

  • 从零开始学_JavaScript_系列(27)——dojo的文档相关模块

    从零开始学_JavaScript_系列(27)——dojo的文档相关模块先上图:dojo/dom模块:dojo/dom参数:dom方法:①dom.byId(id,doc);用于通过id来选择某个dom结点;②dom.isDescendant(node,ancestor);确认某个node是否是另外一个结点的子节点;③dom.setSelectable(node,se

发表回复

您的电子邮箱地址不会被公开。

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