什么是差分输出方式
差分传输一种信号传输的技术。差分传输在这两根线上都传输信号,这两个信号的振幅相同,相位相反。在这两根线上的传输的信号就是差分信号。信号接收端比较这两个电压的差值来判断发送端发送的逻辑状态。在电路板上,差分走线必须是等长、等宽、紧密靠近、且在同一层面的两根线。信号接收端比较这两个电压的差值来判断发送端发送的是逻辑0还是逻辑1。在电路板上,差分走线必须是等长、等宽、紧密靠近、且在同一层面的两根线。扩展资料差模信号又称为常模、串模、线间感应和对称信号等,在两线电缆传输回路,每一线对地电压用符号V1和V2来表示。差模信号分量是VDIFF。纯差模信号是:V1=-V2;其大小相等,相位差180°;VDIFF=V1-V2,因为V1和V2对地是对称的,所以地线上没有电流流过。所有的差模电流(IDIFF)全流过负载。差模干扰侵入往返两条信号线,方向与信号电流方向一致,其一种是由信号源产生,另一种是传输过程中由电磁感应产生,它和信号串在一起且同相位,这种干扰一般比较难以抑制。共模信号又称为对地感应信号或不对称信号,共模信号分量是VCOM,纯共模信号是:VCOM=V1=V2;大小相等,相位差为0°;V3=0。干扰信号侵入线路和接地之间,干扰电流在两条线上各流过二分之一,以地为公共回路;原则上讲,这种干扰是比较容易消除的。在实际电路中由于线路阻抗不平衡,使共模信号干扰会转化为不易消除的串扰干扰。参考资料:百度百科-差分信号参考资料:百度百科-共模信号与差模信号
什么是三帧差分法
三帧差分算法是相邻两帧差分算法的一种改进方法,它选取连续三帧视频图像进行差分运算,消除由于运动而显露背景影响,从而提取精确的运动目标轮廓信息。该算法的基本原理是是先选取视频图像序列中连续三帧图像并分别计算相邻两帧的差分图像,然后将差分图像通过选取适当的阈值进行二值化处理,得到二值化图像,最后在每一个像素点得到的二值图像进行逻辑与运算,获取共同部分,从而获得运动目标的轮廓信息。三帧差法的具体算法如下。 提取连续的三帧图像,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 #include #include #include #include #include #include #include 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 height;i++) { for(int j = 0;j 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(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); 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); cout<<mbest1<<" "<<mbest2<<endl; cvAnd(Imask1,Imask2,Imask); /*cvErode(Imask, Imask); cvDilate(Imask,Imask);*/ DWORD finish=GetTickCount(); // cout<<finish-start<<"ms"<<endl; cvShowImage("src",image2); cvShowImage("dst",Imask); } char c = cvWaitKey(30); if(c==27) break; } return 0; }