当前位置:首页 > 嵌入式 > 嵌入式硬件
[导读]通过借鉴嵌入式系统在电子技术、信号处理以及计算机等领域应用的成功经验,在分析目标检测与跟踪算法的基础上,将目标检测与跟踪算法与嵌入式技术相结合,设计一种基于嵌入式PIC32单片机的目标检测与跟踪系统,可以实现目标检测跟踪系统的小型化,智能化,并以具体飞行目标为例进行了目标的识别和跟踪。

摘 要:

通过借鉴嵌入式系统在电子技术、信号处理以及计算机等领域应用的成功经验,在分析目标检测与跟踪算法的基础上,将目标检测与跟踪算法与嵌入式技术相结合,设计一种基于嵌入式PIC32单片机的目标检测与跟踪系统,可以实现目标检测跟踪系统的小型化,智能化,并以具体飞行目标为例进行了目标的识别和跟踪。

研究目的

随着现代社会对军用和民用设备需求的不断扩大及要求的不断提高,运动目标的识别和跟踪技术已经迅速发展成为现代信息处理领域中一项非常重要的技术,也是无人机野外战场侦察技术中的重点和难点,并在许多领域内发挥着不可替代的作用。目前,基于PC 机的目标检测与跟踪技术已趋于成熟,但其在嵌入式平台的应用研究还处于初级阶段。由于嵌入式系统具有体积小巧,便于携带等一系列PC 机无法替代的优点,因此如何对飞行目标进行有效检测和跟踪并且在嵌入式系统中实现是目前急需解决的课题。针对以上问题本文设计了一个基于嵌入式的目标检测与跟踪系统,本系统具有体积小、实时性好并且可对运动目标进行有效实时跟踪的特点。也为开展实时化微型化的嵌入式机器视觉系统的研究进行了有益的尝试。

系统总体方案

本课题研究的是无人机在复杂背景环境下对目标的检测和跟踪的嵌入式实现问题,目标跟踪系统是利用一个可移动的图像处理设备实现图像中运动物体的检测和跟踪,解决了军用和工业等方面发展对目标跟踪系统的小型化要求。

1.主要研究以下方面的内容:

(1)嵌入式视觉跟踪系统的硬件设计

嵌入式平台是解决实时性和小型化的有效途径,采用基于PIC32的嵌入式平台的目标跟踪系统的解决方案可以满足设备功能的要求。

针对小型化的实际需求,本系统采用USB摄像头作为采集目标图像的设备,采用PIC32内核开发板作为中央控制器,以及云台、云台控制器等外围设备,形成完整的视觉反馈跟踪系统。

(2)嵌入式视觉跟踪系统的软件设计

针对被跟踪目标的特点,设计实时识别与跟踪算法,利用嵌入式系统软件MPLAB IDE集成开发环境具体开发系统的数据接收,特征识别和反馈控制等软件模块,采用MPLAB C32 C编译器将目标跟踪的算法编译实现,实现对运动目标的识别与跟踪。

(3)仿真实验,调试

在设计好的嵌入式实验平台上进行跟踪实验,经过反复调试,直到测试跟踪的效果达到预期的要求。

2 研究方案

根据以上研究内容,将目标的检测和跟踪方案的嵌入式实现分成硬件和软件两部分。

嵌入式视觉跟踪系统的硬件方案:

系统硬件结构图如图1所示:

图1系统硬件结构图

系统总体硬件结构如图1所示。在PIC32嵌入式系统平台上移植并配置MPLAB IDE集成开发环境,针对平台和应用的特点,制作合适的文件系统,编写应用程序。运动目标经USB摄像头实时采集后,送入PIC32处理器,利用嵌入式处理器的强大运算能力,对采集到的图像进行处理,完成目标识别与定位,并控制云台控制器,调整摄像头位姿,使摄像头对准运动目标,实现实时跟踪。实时性好和体积小巧是本嵌入式跟踪系统追求的目标。

嵌入式视觉跟踪系统的软件方案:

(1)MPLAB C32 C编译器

