【EMGU CV】油管一个视频合集学习笔记

学习链接:
https://www.youtube.com/playlist?list=PLUSwCY_ybvyLcNxZ1Q3vCkaCH9rjrRxA6
在这里插入图片描述

油管神一般的EMGU教程,唯二缺点是有些内容是17年开始,对现在版本可能不适用,比如Capture类已经替代为VideoCapture类,以及带重口音的英语,建议用英语字幕而不是中文翻译。
还有包括但不限于EMGU、OpenCV官方文档、论坛、博客、CSDN、Stackflow等等等

另,根据我的经验,VS里用C#创建控件布局窗体的时候,先命名英文名,后期再改为中文名,这样在【.cs】的代码页以及【XXX.Designer.cs】的代码里看着吧,没有中文显得很和谐,后期很难改的喵了喵。

内容有点长我感觉,但我又不想分为好几个发出来,擅用【ctrl+f】


80个视频的简介-陆续更新

视频是前面已经说过的,油管
因为我自己是大部分视频都点开看了看的,但不是所有视频都是我需要的,所以我简单做个记录,也方便以后我自己或者其他有需要的人查找。
1+2,下载安装Emgu和VS,配置环境

3、几个控件,HistogramBox ImageBox and PanAndZoomBox

4、边缘检测,只针对图片,有Canny、Sobel和Laplacian,其中Canny有参数设置教程,新建窗口,用的NumericUpDown控件

5、The type initializer for ‘Emgu.CV.CvInvoke’ threw an exception,没看,大概是一个报错处理

6+7、图像二值化,主要是CvInvoke.Threshold和 CvInvoke.AdaptiveThreshold

8、Mean Shift Segmentation,算是分割算法?大概是像素融合弱化细节,具体没操作

9、图像直方图,先显示R\G\B三个图像,再显示直方图,没操作

10、图像颜色变化,rgb转hsv等等等,没细看

11、相机实时捕捉和视频文件播放,只有开始、暂停和结束三个按钮

12、读取非同步大影像,用了Asynchronously这个词,看着像航片或者卫星影像,tif格式,就是图像很大,一般图像打开方式会卡住,这里给个其他方法

13、 图片处理:Erosion、Erosion on Binary、Dilation、Dilate On Binary、Gradient、Top Hat、Black Hat,没做

14、图片分割和覆盖:设了一个Range Filter而且新建一个窗口来调整参数,用的Max和Min滚轮,即Trackerbar控件。但我没有overlay成功,这个RangeFilter的精度也不高,我个人觉得
在这里插入图片描述

15、物体轮廓提取,只针对图片,用的是FindContours()DrawContours(),此外还具体用甜甜圈和矩形框介绍了Contour Methods、Contour Approximation Method及其对应的ChainApproxMethod
【这个我说实话,我拿图片验证,精度非常低,效果不太行,只有强对比图案,或者轮廓非常明显,黑色突出等,才会效果好】

16、Sorting Contours based on bounding box area ,轮廓包围框,只针对图片【字幕识别成西班牙语了我好崩溃,啃生肉+看操作理解】。主要就是用的BoundingRectangle,但是我有个参数愣是没看见视频里代码哪里有,所以没调试成功。【15+16】可以组合放一起其实

17、Text character extraction from images,从图片中提取字符。我没做但看了看,主体代码和【#16】一样,实际是把字母的轮廓提取出来了。有一点需注意是这个视频好像不完整,后面改进结果没有

18、Video Capture in Emgucv 3.3视频捕捉,建议和【#11】结合。【#18】主要针对视频文件进行读取第一帧、播放以及暂停,而【#11】则是对相机实时和视频文件两种进行打开、播放和关闭

19,Real-time text Detection from Videos in Emgu CV,实时文本检测,打开视频用的【#18】代码,后面的检测步骤看了看运行操作,就是检测视频里面的文本区域,并用框圈出来。然后hhhh最后还有一段CCTV的视频测试,汉字也可以检测

20、Capture a particular Frame from video in Emgu CV,调整播放视频文件的速度,根据帧数快进,可以和【#11】、【#18】结合,没做

21、 Write video in Emgu CV,类似于另存为,把一个视频文件保存为另一个,还可以加上一些logo图片啥的,没做

22、How to install Emgu CV 3.3,安装、配置和测试,放在这里我表示疑惑,有需要的可以看看

23、How to load and play video directly in Emgu CV 3.3,DIY视频播放器了,有开始、暂停和结束,还有截图保存到指定文件夹,另用TrackBar可显示和调整进度

24、How to crop an image using mouse selection in Emgu CV,鼠标选择ROI,基于图片
【我一直用的EMGU的控件imageBox,而不是.NET的PixctureBox。需要用ROI功能的必须把属性设置,窗口不要随意放大缩小,详见Emgu文档:ImageBox以及CSDN:PictureBox
在这里插入图片描述
25+26、Digit Recognition with SVM in Emgu CV 3.3,支持向量机在Emgu的数字应用,我只能说,强啊强啊,没做

27、Image Blending | Create a Slide Show Effect in Emgu CV,一组图片制作幻灯片播放效果,嗯玩出花来了开始

28、Face detection using Cascade Classifiers: Haar and LBP,Cascade分类器进行人脸检测,分别用Haar和LBP,用的Github上opencv的在线数据,检测脸、眼睛、嘴等等,用矩形框标出

