当前位置:   article > 正文

opencv之差值法检测移动物体_opencv 高精度 移动检测 absdiff

opencv 高精度 移动检测 absdiff

学习内容:

差值法检测移动物体

学习产出:

1、视频的基本参数

视频实际上也是由若干图片以一定的帧率叠加在一起而形成的,其中,我们可以通过get函数获得视频的相关参数,例如

int fps = capture.get(CAP_PROP_FPS);//视频的帧率
int width = capture.get(CAP_PROP_FRAME_WIDTH);//视频的宽度
int height = capture.get(CAP_PROP_FRAME_HEIGHT);//视频的高度
int num_of_frames = capture.get(CAP_PROP_FRAME_COUNT);//视频的总帧数
  • 1
  • 2
  • 3
  • 4

2、差值函数

这里我们用到absdiff函数,其函数参数结构如下

void cvAbsDiff( const CvArr* src1, const CvArr* src2, CvArr* dst );
  • 1

第三个参数即为两数组之间的差值

3、threshold函数

threshold 方法是通过遍历灰度图中各个像素点,将图像信息二值化,处理过后的图片只有二种色值

double threshold(InputArray src, OutputArray dst, double thresh, double maxval, int type)
  • 1

第三个参数,double类型的thresh,阈值的具体值
第四个参数,double类型的maxval,当第五个参数阈值类型type取THRESH_BINARY 或THRESH_BINARY_INV阈值类型时的最大值
第五个参数,int类型的type,阈值类型

type含义
cv2.THRESH_BINARY超过阈值部分取maxval(最大值),否则取0
cv2.THRESH_BINARY_INVTHRESH_BINARY的反转
cv2.THRESH_TRUNC大于阈值部分设为阈值,否则不变
cv2.THRESH_TOZERO大于阈值部分不改变,否则设为0
cv2.THRESH_TOZERO_INVTHRESH_TOZERO的反转

但这里是需要多传入一个参数( flag):THRESH_OTSU,加在第五个参数后,这是为了一副双峰图像自动根据其直方图可以自动计算出一个阈值,具体参考threshold实现全局和OTSU阈值二值化

4、morphologyEx函数

void morphologyEx( InputArray src, OutputArray dst, int op, 
InputArray kernel,Point anchor = Point(-1,-1), int iterations = 1,  
int borderType = BORDER_CONSTANT, const Scalar& borderValue = morphologyDefaultBorderValue() )
  • 1
  • 2
  • 3

这个函数很复杂,简单来说就是系列的膨胀腐蚀的组合
常用参数如下:

●MORPH_ERODE(腐蚀)
跟erode(腐蚀)函数效果一样
●MORPH_DILATE(膨胀)
跟dilate(膨胀)函数效果一样
●MORPH_OPEN(开)
其实内部就是进行了先腐蚀后膨胀的操作。
●MORPH_CLOSE(闭)
其实内部就是进行了先膨胀后腐蚀的操作。
5、差值法检测移动物体实例

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main()
{
	VideoCapture capture("resources/1.mp4");
	if (!capture.isOpened()) { cout << "请确认视频文件是否正确" << endl; return -1; }
	
	int fps = capture.get(CAP_PROP_FPS);
	int width = capture.get(CAP_PROP_FRAME_WIDTH);
	int height = capture.get(CAP_PROP_FRAME_HEIGHT);
	int num_of_frames = capture.get(CAP_PROP_FRAME_COUNT);
	cout << "视频宽度:" << width << "视频高度:" << height << "视频帧率:" << fps << "视频总帧数:" << num_of_frames << endl;

	Mat preFrame, preGray;
	capture >> preFrame;
	cvtColor(preFrame, preGray, CV_BGR2GRAY);
	//对图像进行高斯滤波
	GaussianBlur(preGray, preGray, Size(0, 0), 15);

	Mat binary, frame, gray;
	//形态学操作模板
	Mat k = getStructuringElement(MORPH_RECT, Size(9, 9), Point(-1, -1));

	while (true)
	{
		if (!capture.read(frame)){	break;}
		cvtColor(frame, gray, COLOR_BGR2GRAY);
		GaussianBlur(gray, gray, Size(0, 0), 15);
		//计算当前帧和前一帧差值的绝对值
		absdiff(gray, preGray, binary);
		//对结果二值化进行开运算,减少噪声干扰
		threshold(binary, binary, 10, 255, THRESH_BINARY | THRESH_OTSU);
		morphologyEx(binary, binary, MORPH_OPEN, k);

		imshow("input", frame);
		imshow("output", binary);

		//如果注释下一行代码,则程序表示固定背景的差值法
		gray.copyTo(preGray);

		char c = waitKey(5);
		if (c == 27) {	break;}
	}
	waitKey(0);
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/423017
推荐阅读
相关标签
  

闽ICP备14008679号