栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

opencv之差值法检测移动物体

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

opencv之差值法检测移动物体

学习内容: 差值法检测移动物体
学习产出:

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);//视频的总帧数

2、差值函数

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

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

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

3、threshold函数

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

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

第三个参数,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() )

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

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

#include 
#include 

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;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/689277.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号