您的位置:首页 > 运维架构

Open CV 三帧差法

2015-11-28 22:20 381 查看
首先 去连续三幅图定义为

其中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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: