Open CV 三帧差法

首先 去连续三幅图定义为

其中image1 image2 做帧的差值运算

 image2 image3 做帧的差值运算

并将他们差值做平滑处理和阈值处理 转化成二值图像 

然后将其进行位与运算得出结果result


#include "highgui.h" 
#include "cv.h" 
#include "cxcore.h" 
#include "cvaux.h" 
#include <iostream> 
#include <cstdio> 
#include <cstring> 
#include <cmath> 
#include <algorithm> 
#include <queue> 
#include <vector> 
#include <windows.h> 
using namespace std;

int Num[300];
int Sum[300];


void InitPixel(IplImage * img, int &_low, int &_top)
{
memset(Num, 0, sizeof(Num));
memset(Sum, 0, sizeof(Sum));
_low = 255;
_top = 0;
for (int i = 0; i < img->height; i++)
{
for (int j = 0; j < img->width; j++)
{
int temp = ((uchar*)(img->imageData + img->widthStep*i))[j];//访问像素元素
if (temp < _low)
_low = temp;
if (temp > _top)
_top = temp;
Num[temp] += 1;
}
}
for (int i = 1; i < 256; i++)
{
Sum[i] = Sum[i - 1] + i*Num[i];
Num[i] += Num[i - 1];
}
}
int otsu(IplImage *img)
{
int _low, _top, mbest = 0;
float mn = img->height*img->width;
InitPixel(img, _low, _top);
float max_otsu = 0;
mbest = 0;
if (_low == _top)
mbest = _low;
else
{
for (int i = _low; i< _top; i++)
{
float w0 = (float)((Num[_top] - Num[i]) / mn);
float w1 = 1 - w0;
float u0 = (float)((Sum[_top] - Sum[i]) / (Num[_top] - Num[i]));
float u1 = (float)(Sum[i] / Num[i]);
float u = w0*u0 + w1*u1;
float g = w0*(u0 - u)*(u0 - u) + w1*(u1 - u)*(u1 - u);
if (g > max_otsu)
{
mbest = i;
max_otsu = g;
}
}
}
return mbest;
}
int main()
{
int ncount = 0;
IplImage *image1 = NULL;
IplImage *image2 = NULL;
IplImage *image3 = NULL;
IplImage *Imask = NULL;
IplImage *Imask1 = NULL;
IplImage *Imask2 = NULL;
IplImage *Imask3 = NULL;
IplImage *mframe = NULL;
CvCapture *capture = cvCreateCameraCapture(0);
cvNamedWindow("src");
cvNamedWindow("result");

while (mframe = cvQueryFrame(capture))
{
DWORD start = GetTickCount();
if (ncount>1000000000)
ncount = 100;
ncount += 1;
if (ncount == 1)
{
image1 = cvCreateImage(cvGetSize(mframe), IPL_DEPTH_8U, 1);
image2 = cvCreateImage(cvGetSize(mframe), IPL_DEPTH_8U, 1);
image3 = cvCreateImage(cvGetSize(mframe), IPL_DEPTH_8U, 1);
Imask = cvCreateImage(cvGetSize(mframe), IPL_DEPTH_8U, 1);
Imask1 = cvCreateImage(cvGetSize(mframe), IPL_DEPTH_8U, 1);
Imask2 = cvCreateImage(cvGetSize(mframe), IPL_DEPTH_8U, 1);
Imask3 = cvCreateImage(cvGetSize(mframe), IPL_DEPTH_8U, 1);
cvCvtColor(mframe, image1, CV_BGR2GRAY);
}
if (ncount == 2)
cvCvtColor(mframe, image2, CV_BGR2GRAY);


if (ncount >= 3)
{
if (ncount == 3)
cvCvtColor(mframe, image3, CV_BGR2GRAY);
else
{
cvCopy(image2, image1);//image2->1
cvCopy(image3, image2);//image3->2
cvCvtColor(mframe, image3, CV_BGR2GRAY);
}

cvAbsDiff(image2, image1, Imask1);//做差值
cvAbsDiff(image3, image2, Imask2);//做差值

int mbest1 = otsu(Imask1);
cvSmooth(Imask1, Imask1, CV_MEDIAN);
cvThreshold(Imask1, Imask1, mbest1, 255, CV_THRESH_BINARY);

int mbest2 = otsu(Imask2);
cvSmooth(Imask2, Imask2, CV_MEDIAN);
cvThreshold(Imask2, Imask2, mbest2, 255, CV_THRESH_BINARY);


cvAnd(Imask1, Imask2, Imask);

DWORD finish = GetTickCount();



cvShowImage("src", image2);
cvShowImage("result", Imask);
}
char c = cvWaitKey(30);
if (c == 27)
break;
}


return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值