C# 用OpenCV打开视频和摄像头

  • Post author:
  • Post category:其他


C#可以用OpenCVSharp来打开视频文件和摄像头。关于OpenCVSharp的安装,用Nuget搜OpenCVSharp就会出来一个下载量比较多的library,点击安装后会在解决方案中出现 x64和 x86两个文件,同时在 引用 中会自动加入 OpenCvSharp等几个library这时便可以在C#中使用OpenCV了。

OpenCV中最重要的概念是 Mat 的使用,Mat就是Matrix的缩写-矩阵,视频也是由一帧一帧的图片组成,所以原理就是按一定时间读取视频的每一帧并输出到画布上,同时要释放已用完的资源。

       var capture = new VideoCapture(@"D:\1.mp4");

        //此处参考网上的读取方法
        int sleepTime = (int)Math.Round(1000 / capture.Fps);

        using (var window = new Window("capture"))
        {
            // 声明实例 Mat类
            Mat image = new Mat();

            // 进入读取视频每镇的循环
            while (true)
            {
                capture.Read(image); 
                //判断是否还有没有视频图像 
                if(image.Empty())
                    break;

            // 在picturebox中播放视频, 需要先转换成bitmap格式
             picturebox1.image = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(image); 

            // 在Window窗口中播放视频
            window.ShowImage(image);   

              Cv2.WaitKey(sleepTime);
            } 
        }

关于打开摄像头的方法,思路就是VideoCapture为视频捕捉,既然能把视频放入videoCapture中播放出来,那么也可以把摄像头拍摄的作为视频传入Mat类中,再一帧一帧的播放出来。查了下网上的资料,是说用 videoCapture(0)就可以捕捉到摄像头。做成的代码如下。

       var capture = new VideoCapture(0);

        //此处参考网上的读取方法
        int sleepTime = (int)Math.Round(1000 / capture.Fps);

        using (var window = new Window("capture"))
        {
            // 声明实例 Mat类
            Mat image = new Mat();

            // 进入读取视频每镇的循环
            while (true)
            {
                capture.Read(image); 
                //判断是否还有没有视频图像 
                if(image.Empty())
                    break;

            // 在picturebox中播放视频, 需要先转换成bitmap格式
             picturebox1.image = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(image); 

            // 在Window窗口中播放视频
            window.ShowImage(image);   

              Cv2.WaitKey(sleepTime);
            } 
        }

其实就这么简单,只要想通了原理,改一下就OK了



版权声明:本文为hkmaike原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。