C 代码应用程序:32 位语言工具库位于MPLAB C32 C 编译器安装目录的pIC32mxlib 子目录中,默认情况下存放在:C:Program FilesMicrochipMPLAB C32pic32mxlib可以通过MPLAB C32 链接器将这些库直接链接到应用程序中。

(2)启动代码

为初始化数据存储器中的变量,链接器创建一个数据初始化映像。这个映像必须在启动时、在应用程序正确获取控制权之前复制到RAM 中。crt0.o 中的启动代码执行运行时环境的初始化。

(3)32 位外设函数库

32 位软件和硬件外设函数库为设置和控制32 位外设提供了函数和宏。 这些库是特定于处理器的,形式为libmchp_peripheral_Device.a,其中Device 为32 位器件型号。

(4)标准C 函数库(包含数学函数)

提供了一套完整的符合ANSI-89 的库。 标准的C 语言库文件是libc.a (由MIPS Technologies 编写)、libe.a 和libm.a。一个典型的C 应用程序必须包含全部这三个库,这三个库在默认情况下就被链接进来,无需用户指定。

1.MPLAB IDE集成开发环境

MPLAB 集成开发环境 (IDE) 是一个采用Microchip 的PICmicro 和 dsPIC开发嵌入式应用的免费集成工具箱。MPLAB IDE在32-bit 的MS Windows下运行,是一个简单易用的开发环境,并且包含很多可进行快速应用开发和调试的免费软件。MPLAB IDE同样也充当一个附加的Microchip和第三方软件和硬件工具的图形用户界面。

2.实现目标跟踪算法的应用程序

应用程序是针对需求编写的仅适用于本系统的专用程序。本系统应用程序流程如图2所示。初始化后打开设备文件(摄像头等),查询和确认设备性能,设置捕获的图像的宽和高,设置色深,建立内存映射,读取图像数据,对图像进行处理,关闭设备。图像采集有两种方式:内存映射(mmap)和直接读取设备(read)。前者将设备文件映射到内存,绕过I/O访问,使得读取速度更快,但是占用更多系统资源。考虑系统实时性,因此采用内存映射方式。

图2系统应用程序流程图

在本系统中,采用MPLAB C32 C编译器将目标跟踪的算法编译实现,由一系列C函数和少量C++类构成,可以实现图像处理和计算机视觉方面的很多通用算法。

3.目标检测和跟踪算法的设计方案:

①目标的检测部分:

对航空图片进行contourlet变换。该变换能满足各向异性的性质。Contourlet变换是使用拉普拉斯滤波器对图象进行多尺度分解,以捕获二维图像中存在的点奇异性,得到原图像的低频图像和高频图像,递归地对低通图像进行分解,得到整个多分辨率图像。对分解后每一尺度上的高频图像使用方向滤波器组,得到各奇异点的多方向性图像。采用contourlet变换提取各尺度下的稳定数值特征,构建相应的特征库,利用目标质心建立目标跟踪点,匹配真正的飞行目标。

②目标的跟踪部分:

本系统采用的目标跟踪算法为Mean-Shift算法。Mean-Shift算法是一种计算局部最优的搜索算法,通过计算候选目标与目标模块直接之间相似度的概率密度分布,然后利用概率密度梯度下降的方向来获取匹配搜索的最佳路径,加速运动目标的定位降低搜索的时间。

摄像头驱动程序

#include "stdafx.h"

#include "Camera.h"

#include "CameraDlg.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

// CAboutDlg dialog used for App About

IplImage*image=NULL;

CvHistogram *hist = 0;

int backproject_mode = 0;

int select_object = 0;

int track_object = 0;

int show_hist = 1;

CvPoint origin;

CvRect selection;

CvRect track_window;

CvBox2D track_box; // tracking ·µ»ØµÄÇøÓò box£¬´ø½Ç¶È

CvConnectedComp track_comp;

int hdims = 48; // »®·ÖHISTµÄ¸öÊý£¬Ô½¸ßÔ½¾«È·

