精华内容
下载资源
问答
  • 基于精确背景补偿的动态目标检测算法
    千次阅读
    2019-04-19 20:10:18

    检测算法使用传统的背景补偿,即通过计算相邻两帧图像的单应矩阵,把前一帧映射到当前帧,再帧差就可以得出运动目标。

    1、特征提取。相邻两帧提取特征点,使用SURF算法,主要还是稳准快。

    2、特征匹配。将两帧提取的特征点匹配,主要有以下3步。

    (1)、KNN粗略匹配,opencv有函数实现

    (2)、最近邻匹配,对于前一帧里每一个点,在当前帧里找到匹配度最高和次高的两个点的汉明距离,记做d1.d2,d1/d2 < 阈值,则选匹配度最高的点为匹配点;否则去掉这一对匹配点

    (3)、对称约束。先正向匹配,再反向匹配,若正反匹配的点对应,认为是匹配较好的点。

    匹配到此结束

    3、外点滤除。目的是去掉待检测目标上的点,提高仿射矩阵的精准度。内容太多,我就直接上图了。

    4、背景补偿。通过上一步提取的背景点(内点)计算前一帧到当前帧的仿射矩阵H

    5、前景提取。

    (1)、由仿射矩阵H把前一帧映射到当前帧上,帧差(阈值大约40-60)

    (2)、形态学操作、滤波等等

    (3)、离散区域归并。这一步比较重要是因为,前面帧差的结果经常是分散的,比如前景是个走动的人,经过上一步只会是一个人的分散的轮廓提取出来了,再绘制轮廓的话,一个人就被分成了好几块。方法如图:

    图中说的不太详细,我在此基础上进行了改进,具体可以参考我的代码。

    //目标离散区域归并
    /*
    img_rgb:	RGB图
    img_abs:	提取目标的二值化图
    */
    void Func::combinTarget(Mat &img_rgb, Mat &img_abs)
    {
    	Mat img_rgb1, img_abs1;
    	img_rgb.copyTo(img_rgb1);
    	img_abs.copyTo(img_abs1);	//保存区域连接后的二值化图
    	cvtColor(img_rgb1, img_rgb1, CV_BGR2HSV);	//RGB-》hsv
    	vector<vector<Point>> contours;
    	findContours(img_abs, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE, Point(0, 0));
    	if (contours.size() > 1) {
    		//contour_center[0].clear();
    		contour_center[1].clear();	//初始化contour_center
    		//hsiMsg[0].clear();
    		hsiMsg[1].clear();
    		for (size_t i = 0; i < contours.size(); i++)	//初始化hsiMsg
    		{
    			vector<double> msg(6);
    			msg[0] = 0.0;	//H 均值
    			msg[0] = 0.0;	//S 均值
    			msg[0] = 0.0;	//I 均值
    			msg[0] = 0.0;	//H 方差
    			msg[0] = 0.0;	//S 方差
    			msg[0] = 0.0;	//I 方差
    			hsiMsg[1].push_back(msg);
    		}
    		
    		Rect rect;	//缓存每个区域的外接矩形
    		//遍历每个轮廓
    		for (size_t i = 0; i < contours.size(); i++)
    		{
    			//获取轮廓质心
    			Moments mu = moments(contours[i]);
    			contour_center[1].push_back(Point2f(mu.m10 / mu.m00, mu.m01 / mu.m00));
    			//printf("质心%d: (%.1f, %.1f) \n", i, contour_center[i].x, contour_center[i].y);
    			//获取轮廓内部像素点个数
    			int pixelNum = 0;	//缓存轮廓内部像素点个数
    			//获取轮廓内部颜色信息
    			Mat mat = Mat::zeros(img_rgb.size(), CV_8UC1);
    			cv::drawContours(mat, contours, i, Scalar::all(255), -1);
    			rect = boundingRect(contours[i]);	//获取区域外接矩形
    			vector<double> hsi(3);	// HSI
    			//在区域矩形内遍历目标点
    			//计算区域内HSI的均值
    			for (int row = rect.y; row < (rect.y+rect.height); row++)
    			{
    				const uchar* imgRow = img_rgb1.ptr<uchar>(row);
    				for (int col = rect.x; col < (rect.x+rect.width); col++)
    				{
    					if ((int)mat.at<uchar>(row, col) == 255) {
    						//获取HSV分量
    						hsi[0] = img_rgb1.at<Vec3b>(row, col)[0] * 2;
    						hsi[1] = img_rgb1.at<Vec3b>(row, col)[1] / 255;
    						hsi[2] = img_rgb1.at<Vec3b>(row, col)[2] / 255;
    
    						//计算区域内HSI的均值
    						hsiMsg[1][i][0] += hsi[0];	//H均值
    						hsiMsg[1][i][1] += hsi[1];	//S均值
    						hsiMsg[1][i][2] += hsi[2];	//I均值
    
    						pixelNum++;	//记录轮廓内像素点个数
    					}
    				}
    			}
    			hsiMsg[1][i][0] /= pixelNum;	//H均值
    			hsiMsg[1][i][1] /= pixelNum;	//S均值
    			hsiMsg[1][i][2] /= pixelNum;	//I均值
    			//计算区域内HSI的方差
    			for (size_t row = rect.y; row < (rect.y + rect.height); row++)
    			{
    				for (size_t col = rect.x; col < (rect.x + rect.width); col++)
    				{
    					if (mat.at<uchar>(row, col) == 255) {
    						//获取HSV分量
    						hsi[0] = img_rgb1.at<Vec3b>(row, col)[0] * 2;
    						hsi[1] = img_rgb1.at<Vec3b>(row, col)[1] / 255;
    						hsi[2] = img_rgb1.at<Vec3b>(row, col)[2] / 255;
    
    						//计算区域内HSI的均值
    						hsiMsg[1][i][3] += pow(hsi[0] - hsiMsg[1][i][0], 2) / pixelNum;	//H方差
    						hsiMsg[1][i][4] += pow(hsi[1] - hsiMsg[1][i][1], 2) / pixelNum;	//S方差
    						hsiMsg[1][i][5] += pow(hsi[2] - hsiMsg[1][i][2], 2) / pixelNum;	//I方差
    					}
    				}
    			}
    			printf("轮廓%d: HSI均值:%.2f, %.2f, %.2f   HSI方差:%.2f, %.2f, %.2f\n", 
    				i, hsiMsg[1][i][0], hsiMsg[1][i][1], hsiMsg[1][i][2], hsiMsg[1][i][3], hsiMsg[1][i][4], hsiMsg[1][i][5]);
    		}
    		/*********** 到这里区域内的HSI颜色信息已统计完毕 **********/
    		//根据颜色信息归并
    		for (size_t i = 0; i < contours.size()-1; i++)
    		{
    			for (size_t j = i+1; j < contours.size(); j++)
    			{
    				//1.质心相距50以内视为临近
    				if (pts2fDist(contour_center[1][i], contour_center[1][j]) < 50.0) {
    					//比较颜色特征距离
    					double d = colorDist(hsiMsg[1][i], hsiMsg[1][j]);	//计算颜色特征距离
    					printf("颜色特征距离:%.2f\n", d);
    					//putText(img_rgb, to_string(int(d)), Point((int)((contour_center[1][i].x + contour_center[1][j].x) / 2), ((int)(contour_center[1][i].y + contour_center[1][j].y) / 2)),
    						 //FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 0, 255), 1, 8);
    					//2.颜色特征相差3000以内视为同一目标
    					if (d < 3000) {
    						line(img_abs1, Point2f(contour_center[1][i].x, contour_center[1][i].y),	//连接归并区域
    							Point2f(contour_center[1][j].x, contour_center[1][j].y), Scalar::all(255), 3, 8);
    						printf("画线");
    					}
    				}
    			}
    		}
    		/******************* 根据位置和目标位移信息归并 *****************/
    		if (contour_center[0].empty()) {
    			contour_center[0].assign(contour_center[1].begin(), contour_center[1].end());
    		}
    		if (hsiMsg[0].empty()) {
    			hsiMsg[0].assign(hsiMsg[1].begin(), hsiMsg[1].end());
    		}
    		//下面是归并方法
    		//1.提取当前帧与前一帧位置接近的区域对
    		//2.计算区域对的颜色特征距离确定前后帧对应目标区域
    		vector<vector<double>> targetsMovMsg;	//缓存相邻两帧对应目标区域的移动方向、距离和当前帧质心(x y)
    		vector<double> targetMovMsg(4);	//缓存相邻两帧某一目标区域的移动方向、距离和当前帧质心(x y)
    		for (size_t i = 0; i < contour_center[1].size(); i++)
    		{
    			for (size_t j = 0; j < contour_center[0].size(); j++)
    			{
    				//1.距离小于20认为临近
    				if (pts2fDist(contour_center[1][i], contour_center[0][j]) < 30.0) {
    					//2.颜色特征距离小于10000认为是同一目标
    					if (colorDist(hsiMsg[1][i], hsiMsg[0][j]) < 8000.0) {
    						//3.计算目标移动方向、距离和当前帧质心
    						targetMovMsg[0] = tgtMovDirec(contour_center[0][j], contour_center[1][i]);//移动方向
    						targetMovMsg[1] = pts2fDist(contour_center[1][i], contour_center[0][j]);  //移动距离
    						targetMovMsg[2] = (double)contour_center[1][i].x;	//当前帧位置 X
    						targetMovMsg[3] = (double)contour_center[1][i].y;	//当前帧位置 Y
    						targetsMovMsg.push_back(targetMovMsg);	//记录
    
    						//将移动轨迹画在图上
    						line(img_rgb, Point(int(contour_center[0][j].x), int(contour_center[0][j].y)),
    							Point(int(contour_center[1][i].x), int(contour_center[1][i].y)), Scalar(0, 0, 255), 2, 8);
    						printf("由(%d, %d)->(%d, %d)移动了%.2f \n", int(contour_center[0][j].x), int(contour_center[0][j].y), 
    							int(contour_center[1][i].x), int(contour_center[1][i].y), targetMovMsg[1]);
    					}
    				}
    			}
    		}
    		//比较相邻两帧目标区域的位置和移动信息
    		if (targetsMovMsg.size() > 1) {
    			for (size_t i = 0; i < targetsMovMsg.size() - 1; i++)
    			{
    				for (size_t j = i +1; j < targetsMovMsg.size(); j++)
    				{
    					//1.区域质心在当前帧相距小于50
    					Point2f p1 = Point2f((float)targetsMovMsg[i][2], (float)targetsMovMsg[i][3]);
    					Point2f p2 = Point2f((float)targetsMovMsg[j][2], (float)targetsMovMsg[j][3]);
    					printf("区域质心在当前帧距离:%.2f\n", pts2fDist(p1, p2));
    					if (pts2fDist(p1, p2) < 55.0) {
    						//2.评价不同物体的移动一致性
    						double movOffset = getmovOffset(targetsMovMsg[i], targetsMovMsg[j]);
    						printf("移动一致性: %.2f \n", movOffset);
    						if (movOffset <= 30) {
    							//移动一致性小于20,认为是同一目标
    							line(img_abs1, Point(int(targetsMovMsg[i][2]), int(targetsMovMsg[i][3])),	//连接归并区域
    								Point(int(targetsMovMsg[j][2]), int(targetsMovMsg[j][3])), Scalar::all(255), 3, 8);
    						}			
    					}
    				}
    			}
    		}
    
    		//更新前一帧区域位置和颜色信息
    		contour_center[0].assign(contour_center[1].begin(), contour_center[1].end());	//更新位置信息
    		hsiMsg[0].assign(hsiMsg[1].begin(), hsiMsg[1].end());	//更新HSI颜色信息
    	}
    	cv::imshow("目标归并", img_abs1);
    	cv::imshow("区域移动轨迹", img_rgb);
    
    	if(prev_con.empty())
    		img_abs.copyTo(prev_con);
    	cv::imshow("前一帧二值图", prev_con);
    
    	img_abs.copyTo(prev_con);
    
    	img_abs1.copyTo(img_abs);
    }

    6、绘制轮廓(目标识别)

    7、迭代循环。到此算法结束

    检测结果如下:

    动态目标检测

     

    完整的程序已经放到这里了:https://download.csdn.net/download/qq_40081208/12253214

    平台是VS2017+opencv3.3.0+opencv contrib

     

    参考文献:

    1. 于明,孙炜烨,阎刚,等.动态场景下基于精确背景补偿的运动目标检测[J].计算机应用与软件,2013,30(10):145-147+204.
    2. 王洪斌. 基于全局运动补偿的动态背景下目标检测与轨迹跟踪方法研. 天津大学.
    更多相关内容
  • 动目标检测源码.zip

    2021-12-23 14:11:05
    基于光流法+配准的动目标检测算法,算法适用于复杂背景,即背景的特征点数量大于目标的特征点数量。
  • 基于时频图深度学习的雷达动目标检测与分类.pdf
  • 基于线性调频(LFM)脉冲压缩雷达原理及雷达动目标显示(MTI)的数学模型,通过与传统二脉冲对消和三脉冲对消的方法相对比,采用四脉冲对消和参差脉冲重复频率处理盲速的方法进行动目标检测。仿真实验证明,在动目标...
  • 针对步进频率雷达中运动目标高分辨距离像发散而引起的检测性能下降,以及速度补偿法无法完成多个不同速度目标检测的问题,提出了一种运用时域解线性调频法进行步进频率雷达动目标检测的新方法,该方法对所有子脉冲的...
  • 一阶动目标检测滤除杂波,该函数可以直接传入需要进行检测的数据矩阵,在快时间方向上进行处理
  • 非常非常非常好的动目标显示和动目标检测的仿真程序,对学习雷达动目标检测相关知识的同学很有用
  • 一个用于雷达动目标检测和动目标显示的MATLAB代码程序,可以仿真实现动目标检测和动目标显示并进行效果对比。
  • 针对杂波背景的微弱动目标检测问题,提出了一种应用小波包变换的分数阶Fourier域动目标检测算法。算法采用最小Shannon熵标准确定最优小波树,利用阈值删除技术,对杂波背景的参数精确估计,从而对不同频段信号进行滤波。...
  • 长时间相参积累技术是提高雷达对微弱运动目标探测能力的重要手段之一,本文在分析动目标回波信号距离和多普勒徙动的基础上,提出基于Radon-分数阶傅里叶变换...仿真结果表明本文方法具有在强杂波中检测微弱动目标的能力.
  • 介绍一种基于高速DSP芯片TMS320C6455构建的视频动目标检测装置,有效地利用6455的大容量内存空间等特点,采用EDMA功能实现了高速数据传输的乒乓缓冲结构设计,软件设计是基于背景更新的动目标检测算法,测试结果证明...
  • MTI动目标指示和MTD动目标检测

    千次阅读 多人点赞 2021-04-14 23:56:37
    MTD(moving targets detection)雷达系统中区分运动目标和杂波在于它们...动目标检测(MTD)不仅能滤除杂波,而且还可以将不同运动速度的目标区分开来,从而大大改善了在杂波背景下检测运动目标的能力。 后续补充 ...

    MTI 是一种频域滤波器(radar主席的ppt 中说到) ,它是对多组脉冲回波的同一个距离单元加权求和,得到一个结果;也就是多个输入一个输出;相当于一个高通滤波器,用来抑制固定目标和慢速杂波。就一次对消MTI 滤波器来说,就是将第一个发射脉冲的回波与第二个发射脉冲的回波相减,除去固定目标和慢速杂波,而保留了运动目标的信息,通过视频显示器可以看到幅度上下振动的波形,这也是为什么叫动目标显示;

    MTD (moving targets detection)是带通滤波器组,也就是多个输入多个输出,可以用FIR 组实现,但是一般用FFT 实现,即对不同脉冲组回波信号的相同距离单元做FFT 处理,N 个输入得到N 个输出,CACFAR 既是对这N 个输出进行检测和判断目标!若存在目标,这N 个输出中比出现一个峰值最大的数,则这个可能就是目标的位置信息,根据位置信息,即可以得到运动目标的多普勒值。MTD雷达系统中区分运动目标和杂波在于它们速度上的差别。由于速度不同而引起回波信号的多普勒频率不相等,所以可以通过多普勒频率的不同将杂波和运动目标区分开来。动目标检测(MTD)不仅能滤除杂波,而且还可以将不同运动速度的目标区分开来,从而大大改善了在杂波背景下检测运动目标的能力。

    MATLAB仿真:

    1,雷达信号做脉冲压缩

    % ===================================================================================%
    %                                    雷达参数                                       %
    % ===================================================================================%
    C=3.0e8;  %光速(m/s)
    RF=3.140e9/2;  %雷达射频 1.57GHz
    Lambda=C/RF;%雷达工作波长
    PulseNumber=16;   %回波脉冲数
    BandWidth=2.0e6;  %发射信号带宽 带宽B=1/τ,τ是脉冲宽度 
    TimeWidth=42.0e-6; %发射信号时宽
    PRT=240e-6;   % 雷达发射脉冲重复周期(s),240us对应1/2*240*300=36000米最大无模糊距离
    PRF=1/PRT;
    Fs=2.0e6;  %采样频率
    NoisePower=-12;%(dB);%噪声功率(目标为0dB)
    % ---------------------------------------------------------------%
    SampleNumber=fix(Fs*PRT);%计算一个脉冲周期的采样点数480;
    TotalNumber=SampleNumber*PulseNumber;%总的采样点数480*16=;
    BlindNumber=fix(Fs*TimeWidth);%计算一个脉冲周期的盲区-遮挡样点数;
    %===================================================================================%
    %                                    目标参数                                       %
    %===================================================================================%
     TargetNumber=4;%目标个数
    SigPower(1:TargetNumber)=[1 1 1 0.25];%目标功率,无量纲
    TargetDistance(1:TargetNumber)=[3000 8025 15800 8025];%目标距离,单位m   距离参数为[3000 8025 9000+(Y*10+Z)*200 8025]
     DelayNumber(1:TargetNumber)=fix(Fs*2*TargetDistance(1:TargetNumber)/C);% 把目标距离换算成采样点(距离门) fix函数向0靠拢取整
    TargetVelocity(1:TargetNumber)=[50 0 204 100];%目标径向速度 单位m/s   速度参数为[50 0 (Y*10+X+Z)*6 100]
    TargetFd(1:TargetNumber)=2*TargetVelocity(1:TargetNumber)/Lambda; %计算目标多卜勒频移2v/λ
     
    %====================================================================================%
    %                                   产生线性调频信号                                  %
    %====================================================================================%
     number=fix(Fs*TimeWidth);%回波的采样点数=脉压系数长度=暂态点数目+1
    if rem(number,2)~=0  %rem求余
       number=number+1;
    end   %把number变为偶数
     
    for i=-fix(number/2):fix(number/2)-1
       Chirp(i+fix(number/2)+1)=exp(j*(pi*(BandWidth/TimeWidth)*(i/Fs)^2));%exp(j*fi)*,产生复数矩阵Chirp
    end
    coeff=conj(fliplr(Chirp));%把Chirp矩阵翻转并把复数共轭,产生脉压系数
    figure(1);%脉压系数的实部
    plot(real(Chirp));axis([0 90 -1.5 1.5]);title('脉压系数实部');

    2,生成目标信号回波

    %-------------------------产生目标回波串-----------------------------------------------------------------------------------------%
    %-------------------------产生前3个目标的回波串-------%
    SignalAll=zeros(1,TotalNumber);%所有脉冲的信号,先填0
    for k=1:TargetNumber-1 % 依次产生各个目标
       SignalTemp=zeros(1,SampleNumber);% 一个PRT
       SignalTemp(DelayNumber(k)+1:DelayNumber(k)+number)=sqrt(SigPower(k))*Chirp;%一个脉冲的1个目标(未加多普勒速度)(DelayNumber(k)+1):(DelayNumber(k)+number)
       Signal=zeros(1,TotalNumber);
       for i=1:PulseNumber % 16个回波脉冲
          Signal((i-1)*SampleNumber+1:i*SampleNumber)=SignalTemp; %每个目标把16个SignalTemp排在一起
       end
       FreqMove=exp(j*2*pi*TargetFd(k)*(0:TotalNumber-1)/Fs);%目标的多普勒速度*时间=目标的多普勒相移
       Signal=Signal.*FreqMove;%加上多普勒速度后的16个脉冲1个目标
       SignalAll=SignalAll+Signal;%加上多普勒速度后的16个脉冲4个目标
    end
    % %-------------------------产生第4个目标的回波串-------%
       fi=pi/3;
       SignalTemp=zeros(1,SampleNumber);% 一个脉冲
       SignalTemp(DelayNumber(4)+1:DelayNumber(4)+number)=sqrt(SigPower(4))*exp(j*fi)*Chirp;%一个脉冲的1个目标(未加多普勒速度)
       Signal=zeros(1,TotalNumber);
       for i=1:PulseNumber
          Signal((i-1)*SampleNumber+1:i*SampleNumber)=SignalTemp;
       end
       FreqMove=exp(j*2*pi*TargetFd(4)*(0:TotalNumber-1)/Fs);%目标的多普勒速度*时间=目标的多普勒相移
       Signal=Signal.*FreqMove;
       SignalAll=SignalAll+Signal;
     
    figure(2);
    subplot(2,1,1);plot(real(SignalAll),'r-');title('目标信号的实部');grid on;zoom on;
    subplot(2,1,2);plot(imag(SignalAll));title('目标信号的虚部');grid on;zoom on;

    3,产生系统噪声信号

    %====================================================================================%
    %                                   产生系统噪声信号                                  %
    %====================================================================================%
    SystemNoise=normrnd(0,10^(NoisePower/10),1,TotalNumber)+j*normrnd(0,10^(NoisePower/10),1,TotalNumber);
    %均值为0,标准差为10^(NoisePower/10)的噪声
    %====================================================================================%
    %                                   总的回波信号                                     %
    %====================================================================================%
    Echo=SignalAll+SystemNoise;% +SeaClutter+TerraClutter,加噪声之后的回波
    for i=1:PulseNumber   %在接收机闭锁期,接收的回波为0
          Echo((i-1)*SampleNumber+1:(i-1)*SampleNumber+number)=0; %发射时接收为0
    end
    figure(3);%加噪声之后的总回波信号
    subplot(2,1,1);plot(real(Echo),'r-');title('总回波信号的实部,闭锁期为0');
    subplot(2,1,2);plot(imag(Echo));title('总回波信号的虚部,闭锁期为0');

    4,时域脉冲压缩和频域脉冲压缩

    %================================时域脉压=================================%
    pc_time0=conv(Echo,coeff);%pc_time0为Echo和coeff的卷积
    pc_time1=pc_time0(number:TotalNumber+number-1);%去掉暂态点 number-1个
    figure(4);%时域脉压结果的幅度
    subplot(2,1,1);plot(abs(pc_time0),'r-');title('时域脉压结果的幅度,有暂态点');%pc_time0的模的曲线
    subplot(2,1,2);plot(abs(pc_time1));title('时域脉压结果的幅度,无暂态点');%pc_time1的模的曲线
    % ================================频域脉压=================================%
    Echo_fft=fft(Echo,8192);%理应进行TotalNumber+number-1点FFT,但为了提高运算速度,进行了8192点的FFT
    coeff_fft=fft(coeff,8192);
    pc_fft=Echo_fft.*coeff_fft;
    pc_freq0=ifft(pc_fft);
    figure(5);

    按照脉冲号、距离门号重排数据

    pc_freq1=pc_freq0(number:TotalNumber+number-1);%去掉暂态点 number-1个,后填充点若干(8192-number+1-TotalNumber)
    % ================按照脉冲号、距离门号重排数据=================================%
    for i=1:PulseNumber
          pc(i,1:SampleNumber)=pc_freq1((i-1)*SampleNumber+1:i*SampleNumber);%每个PRT为一行,每行480个采样点的数据
    end
    figure(6);
    plot(abs(pc(1,:)));title('频域脉压结果的幅度,没有暂态点');

    5,MTI和MTD

    % ================MTI(动目标显示),对消静止目标和低速目标---可抑制杂波=================================%
    for i=1:PulseNumber-1  %滑动对消,少了一个脉冲
       mti(i,:)=pc(i+1,:)-pc(i,:);
    end
    figure(7);
    mesh(abs(mti));title('MTI  result');
     
    % ================MTD(动目标检测),区分不同速度的目标,有测速作用=================================%
    mtd=zeros(PulseNumber,SampleNumber);
    for i=1:SampleNumber
       buff(1:PulseNumber)=pc(1:PulseNumber,i);
       buff_fft=fft(buff);
       mtd(1:PulseNumber,i)=buff_fft(1:PulseNumber);
    end
      figure(8);mesh(abs(mtd));title('MTD  result');

    6,虚实矩阵转换
    coeff_fft_c=zeros(1,2*8192);
    for i=1:8192
        coeff_fft_c(2*i-1)=real(coeff_fft(i));
        coeff_fft_c(2*i)=imag(coeff_fft(i));
    end
    echo_c=zeros(1,2*TotalNumber);
    for i=1:TotalNumber
        echo_c(2*i-1)=real(Echo(i));
        echo_c(2*i)=imag(Echo(i));
    end

    function y=maiya(PulseNumber,range,Fs,TargetVelocity,SNR)
    
    C=3e8;
    Tr=800e-6;%单脉冲最大可测距离0.5*Tr*C=120000m
    Tp=160e-6;
    fr=1/Tr;
    lamda=0.03;
    B=1e6;
    %% 产生线性调频信号 
    number=fix(Fs*Tp);%单脉冲发射信号内采样点数
    SampleNumber=fix(Fs*Tr);%一个脉冲采样点数,800;则每个采样间距代表120000/799m
    TotalNumber=SampleNumber*PulseNumber;
    for i=-fix(number/2):fix(number/2)-1
        Chirp(i+fix(number/2)+1)=exp(j*(pi*(B/Tp)*(i/(Fs))^2)); 
    end  
    figure
    plot(real(Chirp));
    title('线性调频信号')
    coeff=conj(fliplr(Chirp));%匹配滤波函数h
    figure
    plot(real(coeff))
    title('匹配滤波函数h')
    
    
    W = linspace(-pi,pi,4096);    
    [h1,w0] = freqz(coeff,1,W);  
    figure
    plot(w0/pi,20*log10(abs(h1/max(h1)))); 
    title('匹配滤波函数H频率响应')
    %-------
    %% 产生目标回波
    TargetDistance(1:2)=range;
    DelayNumber(1:2)=fix(Fs*2*TargetDistance(1:2)/C);
    
    TargetFd(1:2)=2*TargetVelocity(1:2)/lamda; %计算目标多卜勒
    
    SignalAll=zeros(1,TotalNumber);%所有脉冲的信号,先填0
    for k=1:2% 依次产生各个目标1 2 
        SignalTemp=zeros(1,SampleNumber);% 一个脉冲
       
        SignalTemp(DelayNumber(k)+1:DelayNumber(k)+number)=(10^(SNR(k)/10))*Chirp;  %一个脉冲的1个目标(未加多普勒速度)
        Signal=zeros(1,TotalNumber);
        for i=1:PulseNumber
            Signal((i-1)*SampleNumber+1:i*SampleNumber)=SignalTemp;
        end
        FreqMove=exp(j*2*pi*TargetFd(k)*(0:TotalNumber-1)/Fs);%目标的多普勒速度*时间=目标的多普勒相移
        Signal=Signal.*FreqMove;
        SignalAll=SignalAll+Signal;
    end
    figure
    subplot(2,1,1);plot(real(SignalAll),'r-');title('目标信号的实部');grid on;zoom on;
    subplot(2,1,2);plot(imag(SignalAll));title('目标信号的虚部');
    grid on;zoom on;
    %% 产生噪声
    SystemNoise=normrnd(0,10^(-12/10),1,TotalNumber)+j*normrnd(0,10^(-12/10),1,TotalNumber);
    %% 回波+噪声
    Echo=SignalAll+SystemNoise;   % +SeaClutter+TerraClutter;
    for i=1:PulseNumber   %在接收机闭锁期,接收的回波为0
        Echo((i-1)*SampleNumber+1:(i-1)*SampleNumber+number)=0;
    end
    figure
    plot(real(Echo));title('总回波信号的实部,闭锁期为0');
    %subplot(2,1,2);plot(imag(Echo));title('总回波信号的虚部,闭锁期为0');
    
    %% 回波积累
    Echoplus=zeros(1,SampleNumber);
    for i=1:PulseNumber
       Echoplus1(1:SampleNumber)=Echo((i-1)*SampleNumber+1:i*SampleNumber);
       Echoplus=Echoplus+Echoplus1(1:SampleNumber);
    end
    Echoplus=Echoplus/PulseNumber;
    figure
    plot(real(Echoplus));title('回波脉冲积累信号的实部,闭锁期为0');
    
    
    %% 时域脉压
    pc_time0=conv(Echo,coeff);
    %figure
    %plot(abs(pc_time0));title('时域脉压结果的幅度,有暂态点');
    %% 频域脉压
    Echo_fft=fft(Echo,TotalNumber+number-1);%进行TotalNumber+number-1点FFT
    coeff_fft=fft(coeff,TotalNumber+number-1);
    pc_fft=Echo_fft.*coeff_fft;
    pc_freq0=ifft(pc_fft);
    pc_freq_abs=abs(pc_freq0);
    figure
    plot(pc_freq_abs);title('(不加窗)频域脉压结果的幅度(有暂态点)');
    
    %%  数据重排到距离门
    pc_freq1=pc_freq0(number:TotalNumber+number-1);
    for i=1:PulseNumber
       pc(i,1:SampleNumber)=pc_freq1((i-1)*SampleNumber+1:i*SampleNumber);
    end
    
    
    figure
    
    %subplot(2,1,1)
    %plot((0:SampleNumber-1)*(120000/(SampleNumber-1)), abs(pc(5,:)) );
    % title('不加窗脉压结果');xlabel('距离'),ylabel('脉压输出');
     
    plot((0:SampleNumber-1)*(120000/(SampleNumber-1)), 20*log10(abs(pc(1,:))) );
    xlabel('距离'),ylabel('脉压输出/db');
    axis([-inf,inf, -10,50]);
    title('不加窗脉压结果')
    %% 加窗处理 
    win=chebwin(number,35)';
    h_w=coeff.*win;
    hfft_w=fft(h_w,TotalNumber+number-1);
    y=abs(ifft(Echo_fft.*hfft_w));
    %figure
    %plot(y);title('(加窗)频域脉压结果的幅度(有暂态点)');
    
    pcW_freq1=y(number:TotalNumber+number-1);  %重排数据
    for i=1:PulseNumber
       pcW(i,1:SampleNumber)=pcW_freq1((i-1)*SampleNumber+1:i*SampleNumber);
    end
    
    figure
    %subplot(2,1,1)
    %plot((0:SampleNumber-1)*(120000/(SampleNumber-1)), abs(pcW(1,:)) );
     %title('加窗脉压结果');xlabel('距离'),ylabel('脉压输出');
     
    
    plot((0:SampleNumber-1)*(120000/(SampleNumber-1)), 20*log10(abs(pcW(1,:))) );
    xlabel('距离'),ylabel('脉压输出/db');
    axis([-inf,inf, -10,50]);
    title('加窗脉压结果')
    
    
    %% 相干积累
    Echoplus_fft=fft(Echoplus,SampleNumber+number-1);%理应进行TotalNumber+number-1点FFT,但为了提高运算速度,进行了8192点的FFT
    coeffplus_fft=fft(coeff,SampleNumber+number-1);
    pcplus_fft=Echoplus_fft.*coeffplus_fft;
    pcplus_freq=abs(ifft(pcplus_fft));
    %figure
    %plot(pcplus_freq);title('(不加窗)积累后频域脉压结果的幅度,有暂态点');
    
    pcplus_freq1=pcplus_freq(number:SampleNumber+number-1);
    figure
    subplot(2,1,1)
    plot((0:SampleNumber-1)*(120000/(SampleNumber-1)), abs(pcplus_freq1) );
     title('不加窗积累后脉压结果');xlabel('距离'),ylabel('脉压输出');
    subplot(2,1,2)
    
    plot((0:SampleNumber-1)*(120000/(SampleNumber-1)), (20*log10((pcplus_freq1))));
     title('不加窗积累后脉压结果');xlabel('距离'),ylabel('脉压输出/DB');
     axis([-inf,inf, -20,50]);
    
    %% mti对消
    for i=1:PulseNumber-1  %滑动对消,少了一个脉冲 2脉冲
        mti(i,:)=pc(i+1,:)-pc(i,:);
    end
    mti_abs=abs(mti);
    figure
    mesh(20*log10(mti_abs));title('MTI  result');
    xlabel('距离单元');
       ylabel('多普勒通道');
       zlabel('幅度值');
    axis([-inf,inf,-inf,inf, 0,100]);
    
    %% MTD
    
    mtd=zeros(PulseNumber,SampleNumber);
    mtd_abs=zeros(PulseNumber,SampleNumber);
    for i=1:SampleNumber
        buff(1:PulseNumber)=pc(1:PulseNumber,i);
        buff_fft=fftshift(fft(buff)); %用fftshift将零频搬移到中间 这样可以方便观察速度正负
        mtd(1:PulseNumber,i)=buff_fft(1:PulseNumber)';
    end
    mtd_abs=abs(mtd);
    x=0:1:SampleNumber-1;
    y=-PulseNumber/2:1:PulseNumber/2-1;     %通道这样设后读出的通道数乘单位值则是速度值。
    figure
    mesh(x,y,20*log10(mtd_abs));title('MTD  result');
    xlabel('距离单元');
       ylabel('多普勒通道');
       zlabel('幅度值');
    axis([-inf,inf,-inf,inf, 0,100]);
    
    %% cfar
    
    
    cfar=zeros(PulseNumber,SampleNumber);
     T=sqrt(2*(10^(-12/10))^2*log(1/(1e-6)));
     for i=1:PulseNumber 
        for k=1:2
             left=0;
             right=Mean(mtd_abs(i,:),k+2,k+17);
             maxV=max(left,right);
            if(mtd_abs(i,k)>=T*maxV)
                 cfar(i,k)=mtd_abs(i,k);
            else
                 cfar(i,k)=0;
            end       
        end
        
        
        for k=3:17
            left=Mean(mtd_abs(i,:),1,k-2);
            right=Mean(mtd_abs(i,:),k+2,k+17);
            maxV=max(left,right);
            if(mtd_abs(i,k)>=T*maxV)
                cfar(i,k)=mtd_abs(i,k);
            else
                cfar(i,k)=0;
            end
        end
         for k=18:SampleNumber-18
            left=Mean(mtd_abs(i,:),k-17,k-2);
            right=Mean(mtd_abs(i,:),k+2,k+17);
            maxV=max(left,right);
            if(mtd_abs(i,k)>=T*maxV)
                cfar(i,k)=mtd_abs(i,k);
           else
                cfar(i,k)=0;
            end
         end
        for k=SampleNumber-17:SampleNumber-2
            left=Mean(mtd_abs(i,:),k-17,k-2);
            right=Mean(mtd_abs(i,:),k+2,SampleNumber);
            maxV=max(left,right);
            if(mtd_abs(i,k)>=T*maxV)
                cfar(i,k)=mtd_abs(i,k);
            else
                cfar(i,k)=0;
            end
        end
        for k=SampleNumber-1:SampleNumber
             left=Mean(mtd_abs(i,:),k-17,k-2);
             right=0;
             maxV=max(left,right);
             if(mtd_abs(i,k)>=T*maxV)
                 cfar(i,k)=mtd_abs(i,k);
             else
                 cfar(i,k)=0;
             end 
        end
     end
       figure
       
       IQ_acc=mean(abs(mti));
       mesh(x,y,20*log10(cfar));title(' CFAR  result');
       xlabel('距离单元');
       ylabel('多普勒通道');
       zlabel('幅度值');
     axis([-inf,inf,-inf,inf, 0,100]);
    figure
     plot(x,20*log10(cfar(:,:)),x,20*log10(abs(IQ_acc)));
     title(' CFAR  result');
     xlabel('距离单元');
       ylabel('幅度');
    axis([-inf,inf, -20,100]);

     

    展开全文
  • 提出一种运动序列中动目标检测的稳健性方法。用尺度不变特征变换(SIFT)算法生成特征描述符,基于最近邻距离比(NNDR)进行初始匹配,增加对称性约束以获得稳健的匹配点集。随机抽样一致集算法(RANSAC)用于分离背景和...
  • 基于DPCA算法的动目标检测,非常实用,希望对你有帮助(DPCA-based moving target detection algorithm is very useful and would like to help you)
  • Vibe 运动目标检测 基于matlab(Vbie Moving Target Detection)
  • 提出了一种基于双孔径天线沿航迹向干涉(ATI,Along-Track Inter-ferometry)的动目标检测、测速及定位的实现方法 。该方法与 DPCA(Displaced Phase Center Antenna)技术相比,不要求天线载体速度和脉冲重复频率之间必须...
  • 研究摄像机运动情况下的运动目标检测和跟踪问题,给出了一种基于块匹配的背景运动补偿差分方法 。将 此算法和对称差分法结合,给出了一种摄像机的运动目标跟踪方法,以复杂场景下的人为跟踪目标进行了实验,取得了不错...
  • 基于intel开源视觉库openCV编写的用于视频监控中动态目标检测的项目总结,包含源代码,有两种方法实现动态目标检测:帧差法、背景差法
  • ADPCA 动目标检测

    2018-12-10 16:35:34
    动目标检测DPCA技术,主要应用于SAR领域
  • 雷达原理之动目标检测及测速技术

    千次阅读 多人点赞 2020-05-20 21:45:01
    雷达原理笔记之动目标检测及测速技术 ——南京理工大学许志勇老师的《雷达原理课程》浅析 文章目录雷达原理笔记之动目标检测及测速技术1.杂波对消处理1.1任务1.2一次杂波对消器:1.3二次杂波对消器2多普勒滤波器组...

    雷达原理笔记之动目标检测及测速技术

    ——南京理工大学许志勇老师的《雷达原理课程》浅析


    动目标检测技术主要包括MTI杂波对消处理以及MTD窄带多普勒滤波组滤波处理。本文主要介绍这两个方面的实现原理及过程。

    1.杂波对消处理

    雷达检测目标常常是在强杂波背景中进行,信杂比非常小。这对目标探测很不利。考虑到杂波频谱通常比较稳定,大多在零多普勒附近,由此引出消除固定、低速杂波的滤波器——杂波对消器。

    1.1任务

    • 抑制固定杂波以及低速杂波,进而提取运动目标信息。

    1.2一次杂波对消器:

    y [ n ] = x [ n ] − α x [ n − 1 ] y[n]=x[n]-\alpha x[n-1] y[n]=x[n]αx[n1]

    滤波器频率特性:
    H ( z ) = 1 − α z − 1 H(z)=1-\alpha z^{-1} H(z)=1αz1
    其中 α \alpha α通常取接近1但小于1的常数。目的是保证尽可能多地滤除杂波的同时,处在零多普勒点的运动目标不被抑制完全。对比见下图:
    在这里插入图片描述

    1.3二次杂波对消器

    y [ n ] = x [ n ] − α x [ n − 1 ] + x [ n − 2 ] y[n]=x[n]-\alpha x[n-1]+x[n-2] y[n]=x[n]αx[n1]+x[n2]

    滤波器频率特性:
    H ( z ) = 1 − α z − 1 + z − 2 H(z)=1-\alpha z^{-1}+z^{-2} H(z)=1αz1+z2
    其中 α \alpha α通常取接近2但小于2的常数。目的同样是在保证尽可能多地滤除杂波的同时,处在零多普勒点的运动目标不被抑制完全。对比见下图:

    在这里插入图片描述

    二次杂波对消器是工程中应用最多的杂波处理滤波器。对于低速的杂波消除,频响特性可以向右平移一定的区间,平移的量是杂波运动速度对应的多普勒频移。因此对于低速运动杂波对消的滤波特性为:
    H ( z ) = 1 − α e j β z − 1 + e j 2 β z − 2 H(z)=1-\alpha e^{j\beta}z^{-1}+e^{j2\beta}z^{-2} H(z)=1αejβz1+ej2βz2
    其中 β \beta β为杂波速度对应的多普勒频移

    在这里插入图片描述

    利用二次杂波对消器处理杂波时,选取相参积累脉冲个数为 K = 2 N + 2 K=2^N+2 K=2N+2

    2多普勒滤波器组处理

    一般,将MTI处理后输出的信号进行MTD处理,即窄带滤波处理,得到运动目标的速度信息。

    2.1窄带多普勒滤波器组实现

    利用有N个输出的横向滤波器,经过各脉冲的加权求和实现。

    在这里插入图片描述

    每根延时线延迟时间 T = 1 / P R F T=1/PRF T=1/PRF。每个窄带滤波器输出的频率响应为:
    H k ( f ) = e − j 2 π f t ∑ i = 1 N e − j 2 π ( i − 1 ) [ f T − k / N ] H_k(f)=e^{-j2\pi ft}\sum_{i=1}^{N}e^{-j2\pi (i-1)[fT-k/N]} Hk(f)=ej2πfti=1Nej2π(i1)[fTk/N]
    频响幅度为:
    ∣ H k ( f ) ∣ = s i n [ π N ( f T − k / N ) ] s i n [ π ( f T − k / N ) ] |H_k(f)|=\frac{sin[\pi N(fT-k/N)]}{sin[\pi (fT-k/N)]} Hk(f)=sin[π(fTk/N)]sin[πN(fTk/N)]
    在这里插入图片描述

    上图所示的多普勒滤波器组,对应的发射信号脉冲重复频率为10kHz。其覆盖整个多普勒频谱周期 [ − 5000 H z , 5000 H z ] [-5000Hz,5000Hz] [5000Hz,5000Hz]。这个周期称作是多普勒滤波器组的主周期。此滤波器组长度N=8。每个窄带滤波器中心频率满足:
    f = 5000 k / N ( H z ) ( N = 8 , k = − 4 , − 3 , … 4 ) f=5000k/N(Hz)\quad (N=8,k=-4,-3,…4) f=5000k/N(Hz)(N=8,k=4,3,4)
    若某运动目标的频谱出现在其中一个滤波器中,则该滤波器的中心频率对应的频率即为运动目标 f d f_d fd的估值。

    当然,N取值越大对应的滤波器组间隔越小,运动目标的 f d f_d fd的估值越接近真实值。

    利用多普勒滤波器组实现相参积累,可以将白噪声背景中信号的信噪比提高N倍。

    3.附录

    3.1一次相消器图片matlab代码

    clc
    close all
    clearvars
    a=0.8;
    T=1e-4;%发射信号周期
    f=-1/T:10:1/T;%频率轴
    w=2*pi*f;%角频率
    z=exp(1j*w*T);%映射到z轴
    H=1-a*z.^(-1);%滤波器传输函数表达式(针对静止杂波)
    figure
    subplot(1,2,1)
    plot(f,(abs(H)),'r-','LineWidth',2);
    title('\alpha=0.8')
    xlabel('f/Hz')
    ylabel('|H(f)|')
    subplot(1,2,2)
    a=1;
    H=1-a*z.^(-1);%滤波器传输函数表达式(针对运动杂波)
    plot(f,(abs(H)),'r-','LineWidth',2);
    title('\alpha=1')
    xlabel('f/Hz')
    ylabel('|H(f)|')
    suptitle('一次相消器幅度-频率响应曲线')
    

    3.2二次相消器图片matlab代码

    clc
    close all
    clearvars
    a=1.8;
    T=1e-4;%发射信号周期
    f=-1/T:10:1/T;%频率轴
    w=2*pi*f;%角频率
    z=exp(1j*w*T);%映射到z轴
    H=1-a*z.^(-1)+z.^(-2);%滤波器传输函数表达式(针对静止杂波)
    figure
    subplot(1,2,1)
    plot(f,(abs(H)),'b-','LineWidth',2);
    title('\alpha=1.8')
    xlabel('f/Hz')
    ylabel('|H(f)|')
    subplot(1,2,2)
    a=2;
    H=1-a*z.^(-1)+z.^(-2);%滤波器传输函数表达式(针对运动杂波)
    plot(f,(abs(H)),'b-','LineWidth',2);
    title('\alpha=2')
    xlabel('f/Hz')
    ylabel('|H(f)|')
    suptitle('二次相消器幅度-频率响应曲线')
    

    3.3二次相消器图片(静止、运动杂波)matlab代码

    clc
    close all
    clearvars
    k=1.7;
    T=1e-4;%发射信号周期
    f=-1/T:10:1/T;%频率轴
    w=2*pi*f;%角频率
    z=exp(1j*w*T);%映射到z轴
    H=1-k*z.^(-1)+z.^(-2);%滤波器传输函数表达式(针对静止杂波)
    figure
    subplot(1,2,1)
    plot(f,(abs(H)),'c-','LineWidth',2);
    title('针对静止杂波')
    xlabel('f/Hz')
    ylabel('|H(f)|')
    subplot(1,2,2)
    b=0.2*1/T;%平移量0.2倍的频谱周期
    z1=exp(-1j*b)*z;%加上平移
    H=1-k*z1.^(-1)+z1.^(-2);%滤波器传输函数表达式(针对运动杂波)
    plot(f,(abs(H)),'c-','LineWidth',2);
    title('针对运动杂波')
    xlabel('f/Hz')
    ylabel('|H(f)|')
    suptitle('二次相消器幅度-频率响应曲线')
    

    3.4多普勒滤波器组频响matlab代码

    clc
    close all
    clearvars
    N=8;
    T=1e-4;%发射信号周期
    f=-0.5/T:10:0.5/T;%频率轴
    for k=0:N-1
    H=(sin(pi*N*(f*T-k/N)))./(sin(pi*(f*T-k/N)));%滤波器传输函数表达式(针对静止杂波)
    plot(f,abs(H),'g-','LineWidth',2);
    hold on
    end
    title('窄带多普勒滤波器组')
    xlabel('f/Hz')
    ylabel('|H(f)|')
    
    展开全文
  • 动目标检测技术

    2015-06-14 23:12:24
    基于机载GMTI雷达的地面动目标跟踪,对从事机载雷达数据处理的同仁应该会有一些帮助。
  • 提出一种针对动目标检测和成像雷达的正弦调频干扰产生模型,将接收到的雷达发射信号进行正弦波频率调制,再与假的动目标模板信号进行卷积后转发。假目标回波附加的正弦频率调制使得两个通道间信号的差异增大,相关性...
  • 大数据-算法-视频动目标检测与跟踪算法研究.pdf
  • 网络技术-网络监控-视频监控动目标检测跟踪算法设计.pdf
  • 大数据-算法-视频序列中动目标检测与跟踪算法的研究.pdf
  • 地面动目标检测(GMTI)是星载分布式雷达的重要应用之一,利用星载稀疏阵可增加系统虚拟孔径,以改善动目标检测性能。扫描模式干涉雷达(Scanning Pattern Interferometric Radar,简称SPIR)是一种雷达天线阵波束...
  • 该文提出了一种临近空间慢速平台SAR地面动目标检测与成像方法。由于平台运动速度较慢,地面静止杂波多普勒展宽较窄,有利于将地面杂波与动目标回波进行分离。首先利用多普勒滤波器实现地面动目标回波与静止杂波的...
  • 分析了影响SAR-ATI动目标检测干涉相位图中点幅度和相位分布的因素——包括雷达噪声、杂波能量、地面RCS起伏以及成像时的旁瓣等。针对SAR-ATI检测时虚警概率过高问题,基于幅度门限和相位门限联合动目标检测处理,提出...
  • 针对干涉合成孔径雷达(InSAR)构型下动目标检测与测速中存在相位耦合以及地形起伏引起的杂波非平稳问题,提出一种动目标检测方法.首先利用两幅SAR图像的相关性进行图像配准,然后进行去平地相位及高程相位补偿,采用噪声...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 244,684
精华内容 97,873
关键字:

动目标检测

友情链接: pygame1.9.4forPython3.7.rar