当前位置:首页 > 代码 > 正文

帧差源代码(帧内编码优化是做什么的)

admin 发布:2023-01-31 07:30 43


本篇文章给大家谈谈帧差源代码,以及帧内编码优化是做什么的对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

python的opencv怎么对图像进行平滑处理

帧差法的代码:

#define

threshold_diff1

10

//设置简单帧差法阈值

#define

threshold_diff2

10

//设置简单帧差法阈值

int

main(int

argc,unsigned

char*

argv[])

{

Mat

img_src1,img_src2,img_src3;//3帧法需要3帧图片

Mat

img_dst,gray1,gray2

帧间差分法的分法介绍

帧间差分法的优点是:算法实现简单,程序设计复杂度低;对光线等场景变化不太敏感,能够适应各种动态环境,稳定性较好。其缺点是:

不能提取出对象的完整区域,只能提取出边界;同时依赖于选择的帧间时间间隔。对快速运动的物体,需要选择较小的时间间隔,如果选择不合适,当物体在前后两帧中没有重叠时,会被检测为两个分开的物体:而对慢速运动的物体,应该选择较大的时间差,如果时间选择不适当,当物体在前后两帧中几乎完全重叠时,则检测不到物体。 鉴于背景差分法和帧间差分法的优缺点,我们将这两种方法结合起来,使它们优势互补,从而克服相互的弱点,提高运动检测的效果。但是在实际的场景中,即便是室内环境,也存在光线等各种变化造成的干扰,或者人为造成的开灯等光线的强烈变化。所以在背景差分法的实现中,它的固定背景不能一成不变。如果不进行重新初始化,错误的检测结果将随时间不断累计,造成恶性循环,从而造成监控失效。因此,我们在提出检测算法的同时,要建立背景更新模型。保证背景图像能随着光线的变化而变化,确保检测的准确性。

提出新算法的思想

在视频图像序列中,利用已有的背景差分法和帧间差分法作为启示,将动态图像中连续两帧差图像和背景差图像直接进行与操作,再将结果进行二值化处理得到运动结果。这样就达到了加大目标信息的权重,同时抑制了静态背景的效果,得到的运动检测图像包含了更多目标的信息,不仅包含目标轮廓而且还有目标轮廓内的目标相关点,从而将运动目标从背景图像中分离出来,最终得到视频序列图像中运动存在与否的二值化图像。

什么是三帧差分法

三帧差分算法是相邻两帧差分算法的一种改进方法,它选取连续三帧视频图像进行差分运算,消除由于运动而显露背景影响,从而提取精确的运动目标轮廓信息。该算法的基本原理是是先选取视频图像序列中连续三帧图像并分别计算相邻两帧的差分图像,然后将差分图像通过选取适当的阈值进行二值化处理,得到二值化图像,最后在每一个像素点得到的二值图像进行逻辑与运算,获取共同部分,从而获得运动目标的轮廓信息。

三帧差法的具体算法如下。

提取连续的三帧图像,I(k-1),I(k),I(k+1) 。

(1) d(k,k-1) [x,y] = | I(k)[x,y] - I(k-1)[x,y] |;

d(k,k+1)[x,y] = | I(k+1)[x,y] - I(k)[x,y] |;

(2) b(k,k-1)[x,y] = 1; if d(k,k-1) [x,y] = T;

b(k,k-1)[x,y] = 0; if d(k,k-1) [x,y] T;

b(k+1,k)[x,y] = 1 if d(k+1,k) [x,y] = T;

b(k+1,k)[x,y] = 0 if d(k+1,k) [x,y] T;

(3) B(k)[x,y] = 1 ; if b(k,k-1)[x,y] b(k+1,k)[x,y] == 1 ;

B(k)[x,y] = 0 ; if b(k,k-1)[x,y] b(k+1,k)[x,y] ==0 ;

比较关键的就是第2步的阈值T的选取问题,单纯用otsu算法分割貌似效果不太好,如果手动设置一个较小的值(如10)效果还行。

用otsu取阈值实现的一个三分差法代码。效果不是很好。

运行环境 VS2008+OpenCV2.0+windows XP .

[cpp] view plaincopyprint?#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;

#pragma comment(lib, "highgui200.lib")

#pragma comment(lib, "cv200.lib")

#pragma comment(lib, "cxcore200.lib")

#pragma comment(lib, "cvaux200.lib")

#define GET_IMAGE_DATA(img, x, y) ((uchar*)(img-imageData + img-widthStep * (y)))[x]

int T = 10;

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 = cvCreateFileCapture("E:\\Motion\\IndoorGTTest2.avi");

//CvCapture *capture = cvCreateCameraCapture(0);

cvNamedWindow("src");

cvNamedWindow("dst");

cvNamedWindow("Imask1");

cvNamedWindow("Imask2");

cvNamedWindow("Imask3");

//cvCreateTrackbar("T","dst",T,255,0);

while(mframe=cvQueryFrame(capture))

{

DWORD start=GetTickCount();

if(ncount1000000000)

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);

cvCopy(image3,image2);

cvCvtColor(mframe,image3,CV_BGR2GRAY);

}