29、Shape detection using Contours,不同形状的轮廓检测。步骤大概是:高斯滤波、查找轮廓【CvInvoke.FindContours】、一个for循环具体找轮廓(没细看),画轮廓、定义轮廓中心并用文本显示轮廓名称

30、Connected Component Labeling,不知道咋翻译合适了,大概就是一群图案中单击一个显示一个二值化效果,而不是整个图像处理。主要用【ConnectedComponents】,先是二值化【这个视频有对二值化效果的改进处理,可学习】、然后二值化会产生黑底白图案或者白底黑图案的图像,可以点击单个里面各个小图像并且只显示这个小的,
在这里插入图片描述

31、Cropping Objects from Segmented Images,分割图像中进行裁剪,实质上是在【#30】基础上,变为点击某个对象,就裁剪轮廓框内的对象
在这里插入图片描述
32、

错误处理

0 最新版本无bin文件

神奇不神奇,我没有很关键的bin文件,不管是下载新版本的哪个包,或者在哪个电脑上,我都没成功。
唯一安慰是这个卸载非常丝滑和干净。
请添加图片描述

1 “无法加载 DLL“cvextern”

在这里插入图片描述
关于使用EmguCV出现 “无法加载 DLL“cvextern”: 找不到指定的程序” 的解决方法,这个呢属于一劳永逸,改环境变量配置,把libs也加上
关于使用EmguCV出现 “无法加载 DLL“cvextern”: 找不到指定的程序” 的解决方法,这个属于解决当下问题,把对应dll移到项目文件里

2 FileDialog加载视频文件地址

在这里插入图片描述
我格式没敲对,以下是修正过后代码

        private void 开始ToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            if (Camera == null)
            {
                OpenFileDialog file = new OpenFileDialog();
                file.Filter = "Video Files |*.mp4";//就是这里,前面类型后面*代表所有这种类型
                if (file.ShowDialog() == DialogResult.OK)
                {
                    Camera = new VideoCapture(file.FileName);
                }
            }
            Camera.ImageGrabbed += File_ImageGrabbed;
            Camera.Start();
        }

4 设计器无法处理XXXX,XXX由设计器生成

这个情况可太多了。
大概就是下面这种,双击窗体控件后自动产生的代码,既不能删除,也不能随意移动,一点点情况,他就报错。

        private void RangeFilterParametersToolStripMenuItem_Click(object sender, EventArgs e)
        {

        }

CSDN论坛:方法“XXX”内的代码由设计器生成,不应手动修改?
这里的第一个回答比较有用,注释掉,重新生成解决方案,然后重新打开项目

5 尝试除以零

Microsoft文档:DivideByZeroException 类
我加载视频文件,点击播放,会弹出这个警告,看了看链接的分析,应该是我调整帧速这里出了问题,哎麻木麻木

       private async void VideoStartToolStripMenuItem_Click(object sender, EventArgs e)  //async异步,为了下面await,视频帧速度
        {
            if (capture == null)
            {
                return;
            }
            try
            {
                while (!Pause)
                {
                    Mat frame = new Mat();
                    capture.Retrieve(frame);
                    if (!frame.IsEmpty)
                    {
                        imageBox2.Image = frame;
                        double fps = capture.GetCaptureProperty(CapProp.Fps);
                        await Task.Delay(1000 / Convert.ToInt32(Fps));  //帧速放慢,这里报错原因应该是,尝试除以零
                        //Thread.Sleep((int)capture.GetCaptureProperty(Emgu.CV.CvEnum.CapProp.Fps));
                    }
                    else
                    {
                        break;
                    }
                }
            }
            catch (Exception ex)
            {

                MessageBox.Show(ex.Message); //报错,尝试除以零
            }
        }

放一个目前我调整后的版本,设计了初始帧、播放、暂停和结束四个选项

        private void VideoFristFrameToolStripMenuItem_Click(object sender, EventArgs e)
        {
            OpenFileDialog video = new OpenFileDialog();
            //video.Filter = "Video Files(*.mp4,*.flv)|*.mp4,*.flv";
            if (video.ShowDialog() == DialogResult.OK)
            {
                capture = new VideoCapture(video.FileName);
                Mat FristFrame = new Mat();
                capture.Read(FristFrame);  //read是读取第一帧
                ImageBox1.Image = FristFrame;
            }
        }

        private void VideoStartToolStripMenuItem_Click(object sender, EventArgs e)  //async异步,为了下面await,视频帧速度
        {
                capture.ImageGrabbed += File_ImageGrabbed;
                capture.Start();
        }


        
        private void File_ImageGrabbed(object sender, EventArgs e) 
        {
            try
            {
                Mat frame = new Mat();
                capture.Retrieve(frame);  //可以读取所有帧
                imageBox2.Image = frame;
                Thread.Sleep((int)capture.GetCaptureProperty(Emgu.CV.CvEnum.CapProp.Fps));
             }
            catch (Exception)
            {

                throw;
            }

        } 


        private void 暂停ToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            //Pause =! Pause;
            if (capture != null)
            {
                capture.Pause();
            }
        }

        private void 结束ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (capture != null)
            {
                capture.Stop();
            }
        }

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值