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;
}
其中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;
}
相关文章推荐
- CentOS下安装xampp
- Hadoop2.6.0学习笔记(九)文件的存储结构
- 登录linux系统设置默认目录
- LVS Nginx HAProxy 优缺点
- Hadoop2.6.0学习笔记(七)HDFS读写流程
- HDU 5576 Expection of String (DP, 前缀和维护) 2015年上海现场赛E题
- linux配置java环境变量(详细)
- [Linux学习笔记] Linux软件包管理
- Linux下查看文件和文件夹大小
- Linux下的磁盘分割和文件系统
- CentOS Linux 监控安装之Zabbix
- Linux Netcat命令
- OpenCV2中图像读取、显示、保存等基本操作
- ARM Linux学习,从宿主机传程序到ARM——环境搭建2
- pyopengl 学习日志(1)--配置环境
- Linux cscope命令
- aop
- [前端]分享一个Bootstrap可视化布局的网站
- linux mount/umount挂载命令解析。
- 手动安装liberty版本openstack环境(allinone)---安装dashboard