cvAbsDiff(image2,image1,Imask1);

cvAbsDiff(image3,image2,Imask2);

//cvShowImage("Imask1",Imask1);

//cvShowImage("Imask2",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);

coutmbest1" "mbest2endl;

cvAnd(Imask1,Imask2,Imask);

/*cvErode(Imask, Imask);

cvDilate(Imask,Imask);*/

DWORD finish=GetTickCount();

// coutfinish-start"ms"endl;

cvShowImage("src",image2);

cvShowImage("dst",Imask);

}

char c = cvWaitKey(30);

if(c==27)

break;

}

return 0;

}

运动目标检测——光流法与opencv代码实现

运动目标的检测的其主要目的是 获取目标对象的运动参数(位置、速度、加速度等)及运动轨迹 ,通过进一步分析处理,实现对目标行为更高层级上的理解。

运动目标检测技术目的是 从序列图像中将变化区域从背景图像中提取出来 ,常用于视频监视、图像压缩、三维重构、异常检测等。

运动目标检测主流方法有帧差法、背景差法、光流法等。光流法源于 仿生学 思想,更贴近于直觉,大量昆虫的视觉机理便是基于光流法。

二十世纪五十年代心理学家Gibson在他的著作“The Perception of Visual World”中首次提出了以心理学实验为基础的光流法基本概念,而直到八十年代才由Horn、Kanade、Lucash和Schunck创造性地将灰度与二维速度场相联系,引入光流约束方程的算法,对光流计算做了奠基性的工作。

光流(optical flow):由于目标对象或者摄像机的移动造成的图像对象在连续两帧图像中的移动。

小球在连续五帧运动构成的光流 小球在连续五帧运动构成的光流

通俗说,对于一个图片序列,把每张图像每个像素在连续帧之间的运动速度和方向( 某像素点在连续两帧上的位移矢量 )找出来就是光流场。

第t帧的时A点的位置是(x1, y1),第t+1帧时A点位置是(x2,y2),则像素点A的位移矢量:(ux, vy) = (x2, y2) - (x1,y1)

如何知道第t+1帧的时候A点的位置涉及到不同的光流计算方法,主要有四种:基于梯度的方法、基于匹配的方法、基于能量的方法、基于相位的方法。

光流法依赖于三个假设:

根据所形成的光流场中 二维矢量的疏密程度 ,光流法可分为稠密光流与稀疏光流。

基于区域匹配生成的稠密光流场 基于区域匹配生成的稠密光流场

稀疏光流只对有 明显特征的组点 (如角点)进行跟踪,计算开销小。

基于特征匹配发生成的稀疏光流场 基于特征匹配发生成的稀疏光流场

(1)calcOpticalFlowPyrLK

基于金字塔LK光流算法,计算某些点集的稀疏光流。

参考论文《Pyramidal Implementation of the Lucas Kanade Feature TrackerDescription of the algorithm》

(2)calcOpticalFlowFarneback

基于Gunnar Farneback 的算法计算稠密光流。

参考论文《Two-Frame Motion Estimation Based on PolynomialExpansion》

(3)CalcOpticalFlowBM

通过块匹配的方法来计算光流

(4)CalcOpticalFlowHS

基于Horn-Schunck 的算法计算稠密光流。

参考论文《Determining Optical Flow》

(5)calcOpticalFlowSF

论文《SimpleFlow: A Non-iterative, Sublinear Optical FlowAlgo》的实现

LK光流法效果 LK光流法效果

关于帧差源代码和帧内编码优化是做什么的的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

版权说明:如非注明,本站文章均为 AH站长 原创,转载请注明出处和附带本文链接;

本文地址:http://ahzz.com.cn/post/35770.html


取消回复欢迎 发表评论:

分享到

温馨提示

下载成功了么?或者链接失效了?

联系我们反馈

立即下载