刚刚入门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(i, j).Item0 - bgMat.Get(i, j).Item0) > 50|| Math.Abs(capMat.Get(i, j).Item1 - bgMat.Get(i, j).Item1) > 50|| Math.Abs(capMat.Get(i, j).Item2 - bgMat.Get(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(i, j).Item0 - lastMat.Get(i, j).Item0) > 50 || Math.Abs(capMat.Get(i, j).Item1 - lastMat.Get(i, j).Item1) > 50 || Math.Abs(capMat.Get(i, j).Item2 - lastMat.Get(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:一万六--