使用的是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(); } }