使用C#语言,基于OpenCvSharp 开发摄像头后台,移动物体位置识别 (一)

刚刚入门OpenCvSharp,也是小白一枚,教程很少,慢慢摸索,边学边记录

文末附链接

 

效果:

 

 

要求:Visual Studio 2017,摄像头x1

 

准备工作:

        新建一个.Net Framework 控制台应用

        右击解决方案--->管理解决方案的NuGet程序包--->浏览--->搜索“OpenCvSharp”

        找到“OpenCvSharp3-AnyCPU”,然后勾选本项目开始安装

C#代码:

带注释

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using OpenCvSharp;  //引用

namespace CvCam
{
    class Program
    {
      static  VideoCapture cap = new VideoCapture();
      
        static void Main(string[] args)
        {
             CamFunc_00();
           // CamFunc_01();
        }

        static void CamFunc_00()                     //固定背景对比,获取第一帧背景,启动后,摄像头的位置不能动
        {
            Mat bgMat = new Mat();
            Mat capMat = new Mat();

            bool isFirstFrame = true;                //判断是不是第一帧

            cap.Open(0);                             //打开摄像头
            if (!cap.IsOpened()) return;             //判断摄像头是否已经打开

            while (true)                           //逐帧获取摄像头画面
            {
                capMat = cap.RetrieveMat();      //获取摄像头画面
                if (capMat.Empty()) continue;
             //   Cv2.CvtColor(capMat, capMat, ColorConversionCodes.BGR2GRAY);   //转成灰度图
                if (isFirstFrame)
                {
                    isFirstFrame = false;
                    bgMat = capMat;
                }

                for (int i = 0; i < capMat.Rows; i+=10)
                {
                    for (int j = 0; j < capMat.Cols; j+=10)
                    {
                        //这样写不知道有没有什么问题,但是能实现效果,先就这样写,获取像素点的rgb值做对比,其中50是差值,可根据自己需求来调节
                        if (Math.Abs(capMat.Get<Vec3b>(i, j).Item0 - bgMat.Get<Vec3b>(i, j).Item0) > 50|| Math.Abs(capMat.Get<Vec3b>(i, j).Item1 - bgMat.Get<Vec3b>(i, j).Item1) > 50|| Math.Abs(capMat.Get<Vec3b>(i, j).Item2 - bgMat.Get<Vec3b>(i, j).Item2) > 50)  
                        {
                            Cv2.Circle(capMat, new Point(j, i), 2, Scalar.White, 4); //画圆,在capMat的(j,i)位置画半径为2,厚度为4的白色的实心圆
                        }
                    }
                }

                Cv2.ImShow("CamFunc_00",capMat);  //显示
                Cv2.WaitKey(20);
            }
        }

        static void CamFunc_01()     //前后两帧对比,此时物体需要一直移动才能被检测出
        {
            Mat lastMat = new Mat();
            Mat capMat = new Mat();

            bool isEvenFrame = true;           //判断是不是偶数帧,即为参照帧    

            cap.Open(0);                             //打开摄像头
            if (!cap.IsOpened()) return;             //判断摄像头是否已经打开

            while (true)                           //逐帧获取摄像头画面
            {
                capMat = cap.RetrieveMat();           //获取摄像头画面
                if (capMat.Empty()) continue;
                //   Cv2.CvtColor(capMat, capMat, ColorConversionCodes.BGR2GRAY);   //转成灰度图
                if (isEvenFrame)
                {
                    isEvenFrame = false;
                    lastMat = capMat;
                }

                else
                {
                    for (int i = 0; i < capMat.Rows; i += 10)   //遍历capMat所有像素
                    {
                        for (int j = 0; j < capMat.Cols; j += 10)
                        {
                            //这样写不知道有没有什么问题,但是能实现效果,先就这样写,获取像素点的rgb值做对比,其中50是差值,可根据自己需求来调节
                            if (Math.Abs(capMat.Get<Vec3b>(i, j).Item0 - lastMat.Get<Vec3b>(i, j).Item0) > 50 || Math.Abs(capMat.Get<Vec3b>(i, j).Item1 - lastMat.Get<Vec3b>(i, j).Item1) > 50 || Math.Abs(capMat.Get<Vec3b>(i, j).Item2 - lastMat.Get<Vec3b>(i, j).Item2) > 50)
                            {
                                Cv2.Circle(capMat, new Point(j, i), 2, Scalar.White, 4); //画圆,在capMat的(j,i)位置画半径为2,厚度为4的白色的实心圆
                            }
                        }
                    }
                    isEvenFrame = true;
                }
                Cv2.ImShow("CamFunc_01", capMat); //显示
                Cv2.WaitKey(20);

            }
        }
    }
}

        

Ctrl + F5 运行

 

运行后如果遇到报错:

 

    

找打自己的工程文件

在路径:你的工程文件路径\bin\Debug\dll\x64\ 下有两个dll文件:

opencv_ffmpeg400_64.dll

OpenCvSharpExtern.dll

 

 

复制这两个dll文件到Debug目录:

 

此次摄像头画面区域不能调整,实用性较差,往后会添加透视变换,实现摄像头画面区域自定义,真正实现摄像头后台获取移动物体坐标的功能

 

 

 

工程链接:

链接:https://pan.baidu.com/s/1NRacl8etgC2pZvyWtP3-vQ 
提取码:qx96 
 

by:一万六--

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值