在這篇文章中,我們將介紹如何使用通過 MultiTracker 類實現的 OpenCV 的多對象跟蹤 API。我們將共享C++ 和 Python 代碼。
成都創新互聯公司從2013年創立,先為曾都等服務建站,曾都等地企業,進行企業商務咨詢服務。為曾都企業網站制作PC+手機+微官網三網同步一站式服務解決您的所有建站問題。
大多數計算機視覺和機器學習的初學者都學習對象檢測。如果您是初學者,您可能會想為什么我們需要對象跟蹤。我們不能只檢測每一幀中的對象嗎?
讓我們來探究一下跟蹤是有用的幾個原因。
首先,當在視頻幀中檢測到多個對象(例如人)時,跟蹤有助于跨幀建立對象的身份。
其次,在某些情況下,對象檢測可能會失敗,但仍可能跟蹤對象,因為跟蹤考慮了對象在前一幀中的位置和外觀。
第三,一些跟蹤算法非常快,因為它們做的是局部搜索,而不是全局搜索。因此,我們可以通過每n幀進行目標檢測,并在中間幀中跟蹤目標,從而為我們的系統獲得很高的幀率。
那么,為什么不在第一次檢測后無限期地跟蹤對象呢?跟蹤算法有時可能會丟失它正在跟蹤的對象。例如,當對象的運動太大時,跟蹤算法可能跟不上。許多現實世界的應用程序同時使用檢測和跟蹤。
在本教程中,我們只關注跟蹤部分。我們想要跟蹤的對象將通過拖動它們周圍的包圍框來指定。
OpenCV 中的 MultiTracker 類提供了多目標跟蹤的實現。它是一個簡單的實現,因為它獨立處理跟蹤對象,而不對跟蹤對象進行任何優化。
讓我們逐步查看代碼,了解如何使用 OpenCV 的多目標跟蹤 API。
2.1 第 1 步:創建單一對象跟蹤器
多目標跟蹤器只是單目標跟蹤器的集合。我們首先定義一個函數,該函數接受一個跟蹤器類型作為輸入,并創建一個跟蹤器對象。OpenCV有8種不同的跟蹤器類型:BOOSTING, MIL, KCF,TLD, MEDIANFLOW, GOTURN, MOSSE, CSRT。
如果您想使用 GOTURN 跟蹤器,請務必閱讀這篇文章并下載 caffe 模型。
在下面的代碼中,給定跟蹤器類的名稱,我們返回跟蹤器對象。這將在稍后用于多目標跟蹤器。
Python
C++
2.2 第 2 步:讀取視頻的第一幀
多目標跟蹤器需要兩個輸入
給定這些信息,跟蹤器在所有后續幀中跟蹤這些指定對象的位置。 在下面的代碼中,我們首先使用 VideoCapture 類加載視頻并讀取第一幀。這將在稍后用于初始化 MultiTracker。
Python
C++
2.3 第 3 步:在第一幀中定位對象
接下來,我們需要在第一幀中定位我們想要跟蹤的對象。該位置只是一個邊界框。 OpenCV 提供了一個名為 selectROI 的函數,該函數會彈出一個 GUI 來選擇邊界框(也稱為感興趣區域 (ROI))。 在 C++ 版本中,selectROI 允許您獲取多個邊界框,但在 Python 版本中,它只返回一個邊界框。所以,在 Python 版本中,我們需要一個循環來獲取多個邊界框。 對于每個對象,我們還選擇一種隨機顏色來顯示邊界框。 代碼如下所示。
Python
C++
getRandomColors 函數相當簡單
2.4 第 3 步:初始化 MultiTracker
到目前為止,我們已經讀取了第一幀并獲得了對象周圍的邊界框。這就是我們初始化多目標跟蹤器所需的所有信息。
我們首先創建一個 MultiTracker 對象,并向其中添加與邊界框一樣多的單個對象跟蹤器。在此示例中,我們使用 CSRT 單對象跟蹤器,但您可以通過將下面的 trackerType 變量更改為本文開頭提到的 8 個跟蹤器之一來嘗試其他跟蹤器類型。 CSRT 跟蹤器不是最快的,但在我們嘗試的許多情況下它產生了最好的結果。
您還可以使用包裹在同一個 MultiTracker 中的不同跟蹤器,但當然,這沒什么意義。
MultiTracker 類只是這些單個對象跟蹤器的包裝器。正如我們從上一篇文章中知道的那樣,單個對象跟蹤器是使用第一幀初始化的,并且邊界框指示我們想要跟蹤的對象的位置。 MultiTracker 將此信息傳遞給它在內部包裝的單個對象跟蹤器。
Python
C++
2.5 第 4 步:更新 MultiTracker 并顯示結果
最后,我們的 MultiTracker 已準備就緒,我們可以在新幀中跟蹤多個對象。我們使用 MultiTracker 類的 update 方法來定位新框架中的對象。每個跟蹤對象的每個邊界框都使用不同的顏色繪制。
Python
C++
C++
Python
個人覺得,你問的沒問題,但是圖片上出的題有問題,隨機2種顏色和2中所有顏色的組合,這是2個問題啊。我2中方法都寫了,你自己看吧
import?random
colour?=?('red',?'orange',?'green',?'blue',?'black')
def?rand_2_colour():
#?隨機挑選2種顏色
for?i?in?random.sample(range(0,?5),?2):
print('隨機挑選的2種顏色是:'+colour[i])
def?all_2_colour():
#?列出所有2種顏色的組合
print('所有2中顏色的組合是:')
for?i?in?range(0,?5):
for?j?in?range(i?+?1,?5):
print(colour[i],?colour[j])
if?__name__?==?'__main__':
rand_2_colour()
all_2_colour()
1 從給定參數的正態分布中生成隨機數
當考慮從正態分布中生成隨機數時,應當首先知道正態分布的均值和方差(標準差),有了這些,就可以調用python中現有的模塊和函數來生成隨機數了。這里調用了Numpy模塊中的random.normal函數,由于邏輯非參簡單,所有直接貼上代碼如下:
import numpy as np# 定義從正態分布中獲取隨機數的函數def get_normal_random_number(loc, scale): """ :param loc: 正態分布的均值 :param scale: 正態分布的標準差 :return:從正態分布中產生的隨機數 """ # 正態分布中的隨機數生成 number = np.random.normal(loc=loc, scale=scale) # 返回值 return number# 主模塊if __name__ == "__main__": # 函數調用 n = get_normal_random_number(loc=2, scale=2) # 打印結果 print(n) # 結果:3.275192443463058
2 從給定參數的均勻分布中獲取隨機數的函數
考慮從均勻分布中獲取隨機數的時候,要事先知道均勻分布的下界和上界,然后調用Numpy模塊的random.uniform函數生成隨機數。
import numpy as np# 定義從均勻分布中獲取隨機數的函數def get_uniform_random_number(low, high): """ :param low: 均勻分布的下界 :param high: 均勻分布的上界 :return: 從均勻分布中產生的隨機數 """ # 均勻分布的隨機數生成 number = np.random.uniform(low, high) # 返回值 return number# 主模塊if __name__ == "__main__": # 函數調用 n = get_uniform_random_number(low=2, high=4) # 打印結果 print(n) # 結果:2.4462417140153114
3 按照指定概率生成隨機數
有時候我們需要按照指定的概率生成隨機數,比如已知盒子中每種顏色的球的比例,猜測下一次取出的球的顏色。在這里介紹的問題和上面的例子相似,要求給定一個概率列表,從列表對應的數字列表或區間列表中生成隨機數,分兩部分討論。
3.1 按照指定概率從數字列表中隨機抽取數字
假設給定一個數字列表和一個與之對應的概率列表,兩個列表對應位置的元素組成的元組即表示該數字在數字列表中以多大的概率出現,那么如何根據這些已知條件從數字列表中按概率抽取隨機數呢?在這里我們考慮用均勻分布來模擬概率,代碼如下:
import numpy as npimport random# 定義從均勻分布中獲取隨機數的函數def get_uniform_random_number(low, high): """ :param low: 均勻分布的下界 :param high: 均勻分布的上界 :return: 從均勻分布中產生的隨機數 """ # 均勻分布的隨機數生成 number = np.random.uniform(low, high) # 返回值 return number# 定義從一個數字列表中以一定的概率取出對應區間中數字的函數def get_number_by_pro(number_list, pro_list): """ :param number_list:數字列表 :param pro_list:數字對應的概率列表 :return:按概率從數字列表中抽取的數字 """ # 用均勻分布中的樣本值來模擬概率 x = random.uniform(0, 1) # 累積概率 cum_pro = 0.0 # 將可迭代對象打包成元組列表 for number, number_pro in zip(number_list, pro_list): cum_pro += number_pro if x cum_pro: # 返回值 return number# 主模塊if __name__ == "__main__": # 數字列表 num_list = [1, 2, 3, 4, 5] # 對應的概率列表 pr_list = [0.1, 0.3, 0.1, 0.4, 0.1] # 函數調用 n = get_number_by_pro(number_list=num_list, pro_list=pr_list) # 打印結果 print(n) # 結果:1
3.2 按照指定概率從區間列表中的某個區間內生成隨機數
給定一個區間列表和一個與之對應的概率列表,兩個列表相應位置的元素組成的元組即表示某數字出現在某區間內的概率是多少,已知這些,我們如何生成隨機數呢?這里我們通過兩次使用均勻分布達到目的,代碼如下:
import numpy as npimport random# 定義從均勻分布中獲取隨機數的函數def get_uniform_random_number(low, high): """ :param low: 均勻分布的下界 :param high: 均勻分布的上界 :return: 從均勻分布中產生的隨機數 """ # 均勻分布的隨機數生成 number = np.random.uniform(low, high) # 返回值 return number# 定義從一個數字列表中以一定的概率取出對應區間中數字的函數def get_number_by_pro(number_list, pro_list): """ :param number_list:數字列表 :param pro_list:數字對應的概率列表 :return:按概率從數字列表中抽取的數字 """ # 用均勻分布中的樣本值來模擬概率 x = random.uniform(0, 1) # 累積概率 cum_pro = 0.0 # 將可迭代對象打包成元組列表 for number, number_pro in zip(number_list, pro_list): cum_pro += number_pro if x cum_pro: # 從區間[number. number - 1]上隨機抽取一個值 num = get_uniform_random_number(number, number - 1) # 返回值 return num# 主模塊if __name__ == "__main__": # 數字列表 num_list = [1, 2, 3, 4, 5] # 對應的概率列表 pr_list = [0.1, 0.3, 0.1, 0.4, 0.1] # 函數調用 n = get_number_by_pro(number_list=num_list, pro_list=pr_list) # 打印結果 print(n) # 結果:3.49683787011193
import random
r = lambda: random.randint(0,255)
print('#XXX' % (r(),r(),r()))
用python生成隨機的15行6列的隨機數據的方法如下:
1.import numpy as np # 定義從正態分布中獲取隨機數的函數 def get_normal_random_number(loc, scale): """ :param loc: 正態分布的均值 :param scale: 正態分布的標準差 :return:從正態分布中產生的隨機數 """ # 正態分布中的隨機數生成 number = np.random.normal(loc=loc, scale=scale) # 返回值 return number # 主模塊 if __name__ == "__main__": # 函數調用 n = get_normal_random_number(loc=2, scale=2) # 打印結果 print(n) # 結果:3.275192443463058
2 從給定參數的均勻分布中獲取隨機數的函數
考慮從均勻分布中獲取隨機數的時候,要事先知道均勻分布的下界和上界,然后調用Numpy模塊的random.uniform函數生成隨機數。
import numpy as np # 定義從均勻分布中獲取隨機數的函數 def get_uniform_random_number(low, high): """ :param low: 均勻分布的下界 :param high: 均勻分布的上界 :return: 從均勻分布中產生的隨機數 """ # 均勻分布的隨機數生成 number = np.random.uniform(low, high) # 返回值 return number # 主模塊 if __name__ == "__main__": # 函數調用 n = get_uniform_random_number(low=2, high=4) # 打印結果 print(n) # 結果:2.4462417140153114
3 按照指定概率生成隨機數
有時候我們需要按照指定的概率生成隨機數,比如已知盒子中每種顏色的球的比例,猜測下一次取出的球的顏色。在這里介紹的問題和上面的例子相似,要求給定一個概率列表,從列表對應的數字列表或區間列表中生成隨機數,分兩部分討論。
示例代碼
# 導入Tkinter模塊
from tkinter import *
# 創建一個窗口
window = Tk()
# 定義一個函數,用來生成圖形
def generate_shape():
# 使用隨機數生成不同的圖形和顏色
shape = random.choice(["circle", "square", "triangle"])
color = random.choice(["red", "green", "blue"])
# 使用隨機數生成不同的位置
x = random.randint(0, 200)
y = random.randint(0, 200)
# 在窗口中繪制圖形
if shape == "circle":
# 繪制圓形
canvas.create_oval(x, y, x + 50, y + 50, fill=color)
elif shape == "square":
# 繪制正方形
canvas.create_rectangle(x, y, x + 50, y + 50, fill=color)
else:
# 繪制三角形
points = [x, y, x + 50, y + 50, x + 25, y + 75]
canvas.create_polygon(points, fill=color)
# 創建一個畫布
canvas = Canvas(window, width=200, height=200)
canvas.pack()
# 創建一個按鈕
button = Button(window, text="Start", command=generate_shape)
button.pack()
# 進入消息循環
window.mainloop()
新聞名稱:python隨機顏色函數 python多種顏色
轉載來源:http://vcdvsql.cn/article30/dosdepo.html
成都網站建設公司_創新互聯,為您提供移動網站建設、網站設計、手機網站建設、響應式網站、網站內鏈、網站導航
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