Kinect+c#视频录像

使用的是vs2012+c#

如遇到Emgu.CV.CvInvoke 的类型初始值设定项引发异常,要有Emgu配置

VS2010C#与 Emgu CV 配置

1、安装 双击安装文件,一路下一步、我同意,配置安装到 C:Program FilesEmguemgucv-windows-universal-gpu 2.4.9.1847

2、设置环境变量(设置之后需重启计算机或注销): PATH (添加如下一行; 如无 PATH, 可自行新建; 如修改了 Emcu CV 的默认安装路径, 请自行修改成相应路径):

;C:Program FilesEmguemgucv-windows-universal-gpu 2.4.9.1847inx86

在用户和系统变量中设置如下的三个路径.

  • C:Emguemgucv-windows-universal-gpu 2.4.9.1847in;

  • C:Emguemgucv-windows-universal-gpu 2.4.9.1847inx64;

  • C:Emguemgucv-windows-universal-gpu 2.4.9.1847inx86;

3、新建项目 新建一个解决方案,并建立一个基于 C#下的 Windows 窗体应用程序的项目 Emgu CV Test

4、导入 UI 插件 点击“工具(T)”->“选择工具箱项(X)…”,在新打开的窗口中选择:“.NET Framework 组件”,点击“浏览”,到目录:D:Program FilesEmguemgucv-windows-universal-gpu 2.4.9.1847in 下,双击Emgu.CV.UI.dll 即可。 看到如图四项之后,点击确定即可。

5、添加引用 右键单击“解决方案资源管理器”中 Emgu CV Test 项目下的“引用”,选择“添加引用”; 在新弹出的窗口中选择“浏览”,到目录:D:Program FilesEmguemgucv-windows-universal-gpu 2.4.9.1847in 下,选择:Emgu.CV.dll、 Emgu.CV.ML.dll、Emgu.CV.UI.dll、Emgu.Util.dll、ZedGraph.dll 等共五个 DLL 文件,并点 击确定加入。 常见错误解决方案:

1、如遇错误提示:tbb_debug.dll 找不到 请下载安装 Intel TBB 库, 需要将 tbb 库或 dll 文件所在路径, 配置带系统环境变量 path 中。

2、如遇错误提示:“Emgu.CV.CvInvoke”的类型初始值设定项引发异常

(1)注销或重启计算机,使得系统环境变量中的 path 生效;

(2)通过 path 中设置的路径去寻找对应的 dll 文件,查看是否存在,是否被成功引用到 VS 中;

(3)copy dll 文件到 debug 和 release 目录中。

(4)尝试将.Net FrameWork 版本降低,如果是 4.0 的就降低到 3.5,如果是 3.5 的就降 低到 2.0。

这个网上还是很多教程的,先是看了VS2010+C#+EmguCV读取和录制视频里面启发很大,关键代码是

private void Play_Click(object sender, EventArgs e)
        {
            if (Play.Text == "播放")
            {//开启播放模式
                OpenFileDialog openFileDialog = new OpenFileDialog();
                openFileDialog.Filter = "AVI文件|*.avi|RMVB文件|*.rmvb|WMV文件|*.wmv|MKV文件|*.mkv|所有文件|*.*";
                if (openFileDialog.ShowDialog() == DialogResult.OK)
                {
                    Application.Idle += new EventHandler(ProcessFrame);
                    capture = new Capture(openFileDialog.FileName);
                    VideoFps = (int)CvInvoke.cvGetCaptureProperty(capture,
                    Emgu.CV.CvEnum.CAP_PROP.CV_CAP_PROP_FPS);
                    Play.Text = "停止";
                    VideoBox.Image = null;
                    Record.Enabled = false;
                }
            }
            else
            {
                capture.Dispose();
                Application.Idle -= new EventHandler(ProcessFrame);
                Play.Text = "播放";
                Record.Enabled = true;
            }
        }

下面写出的是根据csdn上一个前辈分享的案例,但是一直报错,如果你环境安装正确了,那么路子就正了,下面也是关键代码

        /// <summary>
        /// 每一帧彩色图像变化时调用该函数,更新彩色image控件的图像
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void kinectSensor_ColorFrameReady(object sender, ColorImageFrameReadyEventArgs e)
        {
            using (ColorImageFrame frame = e.OpenColorImageFrame())
            {
                if (frame != null)
                {
                    colorImagePixelData = new byte[frame.PixelDataLength];
                    frame.CopyPixelDataTo(colorImagePixelData);
                    this.colorImageBitmap.WritePixels(this.colorImageBitmapRect,
                        colorImagePixelData, this.colorImageStride, 0);
                    Record(frame);
                }
            }
        }

        void Record(ColorImageFrame image)
        {
            if (_isRecording == 0)
            {
                _fileName = string.Format("{0}{1}{2}", _baseDirectory, DateTime.Now.ToString("MMddyyyyHmmss"), ".AVI");
                _isRecording = 1;
                vw = new VideoWriter(_baseDirectory + "1.avi", CvInvoke.CV_FOURCC('X', 'V', 'I', 'D'), 30, 640, 480, true);
                CvInvoke.CV_FOURCC('P', 'I', 'M', '1'); //= MPEG-1 codec 
                CvInvoke.CV_FOURCC('M', 'J', 'P', 'G'); //= motion-jpeg codec (does not work well) 
                CvInvoke.CV_FOURCC('M', 'P', '4', '2');//= MPEG-4.2 codec 
                CvInvoke.CV_FOURCC('D', 'I', 'V', '3');  //= MPEG-4.3 codec 
                CvInvoke.CV_FOURCC('D', 'I', 'V', 'X'); //= MPEG-4 codec 
                CvInvoke.CV_FOURCC('U', '2', '6', '3'); //= H263 codec 
                CvInvoke.CV_FOURCC('I', '2', '6', '3'); //= H263I codec 
                CvInvoke.CV_FOURCC('F', 'L', 'V', '1'); //= FLV1 codec 
            }
            //_videoArray.Add(image.ToOpenCVImage<Rgb, Byte>());

            if (_isRecording == 1) vw.WriteFrame<Bgr, Byte>(image.ToOpenCVImage<Bgr, Byte>());
            if (_isRecording == 2)
            {
                if (vw != null) vw.Dispose();

            }
        }
原文地址:https://www.cnblogs.com/bkycjj/p/3572371.html