無人機光流定位系列——(二)實踐
在本系列blog中的http://blog.csdn.net/andymfc/article/details/53316404文章中,已經對光流定位的原理進行了詳細的分析,詳細介紹了著名的lucas-kanade光流演算法,本期,將帶大家一起在dragonboard 410c上來用Python程式設計實現光流演算法,雖然Python語言編寫出來的處理效率不高,但是便於我們理解整個光流演算法應用方法,並且後續我們使用C或者其他高效率的語言來實現光流演算法會變得更簡單。
在實現光流分析的過程中,我們使用cv2模組提供的演算法介面來實現光流計算,在cv2中也就是opencv提供的Python介面,lucas-kanade演算法被封裝在cv2.calcOpticalFlowPyrLK()函式中,通過該介面可以方便的建立光流處理程式。但是在實現中我們首先要確定我們要跟蹤的點,然後才能使用lucas-kanade演算法來對這些點進行迭代跟蹤,接下來參考cv2中提供的Python例程程式碼詳細介紹利用cv2提供的光流計算處理函式介面如何完成基於光流的跟蹤實現,其核心程式碼如下:
首先為了方便呼叫cv2.calcOpticalFlowPyrLK演算法,我們需要定義一個演算法引數結構體,確定演算法引數,用Python定義如下:
lk_params = dict( winSize = (15, 15),
maxLevel = 2,
criteria = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03),
derivLambda = 0.0 )
同時在呼叫cv2.calcOpticalFlowPyrLK演算法的時候我們還需要呼叫cv2.goodFeatureToTrack函式來確定需要跟蹤的點,所以還需要給該介面傳遞一個引數,具體定義如下:
feature_params = dict( maxCorners = 500,
qualityLevel = 0.3,
minDistance = 7,
blockSize = 7 )
完成引數定義後,就可以開始編寫核心程式碼了,這裡我們在讀取視訊幀的時候,根據前文的分析可以知道,光流演算法需要依靠前後幀的資料來進行分析,所以在讀取視訊第一幀的時候,我們還需要在第0幀的時候進行初始化處理,這裡使用便利frame_idx和detect_interval兩個引數來進行控制,對第一幀進行處理,其中前者為幀數,後者為檢測間隔,在這裡初始化處理主要是需要找到適合跟蹤的點,具體程式碼如下:
if self.frame_idx % self.detect_interval == 0:
mask = np.zeros_like(frame_gray)
mask[:] = 255
for x, y in [np.int32(tr[-1]) for tr in self.tracks]:
cv2.circle(mask, (x, y), 5, 0, -1)
p = cv2.goodFeaturesToTrack(frame_gray, mask = mask, **feature_params)
if p is not None:
for x, y in np.float32(p).reshape(-1, 2):
self.tracks.append([(x, y)])
完成第一幀處理後,就需要進一步對後續幀進行處理,這裡處理其實就是一個迴圈迭代的過程,不斷的根據前後幀來執行光流演算法,呼叫cv2calcOpticalFlowPyrLK函式來計算光流資料,這裡通過tracks引數來進行控制,核心程式碼如下:
if len(self.tracks) > 0:
img0, img1 = self.prev_gray, frame_gray
p0 = np.float32([tr[-1] for tr in self.tracks]).reshape(-1, 1, 2)
p1, st, err = cv2.calcOpticalFlowPyrLK(img0, img1, p0, None, **lk_params)
p0r, st, err = cv2.calcOpticalFlowPyrLK(img1, img0, p1, None, **lk_params)
d = abs(p0-p0r).reshape(-1, 2).max(-1)
good = d < 1
new_tracks = []
for tr, (x, y), good_flag in zip(self.tracks, p1.reshape(-1, 2), good):
if not good_flag:
continue
tr.append((x, y))
if len(tr) > self.track_len:
del tr[0]
new_tracks.append(tr)
cv2.circle(vis, (x, y), 2, (0, 255, 0), -1)
self.tracks = new_tracks
cv2.polylines(vis, [np.int32(tr) for tr in self.tracks], False, (0, 255, 0))
draw_str(vis, (20, 20), 'track count: %d' % len(self.tracks))
以上就是整個光流演算法進行點跟蹤的處理核心過程,完整程式碼可以參考
在dragonboard 410c開發板上搭好滑鼠鍵盤和顯示器,我們就可以使用該指令碼在上面執行測試了,具體效果如下:
下期blog,將在該程式碼的基礎上,進一步實現如何利用光流法來對運動的目標進行跟蹤。
相關推薦
無人機光流定位系列——(二)實踐
在本系列blog中的http://blog.csdn.net/andymfc/article/details/53316404文章中,已經對光流定位的原理進行了詳細的分析,詳細介紹了著名的lucas-kanade光流演算法,本期,將帶大家一起在dragonboa
無人機光流定位系列——(一)原理剖析
這次參加深圳的高交會,在qualcomm展區看到了多款mini無人機,大家稍微細心一點就可以發現這些無人機都使用了一種叫光流定位的技術,很多人可能都還不明白光流定位是個什麼東西,是如何進行定位的,今天就帶大家一起來了解一下光流定位的原理。 在無人
室內定位系列(二)——模擬獲取RSS資料
很多情況下大家都採用實際測量的資料進行定位演算法的效能分析和驗證,但是實際測量的工作量太大、資料不全面、靈活性較小,採用模擬的方法獲取RSS資料是另一種可供選擇的方式。本文介紹射線跟蹤技術的基本原理,以及如何得到用於定位模擬的RSS資料。在此基礎上得到位置指紋庫與一組測試資料,用於以後定位演算法的驗證。(本
python selenium系列(二)元素定位方式
bdr process sta css_ 講解 term 其他 1.5 win 一 前言元素定位,是操作元素的第一步,也是WebUI自動化的難點和核心。 二 元素定位方法selenium提供了內置的方法完成對待操作元素的定位,主要分為8類,其中,每類又可細分為定位單個元素和
Selenium實戰教程系列(二)---元素定位
Selenium webdriver能夠模擬人對瀏覽器進行操作的前提是介面元素的定位。元素的定位可以說是Selenium自動化指令碼的基礎。這一小節筆者將介紹如何在selenium中進行元素的定位。 定位元素的方法 Selenium中提供了以下定位元素的方法:
雪飲者 決策樹系列(二)決策樹應用
ssi 字符串長度 mes pla 選擇 font com vector nac 本篇以信息增益最大作為最優化策略來詳細介紹決策樹的決策流程。 首先給定數據集,見下圖 註:本數據來源於網絡 本篇將以這些數據作為訓練數據(雖然少,但足以介紹清楚原理!),下圖是決
數據結構系列(二)算法
nal log 如何 空間復雜度 計算 youdao 最好 時間 bsp 高斯求和 計算1+2+...+100 算法的概念就不多說了 強調一點就是,沒有通用的算法,就像永遠沒有銀彈,所有的算法都有自己的適用領域 評判算法好壞的方法 復雜度用大O表示,又分為時間復雜度
【原創】源碼角度分析Android的消息機制系列(二)——ThreadLocal的工作過程
機制 simple hand 這就是 數據存儲 read etc lena 並且 ι 版權聲明:本文為博主原創文章,未經博主允許不得轉載。 在上一篇文章中,我們已經提到了ThreadLocal,它並非線程,而是在線程中存儲數據用的。數據存儲以後,只能在指定的線程中獲取到數據
MySQL系列(二)
sql read 註意 出現 back 總結 lba 區別 不同 MySql 事務 目錄 MySQL系列(一):基礎知識大總結 MySQL系列(二):MySQL事務 MySQL系列(三):索引 什麽是事務(transaction) 保證成批操作要麽完全執行,要麽完全不
Linux系統運維常見面試簡答題系列(二)(14題)
local 企業 nginx服務 簡答題 ip協議 php out gin 報錯 1. /var/log/messages日誌出現kernel:nf_conntrack:tablefull,dropping packet,請問是什麽原因導致的,如何解決? 此報錯為iptab
Linux VPS/服務器建站系列(二)- 常見的國內雲服務器商家
數據中心 log 中心 相互 網站 能說 之前 體積 選擇 繼續接"Linux VPS/服務器建站系列(一)- 哪些人需要用服務器建站"文章,既然我們開始決定選擇VPS、服務器作為項目用途。在準備實際的操作之前,筆者先準備羅列國內和國外的常見雲服務器商家。因為服務器商家和方
SpringMVC系列(二): 註解@RequestMapping、@PathVariable
ann handler -- back 聯合 ppi 根目錄 處理方法 ati 一、@RequestMapping 1.@RequestMapping除了能修飾方法,還能修飾類(1)修飾類:提供初步的請求映射信息,相對於web請求的根目錄(2)修飾方法:提供進一步的細分映射
Docker系列(二)鏡像管理
nginx orm lda cast anaconda rip search fff spa 2.1 查看鏡像 [root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE docke
JDBC詳解系列(二)之加載驅動
red mar mys ons try path 替換 host man ---[來自我的CSDN博客](http://blog.csdn.net/weixin_37139197/article/details/78838091)--- ??在JDBC詳解系列(一)之流程中
詳解YUV系列(二)--YUV422
proc 衍生 watermark term fff 本質 image 描述 采樣 hi,各位小夥伴,小編又來了嘍,今天該給大家分享一下YUV422嘍,還是老規矩,老套路哦: 一、文字描述采樣格式:YUV422的采樣格式,簡單理解就是一個2*2的像素塊中,對於4個像素點,采
容器開啟數據服務之旅系列(二):Kubernetes如何助力Spark大數據分析
容器 控制臺 摘要: 容器開啟數據服務之旅系列(二):Kubernetes如何助力Spark大數據分析 (二):Kubernetes如何助力Spark大數據分析 概述 本文為大家介紹一種容器化的數據服務Spark + OSS on ACK,允許Spark分布式計算節點對阿裏雲OSS對象存儲的直接訪問。
FuelPHP 系列(二) ------ route 路由
ray align 文件中 數字 eve 區分 creat 內容 ont FuelPHP 中,默認可以通過 /controller_name/function_name 這種方式來訪問,也可以通過自定義路由來訪問。 路由配置在 /fuel/app/config/rout
Java Thread系列(二)線程狀態
做的 tor throws 前臺 bject 線程休眠 enume 死鎖 做出 Java Thread系列(二)線程狀態 一、線程的五種狀態 新建狀態(New):新創建了一個線程對象,尚未啟動。 就緒狀態(Runnable):也叫可運行狀態。線程對象創建後,其他線程調用
Greeplum 系列(二) 安裝部署
dead 元數據 環境搭建 操作 最大數 磁盤 工具 nds md5 Greeplum 系列(二) 安裝部署 本章將介紹如何快速安裝部署 Greenplum,以及 Greenplum 的一些常用命令及工具。本章不會涉及硬件選型、操作系統參數講解、機器性能測試等高級內容,這些
JavaScript夯實基礎系列(二):閉包
情況 全局環境 賦值 命名 因此 沒有 部分 .com 查詢 ??在JavaScript中函數是一等公民。所謂一等公民是指函數跟其他對象一樣,很普通,可以進行把函數存在數組中、作為參數傳遞、賦值給變量等操作。當函數作為另一個函數的返回值在外部調用時,跟該函數在函數內部調用時