5.1 利用openCV检测物体是否运动了

33 篇文章 3 订阅
31 篇文章 4 订阅
本文介绍了如何在FFmpeg的基础上,利用openCV进行物体运动检测,通过比较连续视频帧的差异,实现动态物体的识别,如手部动作触发Moving和Stopping的显示。
摘要由CSDN通过智能技术生成

 FFmpeg与openCV绝对是绝配。前面我们已经基本熟悉了FFmpeg的工作流程,这一章我们重点来看看openCV。

在前面,我们已经使用openCV打开过摄像头并在MFC中显示图像,但openCV能做的要远超你的想像,比如可以用它来实现人脸检测、车牌识别等,在AI领域,openCV早已声名鹊起。

在实际应用中,我们常需要判断物体是否运动了,这可以利用openCV实现。

1.复制demo4并改名为demo13。

2.修改capCam函数:

int fmle::capCam() {
	videoCap.open(0);	
	cv::Mat frame1, frame2;
	BOOL ifSuccess = videoCap.read(frame1);
	while (true)
	{
		BOOL ifSuccess = videoCap.read(frame2);
		cv::Mat diff;
		cv::absdiff(frame1, frame2, diff); // 计算两帧图像的差异
		cv::Mat gray;
		cv::cvtColor(diff, gray, cv::COLOR_BGR2GRAY); // 转换为灰度图像
		cv::Mat blurred;
		cv::GaussianBlur(gray, blurred, cv::Size(5, 5), 0); // 高斯模糊
		cv::Mat thresholded;
		cv::threshold(blurred, thresholded, 20, 255, cv::THRESH_BINARY); // 二值化
		cv::Mat dilated;
		cv::dilate(thresholded, dilated, cv::Mat(), cv::Point(-1, -1), 2); // 膨胀
		std::vector<std::vector<cv::Point>> contours;
		cv::findContours(dilated, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE); // 查找轮廓
		bool objectMoved = false;
		for (const auto& contour : contours)
		{
			double area = cv::contourArea(contour);
			if (area > 1000) // 设置最小轮廓面积阈值
			{
				objectMoved = true;
				break;
			}
		}

		if (objectMoved)
		{
			TRACE("物体移动了\n");
			cv::putText(dilated, "Moving... ", cv::Point(0, 40), cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(255, 255, 255), 2);			
		}
		else
		{
			cv::putText(dilated, "Stopping... ", cv::Point(0, 40), cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(255, 255, 255), 2);
			TRACE("物体未移动\n");			
		}		
		frame1 = frame2.clone(); // 更新上一帧图像
		mainDlg->drawMatOfPub(dilated);
		Sleep(40);
	}	
	videoCap.release();	
	
	return 0;
}

3.调试运行,当手挥动时会显示Moving,停止时则显示Stoping。

  • 13
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
运动物体目标检测是指在一系列连续的图像,通过分析像素之间的差异来识别和追踪运动物体OpenCV是一个广泛使用的计算机视觉库,它提供了各种强大的功能来进行运动物体目标检测。 实现运动物体目标检测的一种常见方法是使用背景减除法。该方法通过首先建立一个静态背景模型,然后将当前帧的像素与背景模型进行比较,获得前景物体OpenCV提供了几种背景减除算法,如高斯混合模型(GMM)和自适应混合高斯模型(MOG2)。使用这些算法,我们可以通过设置阈值来筛选出可能的前景物体,并通过形态学操作来去除噪声。 除了背景减除法,OpenCV还提供了另一种基于光流法的运动物体目标检测方法。光流法通过分析连续帧之间的像素位移来计算物体运动信息。在OpenCV,可以使用Farneback光流算法来计算光流向量,并通过这些向量来估计物体运动速度和方向。 除了上述方法,OpenCV还提供了许多其他功能来实现运动物体目标检测,如基于特征的方法(如Haar特征、HOG特征等)和机器学习方法(如支持向量机、卷积神经网络等)。这些方法可以用于检测不同类型的运动物体,如人、车辆、动物等。 总而言之,OpenCV提供了丰富而强大的功能来进行运动物体目标检测。通过选择适当的算法和技术,并进行参数调节和优化,我们可以实现高效准确的运动物体目标检测,并在各种应用发挥重要作用,如视频监控、智能交通系统等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西部秋虫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值