float hranges_arr[] = {0,255};

float* hranges = hranges_arr;

int vmin = 10, vmax = 256, smin = 30;

bool g_StopFlag=0;

CvScalar hsv2rgb( float hue )

{

int rgb[3], p, sector;

static const int sector_data[][3]=

{{0,2,1}, {1,2,0}, {1,0,2}, {2,0,1}, {2,1,0}, {0,1,2}};

hue *= 0.033333333333333333333333333333333f;

sector = cvFloor(hue);

p = cvRound(255*(hue - sector));

p ^= sector & 1 ? 255 : 0;

rgb[sector_data[sector][0]] = 255;

rgb[sector_data[sector][1]] = 0;

rgb[sector_data[sector][2]] = p;

return cvScalar(rgb[2], rgb[1], rgb[0],0);

}

class CAboutDlg : public CDialog

{

public:

CAboutDlg();

目标检测与跟踪算法程序

#include "stdafx.h"

#include "ParticleMeanShift.h"

#include "ParticleMeanShiftDlg.h"

#include "cvx_defs.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

#include <it/io.h>

#include <it/distance.h>

#include <stdio.h>

#include <math.h>

#include <it/wavelet2D.h>

#include <it/mat.h>

//extern "C"{#include "contourlet.h"};

//#ifdef __cplusplus

//extern "C" {#include "contourlet.h}

//#endif

#include "contourlet.h"

#include "dfb.h"

#include "ezbc.h"

#define BUFFER_SIZE (1*1024*1024)

int iFlag_choose=0;

// 9/7 contourlet low subband norm [level]

double norm_low[6] = {

1.000000,

0.982948,

1.030575,

1.051979,

1.058014,

1.058312

};

// 9/7 contourlet high subbands norms [level][dfb_levels][subband]

double norm_high[6][5][16] = {

// DFB

{

{1.000000},

{1.338955, 0.768281},

{1.788734, 1.031742, 1.031699, 0.588007},

{2.350204, 1.388625, 1.473061, 0.755227, 1.521047, 0.718018, 0.760509, 0.466449},

{2.990107, 1.859578, 2.009466, 0.993439, 2.153701, 1.040220, 1.071638, 0.565028,

2.310007, 1.015735, 1.043946, 0.511974, 1.108749, 0.539535, 0.580279, 0.383226}

},

// Highest frequencies

{

{0.759782},

{1.068118, 0.710115},

{1.557636, 0.922336, 0.885625, 0.513870},

{2.066849, 1.199964, 1.312638, 0.679034, 1.314328, 0.611044, 0.667065, 0.406727},

{2.591734, 1.650462, 1.726335, 0.866216, 1.933047, 0.919827, 0.946988, 0.519211,

2.004114, 0.871491, 0.880225, 0.441114, 0.979973, 0.469240, 0.495562, 0.338999}

},

{

{0.709848},

{1.006673, 0.691288},

{1.505208, 0.880912, 0.857108, 0.490243},

{2.004624, 1.154857, 1.268061, 0.637940, 1.281535, 0.585212, 0.641248, 0.383733},

{2.461666, 1.619596, 1.693704, 0.813626, 1.870790, 0.884116, 0.917510, 0.470455,

1.949415, 0.851772, 0.859531, 0.412020, 0.943970, 0.448550, 0.476647, 0.313942}

},

{

{0.753806},

{1.067996, 0.730151},

{1.591337, 0.929780, 0.908668, 0.518957},

{2.142259, 1.210500, 1.324341, 0.681005, 1.369928, 0.613891, 0.670235, 0.410106},

{2.646395, 1.724389, 1.779619, 0.850579, 1.943830, 0.929273, 0.975566, 0.504108,

2.089051, 0.907208, 0.903755, 0.431151, 0.981607, 0.471800, 0.507208, 0.336407}

},

{

{0.775910},

{1.098225, 0.747825},

{1.631322, 0.953360, 0.932293, 0.532706},

{2.204255, 1.236997, 1.351154, 0.702051, 1.409039, 0.627751, 0.684257, 0.422790},

{2.703611, 1.755877, 1.805906, 0.865382, 1.966184, 0.947038, 0.995714, 0.521175,

2.134306, 0.924937, 0.917630, 0.439011, 0.993215, 0.481139, 0.517305, 0.348460}

},

// Lowest frequencies

{

{0.782607},

{1.107343, 0.753079},

{1.643244, 0.959912, 0.939323, 0.536721},

{2.203433, 1.234178, 1.349443, 0.704742, 1.411630, 0.628675, 0.683316, 0.427423},

{2.846164, 2.127241, 1.898790, 1.298897, 2.080579, 1.299276, 1.085920, 0.808484,

2.180500, 1.169607, 0.982991, 0.594266, 1.034878, 0.563380, 0.533165, 0.393168}

}

};

int func(CParticleMeanShiftDlg*dlg);

int func1(CParticleMeanShiftDlg*dlg);

int func2(CParticleMeanShiftDlg*dlg);

int func3(CParticleMeanShiftDlg*dlg);

int func4(CParticleMeanShiftDlg*dlg);

#define region 32

#define calc_point(kalman)

cvPoint( cvRound(kalman[0]),

cvRound(kalman[1]))

#define phi2xy(mat)

cvPoint( cvRound(img->width/2 + img->width/3*cos(mat->data.fl[0])),

cvRound( img->height/2 - img->width/3*sin(mat->data.fl[0])) )

#define CVCLOSE_ITR 1

#define CVCONTOUR_APPROX_LEVEL 2

/////////////////////////////////////////////////////////////////////////////

// CAboutDlg dialog used for App About

IplImage *image = 0, *hsv = 0, *hue = 0, *mask = 0, *backproject = 0, *histimg = 0,*showbackproject;

CvHistogram *hist = 0;

CvHistogram *histtemp = 0;

int backproject_mode = 0;

int select_object = 0;

int track_object = 0;

int show_hist = 1;

CvPoint origin;

CvRect selection;

CvRect track_window;

CvBox2D track_box; // tracking ·µ»ØµÄÇøÓò box£¬´ø½Ç¶È

CvConnectedComp track_comp;

int hdims = 48; // »®·ÖHISTµÄ¸öÊý£¬Ô½¸ßÔ½¾«È·

float hranges_arr[] = {0,255};

float* hranges = hranges_arr;

int vmin = 10, vmax = 256, smin = 30;

bool g_StopFlag=0;

CvScalar hsv2rgb( float hue )

{

int rgb[3], p, sector;

static const int sector_data[][3]=

{{0,2,1}, {1,2,0}, {1,0,2}, {2,0,1}, {2,1,0}, {0,1,2}};

hue *= 0.033333333333333333333333333333333f;

sector = cvFloor(hue);

p = cvRound(255*(hue - sector));

p ^= sector & 1 ? 255 : 0;

rgb[sector_data[sector][0]] = 255;

rgb[sector_data[sector][1]] = 0;

rgb[sector_data[sector][2]] = p;

return cvScalar(rgb[2], rgb[1], rgb[0],0);

}

部分跟踪结果图

图3是本系统在实际环境中对飞行目标进行连续跟踪的效果图,飞行目标为18个像素,并且对连续跟踪的视频流共截取了6幅图像,分别是第10帧,第30帧,第50帧,第60帧,如图所示:

Frame10(odd field) Frame30(odd field)

Frame50(odd field) Frame60(odd field)

图3部分跟踪结果图

三.总结

本设计通过PIC32单片机实现了对运动目标的检测跟踪,目的是以PIC32单片机做为硬件平台,将算法在PIC32单片机中运行,使其完成对运动目标的准确捕获和稳定跟踪。通过利用USB摄像头完成了图像采集的功能,然后将采集到的图像送入PIC32单片机进行数据处理,利用云台控制器控制云台的转动,使摄像头对准运动目标,进而实现了目标准确跟踪,并且使整个系统趋于小型化智能化。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