Emgu CV4图像处理之运动物体检测16(C#)

本文测试环境:

win10  64位

vistual studio 2019  

Emgu CV 4.6.0

环境配置准备:

1 新增控制台项目,.net framework为4.7.2

2  把win-x64目录的native目录下的文件全部拷贝到项目的运行目录Debug目录下

3  项目选择x64

4 添加项目引用Emgu.CV.dll、Emgu.CV.Platform.NetFramework.dll、System.Drawing.dll和System.Runtime.InteropServices.RuntimeInformation.dll  

具体配置参考:
Emgu CV4图像处理之环境搭建1(C#)_zxy2847225301的博客-CSDN博客

本案例是检测视频运动的车辆

代码中的视频可以从这个地址中下载(需要单独复制到浏览器中打开,这样双击打开会报Forbiden的):

https://vd2.bdstatic.com/mda-jjhtuqg81rtcgtqz/sc/mda-jjhtuqg81rtcgtqz.mp4?v_from_s=hkapp-haokan-hnb&auth_key=1668065179-0-0-6a0e695779701a0e25b4e3428e80fe89&bcevod_channel=searchbox_feed&pd=1&cd=0&pt=3&logid=3379081635&vid=15251757848743272386&abtest=104959_2-105568_2&klogid=3379081635

下载后,把视频的名称修改为:car_run.mp4

想要获取到运动中的车辆,需要比较两帧视频的图片,然后做减法运算

这类比较经典的案例是统计车流量:参考博客如下:

35-运动物体检测1(EmguCV学习)_牛客博客

36-运动物体检测2(EmguCV学习)_牛客博客

我这个是失败品,效果太差了,黑色的车压根就检测不到,后面的就不做了,仅作记录

参考代码如下:

using Emgu.CV;
using Emgu.CV.Structure;
using Emgu.CV.Util;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EmguCVDemo2
{
    class Program
    {
        static void Main(string[] args)
        {
            TrackRunCar("car_run.mp4");
            CvInvoke.WaitKey(0);
            Console.ReadLine();
        }
        /// 
        /// 检测运动物体
        /// 
        private static void TrackRunCar(string videoFile)
        {
            VideoCapture videoCapture = new VideoCapture(videoFile);
            if (!videoCapture.IsOpened)
            {
                Console.WriteLine("视频未打开");
            }
            Mat pic = new Mat();
            Mat bmg = null;
            while (true)
            {
                videoCapture.Read(pic);
                if (pic.IsEmpty)
                {
                    Console.WriteLine("视频帧已经读取完毕");
                    break;
                }
                CvInvoke.Resize(pic, pic, new Size(800, 600));
                CvInvoke.Imshow("raw_pic", pic);
                //转灰度图
                CvInvoke.CvtColor(pic, pic, Emgu.CV.CvEnum.ColorConversion.Bgr2Gray);
                if (bmg == null)
                {
                    bmg = pic.Clone();
                }
                Mat target = new Mat();
                CvInvoke.Subtract(pic, bmg, target);
                bmg = pic.Clone();
                //高斯滤波
                CvInvoke.GaussianBlur(target, target, new Size(3, 3), 0);
                //二值化
                CvInvoke.Threshold(target, target, 110, 255, Emgu.CV.CvEnum.ThresholdType.Binary);

                Mat element = CvInvoke.GetStructuringElement(Emgu.CV.CvEnum.ElementShape.Rectangle, new Size(3, 3), new Point(-1, -1));

                //腐蚀 
                CvInvoke.Erode(target, target, element, new Point(-1, -1), 1, Emgu.CV.CvEnum.BorderType.Default, new MCvScalar());

                //膨胀
                CvInvoke.Dilate(target, target, element, new Point(-1, -1), 2, Emgu.CV.CvEnum.BorderType.Default, new MCvScalar());

                CvInvoke.Imshow("target", target);
                CvInvoke.WaitKey(20);
                
            }
            Console.WriteLine("RemoveImgBackground方法运行结束");
            
        }

       


    }
}

运行效果如下:

Emgu CV4图像处理之运动物体检测16(C#)_第1张图片

你可能感兴趣的:(图像处理C#,c#,EmguCV,运动物体检测)