OpenCV 从视频中获取背景

本例是从一段视频中,获取背景,去掉前景物体。思路是,N帧叠加再取平均值,只要N足够,即可以消除前景物体。


#include <iostream>  
#include "opencv2/opencv.hpp"  
#include "opencv2/nonfree/features2d.hpp"
#include "opencv2/highgui.hpp"

using namespace cv;
using namespace std;

void OverlayMat(Mat& src, unsigned int iBgk[240][960])
{
	int nRows = 240;
	int nCols = 320 * 3;
	for (int i = 0; i < nRows; ++i)
	{
		uchar* p = src.ptr<uchar>(i);
		for (int j = 0; j < nCols; ++j)
		{
			iBgk[i][j] += p[j];
		}
	}
}

int main(int argi, char** argv)
{
	printf("start!\n");
	VideoCapture cap;
	cap.open(argv[1]);

	if (!cap.isOpened())
	{
		printf("open file fail!\n");
		return -1;
	}
	printf("open file success!\n");
	Mat prevgray, gray, flow, cflow, frame;
	Mat bkg(240, 320, CV_8UC3);
	unsigned int iBkg[240][960] = { 0 };
	
	namedWindow
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenCV提供了多种图像分割算法,其一种常用的算法是背景分割。背景分割是通过将图像的前景与背景进行区分,从而实现物体检测和跟踪的目的。 在你提供的引用的示例代码,使用了帧间差分法进行背景分割。该方法是通过计算当前帧与前一帧之间的差异,来确定前景与背景之间的变化。具体的步骤如下: 1. 首先,读取视频获取视频帧率。 2. 在每一帧上进行帧间差分计算。将当前帧与前一帧进行差分操作,得到差异帧。 3. 对差异帧进行阈值分割,将差异值大于阈值的像素置为前景,小于阈值的像素置为背景。 4. 显示原始图像和分割结果图像,并添加适当的延时。 然而,根据你提供的引用的描述,你使用该方法未能成功检测出手掌。这可能是因为帧间差分法对于复杂的背景或者光照变化敏感度较高,导致前景与背景之间的差异不够明显。因此,你可以尝试其他更复杂的背景分割算法,例如基于K-Means聚类、高斯混合模型(GMM)、分水岭变换或Grabcut算法。 引用提供的资源可以帮助你理解这些算法的原理和应用。你可以通过阅读相关文档和尝试实现这些算法来改进你的背景分割结果。 总结起来,要改进你的背景分割结果,你可以尝试使用更复杂的背景分割算法,并参考引用的相关资源来理解这些算法的原理和应用。这样可以提高你的算法的准确性,并帮助你更好地检测出手掌。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值