我只是个小菜鸡 2021-06-22 18:33 采纳率: 50%
浏览 86
已结题

opencv452 用帧间差法检测运动物体,且在变化区域用矩形画出。问题就是,画出的矩形会乱跑。。。

 



#include <iostream>
#include "cv.h"
#include "opencv2/opencv.hpp"

using namespace std;
using namespace cv;

// 描述:帧差法
int main()
{
	//读入视频  
	VideoCapture capture(0);
	namedWindow("当前视频帧", CV_WINDOW_NORMAL);
	namedWindow("背景减图后区域", CV_WINDOW_NORMAL);
	Mat tempframe, currentframe, currentframe2, currentframe3, currentframe4, currentframe5,previousframe;  //定义 临时框架、现在框架、上一帧框架
	Mat frame;
	int framenum = 0;

	while (true)
	{
		//读取帧
		tempframe = capture.read(frame);
		capture >> frame;
		tempframe = frame;
		framenum++;
		if (framenum == 1)
		{
			cvtColor(tempframe, previousframe, CV_BGR2GRAY);
		}
		else
		{
			//将tempframe转为单通道灰度图,输出为currentframe
			cvtColor(tempframe, currentframe, CV_BGR2GRAY);

			//做差求绝对值,输出为currentframe,即差分图像
			absdiff(currentframe, previousframe, currentframe2);

			//遍历差分图像中点,将图像信息二值化,大于阈值20,为255,反之则为0,输出为currentframe
			threshold(currentframe2, currentframe3, 20, 255.0, CV_THRESH_BINARY);

			erode(currentframe3, currentframe4, Mat());//腐蚀
			dilate(currentframe4, currentframe5, Mat());//膨胀 
			 //查找轮廓并绘制轮廓  
			vector<vector<Point> > contours;
			findContours(currentframe5, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);
			drawContours(frame, contours, -1, Scalar(0, 0, 255), 2);//在result上绘制轮廓  
			//查找正外接矩形  
			vector<Rect> boundRect(contours.size());
			for (int i = 0; i < contours.size(); i++)
			{
				boundRect[i] = boundingRect(contours[i]);
				rectangle(frame, boundRect[i], Scalar(0, 255, 0), 2);//在result上绘制正外接矩形  
			}

			//显示图像 
			imshow("当前视频帧", tempframe);
			imshow("背景减图后区域", currentframe5);
		}

		//把当前帧保存作为下一次处理的前一帧 
		cvtColor(tempframe, previousframe, CV_BGR2GRAY);
		waitKey(33);
	}
	return 0;
}
  • 写回答

2条回答 默认 最新

  • robot8me 2021-06-22 18:53
    关注

    会乱跑是什么意思?1、有可能算法不准确,随意矩形框画的区域是正确的区域,但是算法检测不准导致区域位置不正确,因此看到现象就是矩形框乱跑;2、算法也大致准确,矩形框小范围波动,那就需要加滤波看看,例如卡尔曼滤波

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 9月18日
  • 已采纳回答 9月10日

悬赏问题

  • ¥15 校内二手商品转让网站
  • ¥20 高德地图聚合图层MarkerCluster聚合多个点,但是ClusterData只有其中部分数据,原因应该是有经纬度重合的地方点,现在我想让ClusterData显示所有点的信息,如何实现?
  • ¥100 求Web版SPC控制图程序包调式
  • ¥20 指导如何跑通以下两个Github代码
  • ¥15 大家知道这个后备文件怎么删吗,为啥这些文件我只看到一份,没有后备呀
  • ¥15 C++为什么这个代码没报错运行不出来啊
  • ¥15 一道ban了很多东西的pyjail题
  • ¥15 关于#r语言#的问题:如何将生成的四幅图排在一起,且对变量的赋值进行更改,让组合的图漂亮、美观@(相关搜索:森林图)
  • ¥15 C++识别堆叠物体异常
  • ¥15 微软硬件驱动认证账号申请