基于PIC單片機(jī)的智能目標(biāo)跟蹤系統(tǒng)設(shè)計(jì)方案
掃描二維碼
隨時(shí)隨地手機(jī)看文章
摘 要:
通過借鑒嵌入式系統(tǒng)在電子技術(shù)、信號(hào)處理以及計(jì)算機(jī)等領(lǐng)域應(yīng)用的成功經(jīng)驗(yàn),在分析目標(biāo)檢測與跟蹤算法的基礎(chǔ)上,將目標(biāo)檢測與跟蹤算法與嵌入式技術(shù)相結(jié)合,設(shè)計(jì)一種基于嵌入式PIC32單片機(jī)的目標(biāo)檢測與跟蹤系統(tǒng),可以實(shí)現(xiàn)目標(biāo)檢測跟蹤系統(tǒng)的小型化,智能化,并以具體飛行目標(biāo)為例進(jìn)行了目標(biāo)的識(shí)別和跟蹤。
研究目的隨著現(xiàn)代社會(huì)對軍用和民用設(shè)備需求的不斷擴(kuò)大及要求的不斷提高,運(yùn)動(dòng)目標(biāo)的識(shí)別和跟蹤技術(shù)已經(jīng)迅速發(fā)展成為現(xiàn)代信息處理領(lǐng)域中一項(xiàng)非常重要的技術(shù),也是無人機(jī)野外戰(zhàn)場偵察技術(shù)中的重點(diǎn)和難點(diǎn),并在許多領(lǐng)域內(nèi)發(fā)揮著不可替代的作用。目前,基于PC 機(jī)的目標(biāo)檢測與跟蹤技術(shù)已趨于成熟,但其在嵌入式平臺(tái)的應(yīng)用研究還處于初級(jí)階段。由于嵌入式系統(tǒng)具有體積小巧,便于攜帶等一系列PC 機(jī)無法替代的優(yōu)點(diǎn),因此如何對飛行目標(biāo)進(jìn)行有效檢測和跟蹤并且在嵌入式系統(tǒng)中實(shí)現(xiàn)是目前急需解決的課題。針對以上問題本文設(shè)計(jì)了一個(gè)基于嵌入式的目標(biāo)檢測與跟蹤系統(tǒng),本系統(tǒng)具有體積小、實(shí)時(shí)性好并且可對運(yùn)動(dòng)目標(biāo)進(jìn)行有效實(shí)時(shí)跟蹤的特點(diǎn)。也為開展實(shí)時(shí)化微型化的嵌入式機(jī)器視覺系統(tǒng)的研究進(jìn)行了有益的嘗試。
系統(tǒng)總體方案本課題研究的是無人機(jī)在復(fù)雜背景環(huán)境下對目標(biāo)的檢測和跟蹤的嵌入式實(shí)現(xiàn)問題,目標(biāo)跟蹤系統(tǒng)是利用一個(gè)可移動(dòng)的圖像處理設(shè)備實(shí)現(xiàn)圖像中運(yùn)動(dòng)物體的檢測和跟蹤,解決了軍用和工業(yè)等方面發(fā)展對目標(biāo)跟蹤系統(tǒng)的小型化要求。
1.主要研究以下方面的內(nèi)容:
(1)嵌入式視覺跟蹤系統(tǒng)的硬件設(shè)計(jì)
嵌入式平臺(tái)是解決實(shí)時(shí)性和小型化的有效途徑,采用基于PIC32的嵌入式平臺(tái)的目標(biāo)跟蹤系統(tǒng)的解決方案可以滿足設(shè)備功能的要求。
針對小型化的實(shí)際需求,本系統(tǒng)采用USB攝像頭作為采集目標(biāo)圖像的設(shè)備,采用PIC32內(nèi)核開發(fā)板作為中央控制器,以及云臺(tái)、云臺(tái)控制器等外圍設(shè)備,形成完整的視覺反饋跟蹤系統(tǒng)。
(2)嵌入式視覺跟蹤系統(tǒng)的軟件設(shè)計(jì)
針對被跟蹤目標(biāo)的特點(diǎn),設(shè)計(jì)實(shí)時(shí)識(shí)別與跟蹤算法,利用嵌入式系統(tǒng)軟件MPLAB IDE集成開發(fā)環(huán)境具體開發(fā)系統(tǒng)的數(shù)據(jù)接收,特征識(shí)別和反饋控制等軟件模塊,采用MPLAB C32 C編譯器將目標(biāo)跟蹤的算法編譯實(shí)現(xiàn),實(shí)現(xiàn)對運(yùn)動(dòng)目標(biāo)的識(shí)別與跟蹤。
(3)仿真實(shí)驗(yàn),調(diào)試
在設(shè)計(jì)好的嵌入式實(shí)驗(yàn)平臺(tái)上進(jìn)行跟蹤實(shí)驗(yàn),經(jīng)過反復(fù)調(diào)試,直到測試跟蹤的效果達(dá)到預(yù)期的要求。
2 研究方案
根據(jù)以上研究內(nèi)容,將目標(biāo)的檢測和跟蹤方案的嵌入式實(shí)現(xiàn)分成硬件和軟件兩部分。
嵌入式視覺跟蹤系統(tǒng)的硬件方案:
系統(tǒng)硬件結(jié)構(gòu)圖如圖1所示:
圖1系統(tǒng)硬件結(jié)構(gòu)圖
系統(tǒng)總體硬件結(jié)構(gòu)如圖1所示。在PIC32嵌入式系統(tǒng)平臺(tái)上移植并配置MPLAB IDE集成開發(fā)環(huán)境,針對平臺(tái)和應(yīng)用的特點(diǎn),制作合適的文件系統(tǒng),編寫應(yīng)用程序。運(yùn)動(dòng)目標(biāo)經(jīng)USB攝像頭實(shí)時(shí)采集后,送入PIC32處理器,利用嵌入式處理器的強(qiáng)大運(yùn)算能力,對采集到的圖像進(jìn)行處理,完成目標(biāo)識(shí)別與定位,并控制云臺(tái)控制器,調(diào)整攝像頭位姿,使攝像頭對準(zhǔn)運(yùn)動(dòng)目標(biāo),實(shí)現(xiàn)實(shí)時(shí)跟蹤。實(shí)時(shí)性好和體積小巧是本嵌入式跟蹤系統(tǒng)追求的目標(biāo)。
嵌入式視覺跟蹤系統(tǒng)的軟件方案:
(1)MPLAB C32 C編譯器
C 代碼應(yīng)用程序:32 位語言工具庫位于MPLAB C32 C 編譯器安裝目錄的pIC32mxlib 子目錄中,默認(rèn)情況下存放在:C:Program FilesMicrochipMPLAB C32pic32mxlib可以通過MPLAB C32 鏈接器將這些庫直接鏈接到應(yīng)用程序中。
(2)啟動(dòng)代碼
為初始化數(shù)據(jù)存儲(chǔ)器中的變量,鏈接器創(chuàng)建一個(gè)數(shù)據(jù)初始化映像。這個(gè)映像必須在啟動(dòng)時(shí)、在應(yīng)用程序正確獲取控制權(quán)之前復(fù)制到RAM 中。crt0.o 中的啟動(dòng)代碼執(zhí)行運(yùn)行時(shí)環(huán)境的初始化。
(3)32 位外設(shè)函數(shù)庫
32 位軟件和硬件外設(shè)函數(shù)庫為設(shè)置和控制32 位外設(shè)提供了函數(shù)和宏。 這些庫是特定于處理器的,形式為libmchp_peripheral_Device.a,其中Device 為32 位器件型號(hào)。
(4)標(biāo)準(zhǔn)C 函數(shù)庫(包含數(shù)學(xué)函數(shù))
提供了一套完整的符合ANSI-89 的庫。 標(biāo)準(zhǔn)的C 語言庫文件是libc.a (由MIPS Technologies 編寫)、libe.a 和libm.a。一個(gè)典型的C 應(yīng)用程序必須包含全部這三個(gè)庫,這三個(gè)庫在默認(rèn)情況下就被鏈接進(jìn)來,無需用戶指定。
1.MPLAB IDE集成開發(fā)環(huán)境
MPLAB 集成開發(fā)環(huán)境 (IDE) 是一個(gè)采用Microchip 的PICmicro 和 dsPIC開發(fā)嵌入式應(yīng)用的免費(fèi)集成工具箱。MPLAB IDE在32-bit 的MS Windows下運(yùn)行,是一個(gè)簡單易用的開發(fā)環(huán)境,并且包含很多可進(jìn)行快速應(yīng)用開發(fā)和調(diào)試的免費(fèi)軟件。MPLAB IDE同樣也充當(dāng)一個(gè)附加的Microchip和第三方軟件和硬件工具的圖形用戶界面。
2.實(shí)現(xiàn)目標(biāo)跟蹤算法的應(yīng)用程序
應(yīng)用程序是針對需求編寫的僅適用于本系統(tǒng)的專用程序。本系統(tǒng)應(yīng)用程序流程如圖2所示。初始化后打開設(shè)備文件(攝像頭等),查詢和確認(rèn)設(shè)備性能,設(shè)置捕獲的圖像的寬和高,設(shè)置色深,建立內(nèi)存映射,讀取圖像數(shù)據(jù),對圖像進(jìn)行處理,關(guān)閉設(shè)備。圖像采集有兩種方式:內(nèi)存映射(mmap)和直接讀取設(shè)備(read)。前者將設(shè)備文件映射到內(nèi)存,繞過I/O訪問,使得讀取速度更快,但是占用更多系統(tǒng)資源??紤]系統(tǒng)實(shí)時(shí)性,因此采用內(nèi)存映射方式。
圖2系統(tǒng)應(yīng)用程序流程圖
在本系統(tǒng)中,采用MPLAB C32 C編譯器將目標(biāo)跟蹤的算法編譯實(shí)現(xiàn),由一系列C函數(shù)和少量C++類構(gòu)成,可以實(shí)現(xiàn)圖像處理和計(jì)算機(jī)視覺方面的很多通用算法。
3.目標(biāo)檢測和跟蹤算法的設(shè)計(jì)方案:
①目標(biāo)的檢測部分:
對航空圖片進(jìn)行contourlet變換。該變換能滿足各向異性的性質(zhì)。Contourlet變換是使用拉普拉斯濾波器對圖象進(jìn)行多尺度分解,以捕獲二維圖像中存在的點(diǎn)奇異性,得到原圖像的低頻圖像和高頻圖像,遞歸地對低通圖像進(jìn)行分解,得到整個(gè)多分辨率圖像。對分解后每一尺度上的高頻圖像使用方向?yàn)V波器組,得到各奇異點(diǎn)的多方向性圖像。采用contourlet變換提取各尺度下的穩(wěn)定數(shù)值特征,構(gòu)建相應(yīng)的特征庫,利用目標(biāo)質(zhì)心建立目標(biāo)跟蹤點(diǎn),匹配真正的飛行目標(biāo)。
②目標(biāo)的跟蹤部分:
本系統(tǒng)采用的目標(biāo)跟蹤算法為Mean-Shift算法。Mean-Shift算法是一種計(jì)算局部最優(yōu)的搜索算法,通過計(jì)算候選目標(biāo)與目標(biāo)模塊直接之間相似度的概率密度分布,然后利用概率密度梯度下降的方向來獲取匹配搜索的最佳路徑,加速運(yùn)動(dòng)目標(biāo)的定位降低搜索的時(shí)間。
攝像頭驅(qū)動(dòng)程序
#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();
目標(biāo)檢測與跟蹤算法程序
#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);
}
部分跟蹤結(jié)果圖
圖3是本系統(tǒng)在實(shí)際環(huán)境中對飛行目標(biāo)進(jìn)行連續(xù)跟蹤的效果圖,飛行目標(biāo)為18個(gè)像素,并且對連續(xù)跟蹤的視頻流共截取了6幅圖像,分別是第10幀,第30幀,第50幀,第60幀,如圖所示:
Frame10(odd field) Frame30(odd field)
Frame50(odd field) Frame60(odd field)
圖3部分跟蹤結(jié)果圖
三.總結(jié)
本設(shè)計(jì)通過PIC32單片機(jī)實(shí)現(xiàn)了對運(yùn)動(dòng)目標(biāo)的檢測跟蹤,目的是以PIC32單片機(jī)做為硬件平臺(tái),將算法在PIC32單片機(jī)中運(yùn)行,使其完成對運(yùn)動(dòng)目標(biāo)的準(zhǔn)確捕獲和穩(wěn)定跟蹤。通過利用USB攝像頭完成了圖像采集的功能,然后將采集到的圖像送入PIC32單片機(jī)進(jìn)行數(shù)據(jù)處理,利用云臺(tái)控制器控制云臺(tái)的轉(zhuǎn)動(dòng),使攝像頭對準(zhǔn)運(yùn)動(dòng)目標(biāo),進(jìn)而實(shí)現(xiàn)了目標(biāo)準(zhǔn)確跟蹤,并且使整個(gè)系統(tǒng)趨于小型化智能化。