[python opencv 計算機視覺零基礎到實戰] 五、對象追蹤

一、學習目標

  1. 了解為什么色彩空間的轉換那么重要
  2. 了解opencv中進行對象跟蹤的方法

目錄

[python opencv 計算機視覺零基礎到實戰] 一、opencv的helloworld

[【python opencv 計算機視覺零基礎到實戰】二、 opencv文件格式與攝像頭讀取] 一、opencv的helloworld

[[python opencv 計算機視覺零基礎到實戰] 三、numpy與圖像編輯] 一、opencv的helloworld

[[python opencv 計算機視覺零基礎到實戰] 四、了解色彩空間及其詳解] 一、opencv的helloworld

[[python opencv 計算機視覺零基礎到實戰] 五、對象追蹤] 一、opencv的helloworld
如有錯誤歡迎指出~

二、了解OpenCV中使用inRange進行對象跟蹤

2.1 了解色彩空間的轉換為什么那么重要

上一節中,我們了解了色彩空間的轉換,那為什么要了解色彩空間?上一節中并沒有進行說明,這一節將通過色彩空間的轉換,使我們能夠對一些對象進行追蹤;這一節所需要轉換的色彩空間是HSV色彩空間,在HSV色彩空間中,不同的顏色有不同的取值范圍,通過這些范圍可以對一些指定顏色進行過濾捕獲,從而實現跟蹤。

首先我們查看一下HSV色彩空間中,一般顏色的取值范圍。HSV存在3個通道,我們以下為黑白灰、紅橙黃綠青藍紫顏色的三個通道取值范圍;我們了解了取值范圍后將有利于我們對這些顏色的取值:
黑:

  • H低值為 0,S低值為 0,V低值為 0
  • H高值為 180,S高值為 255,V高值為 46

白:

  • H低值為 0,S低值為 0,V低值為 221
  • H高值為 180,S高值為 30,V高值為 255

灰:

  • H低值為 0,S低值為 0,V低值為 46
  • H高值為 180,S高值為 43,V高值為 220

紅:

  • H低值為 156,S低值為 43,V低值為 46
  • H高值為 180,S高值為 255,V高值為 255

橙:

  • H低值為 11,S低值為 43,V低值為 46
  • H高值為 25,S高值為 255,V高值為 255

黃:

  • H低值為 26,S低值為 43,V低值為 46
  • H高值為 34,S高值為 255,V高值為 255

綠:

  • H低值為 35,S低值為 43,V低值為 46
  • H高值為 77,S高值為 255,V高值為 255

青:

  • H低值為 78,S低值為 43,V低值為 46
  • H高值為 99,S高值為 255,V高值為 255

藍:

  • H低值為 100,S低值為 43,V低值為 46
  • H高值為 124,S高值為 255,V高值為 255

紫:

  • H低值為 125,S低值為 43,V低值為 46
  • H高值為 155,S高值為 255,V高值為 255

我們可以根據以上的值,使用inRange方法對圖片的對象進行過濾,或者說跟蹤,如果使用以上的顏色取值范圍,有個先行條件,需要對圖片進行HSV轉換。

2.2 使用inRange對圖像進行捕獲

在python中,使用inRange方法可以對圖片進行過濾,從而捕獲我們需要捕獲的內容。inRange方法需要傳入3個參數,第一個是圖像;第二個是一個下限,這個下限指你需要捕獲的目標顏色的取值低值;第三個是一個上限,指你需要捕獲的目標顏色取值上限值。下限與上限都是數組。

現在我們有如下圖片:
以上圖片共有3中顏色,白色、黑色、綠色。現在我需要捕獲黑色,那該如何去做呢?
這時我們通過2.1節中得知,黑色的H、S、V低值分別是0、0、0,高值分別是180、255、46。我們創建兩個數值,一個存儲低值一個存儲高值。代碼如下:

min=np.array([0,0,0])
max=np.array([180,255,46])

這時我們先獲取圖片,并且引入numpy,不然np未引入將會出錯:

import cv2
import numpy as npimg = cv2.imread(r'C:\Users\mx\Desktop\test.jpg')
cv2.namedWindow("Image",cv2.WINDOW_NORMAL)
cv2.namedWindow("flag",cv2.WINDOW_NORMAL)

以上代碼創建的Image窗口用于顯示正常的圖片,flag窗口顯示我們捕獲后的目標圖片。隨后將圖片進行HSV轉換:

hsv_img=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)

隨后將創建的數組,以及將轉換后的圖片傳入inRange方法中:

min=np.array([0,0,0])
max=np.array([180,255,46])
flag=cv2.inRange(hsv_img,lowerb=min,upperb=max)

接著顯示以及等待:

cv2.imshow("Image", img)
cv2.imshow("flag", mask)
cv2.waitKey (0)
cv2.destroyAllWindows()

為了方便大家查看,以下貼出了完整代碼:

import cv2
import numpy as npimg = cv2.imread(r'C:\Users\mx\Desktop\test.jpg')
cv2.namedWindow("Image",cv2.WINDOW_NORMAL)
cv2.namedWindow("flag",cv2.WINDOW_NORMAL)hsv_img=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
min=np.array([0,0,0])
max=np.array([180,255,46])
flag=cv2.inRange(hsv_img,lowerb=min,upperb=max)cv2.imshow("Image", img)
cv2.imshow("flag", flag)
cv2.waitKey (0)
cv2.destroyAllWindows()

運行結果如下:

我們從運行后的結果中發現,我們需要捕獲的黑色,變成了白色顯示,其它顏色則變成了黑色。那我們接著將捕獲的黑色換成綠色。那么我們更改低值與高值數組,改成綠色的低值為 35、43、46,高值77、 255、 255:

min=np.array([35,43,46])
max=np.array([77,255,255])

運行代碼,結果如下:

這個時候綠色捕獲成功,其它顏色編程了黑色,或者說都為0。

2.3 使用inRange對視頻中目標進行捕獲

在前兩篇文章中,我們已經了解了如何讀取視頻設備流,那如何讀取視頻呢?其實流程是一樣的,我們首先創建VideoCapture,并且傳入視頻路徑獲取視頻對象。

capture=cv2.VideoCapture(r'C:\Users\mx\Desktop\hmbb.mp4')

隨后循環使用read方法讀取視頻(類似方法不再進行贅述):

while True:r,img=capture.read()if r==False:break

那么接下來就開始等待與顯示了。我們每一幀視頻都是一張圖片,那么只要不斷的在一個窗口中顯示圖片就可以了,添加完顯示代碼后,完整代碼如下:

import cv2
import numpy as npcapture=cv2.VideoCapture(r'C:\Users\mx\Desktop\hmbb.mp4')while True:r,img=capture.read()if r==False:breakcv2.imshow("hmbb", img)k=cv2.waitKey (40)if k==27:break
cv2.destroyAllWindows()

這個時候運行代碼,成功的播放視頻:

我在這里使用的是海綿寶寶,我們接下來捕獲跟蹤視頻中的海綿寶寶對象。海綿寶寶是一個類似于黃色的物體,那么我們只需要創建兩個數組用于捕捉黃色圖像即可,其它代碼跟圖片捕捉的代碼一致,不再贅述,完整代碼如下:

import cv2
import numpy as npcapture=cv2.VideoCapture(r'C:\Users\mx\Desktop\hmbb.mp4')
min=np.array([26,43,46])
max=np.array([34,255,255])
while True:r,img=capture.read()if r==False:breakhsv_img=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)flag=cv2.inRange(hsv_img,lowerb=min,upperb=max)cv2.imshow("flag", flag)cv2.imshow("hmbb", img)k=cv2.waitKey (40)if k==27:break
cv2.destroyAllWindows()

運行結果如下:


當我們運行代碼后,出現兩個窗口,有一個窗口將對視頻進行捕獲內容,并且很好的捕獲到了視頻中的海綿寶寶。

該系列文章首發于易百納。

三、總結

  1. 了解通過圖片轉換色彩空間HSV,從而對目標顏色從相片中進行捕獲
  2. 了解常規顏色的取值范圍,并且了解了inRange方法的使用,傳入值范圍和圖片即可對目標顏色物體進行跟蹤

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/287571.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/287571.shtml
英文地址,請注明出處:http://en.pswp.cn/news/287571.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android之用glide加載gif圖片靜態展示

1 問題 圖片是gif動圖,我們需要獲取第一幀的靜態圖片并且展示。 2 解決辦法 public void changeGifToPicture(NonNull Context context, NonNull String url, NonNull ImageView imageView) {Glide.with(context).asBitmap().load(url).into(new BitmapImageViewTa…

flex java框架_fleXive——JavaEE框架

fleXive——JavaEE框架fleXive是一個開源的JavaEE框架,基于LGPL許可證,最新版本3.0RC1,它基于EJB3,并帶有補充的JSF組件庫,具有靈活性和可擴展性。它主要致力于企業級(Enterprise-scale)內容建模、存儲和檢索&#xff…

【ArcGIS風暴】在ArcGIS中實現將一個圓16等分

本文實現在ArcGIS中畫一個圓,然后將其16等分。 步驟一:生成圓(多邊形圖層) (1)創建一個點圖層(圖名Center),如果需要精確定位該點,建議通過輸入坐標點的方式來創建,這一步比較簡單,不再詳述; (2)利用Buffer命令創建緩沖區(圖名Circle_2km),因為要處理的對象…

iOS UIViewContentMode 使用詳解

iOS在處理圖片的時候,會出現拉伸變形的情況,可以根據UIViewContentMode的屬性,來控制圖片 UIViewContentMode包含以下枚舉值 UIViewContentModeScaleToFill :拉伸自適應填滿整個視圖 UIViewContentModeScaleAspectFit :自適應打下比例顯示 UIViewContentModeScaleA…

二進制安裝mariadb-10.2.8

centos7.3上二進制安裝mariadb-10.2.8-linux-x86_641、查看是否安裝mariadbrpm -qa mariadb*如果已經安裝就卸載。2、下載mariadb最新版本yum info mariadb官網地址:http://mariadb.org 下載:mariadb-10.2.8-linux-x86_64.tar.gz3、創建mysql用戶rpm 安…

MiniAPI:.NET7 Preview4之MiniAPI更新總覽

一覺醒來,發現微軟帶來了.NET7 Preview4的更新,本次更新關于MiniAPI的還不少,難以掩飾的喜悅心情,促使我盡快把這個消息分享給大家,那下來我們看一下一共帶來了哪些關于MiniAPI的更新:返回值帶來了TypedRes…

[python opencv 計算機視覺零基礎到實戰] 六、圖像運算

一、學習目標 了解opencv中圖像運算的方法了解opencv中圖像運算的運用 如有錯誤歡迎指出~ 二、了解OpenCV中圖像運算的運用 目錄 [python opencv 計算機視覺零基礎到實戰] 一、opencv的helloworld [【python opencv 計算機視覺零基礎到實戰】二、 opencv文件格式與攝像頭…

Android之SubsamplingScaleImageView加載長圖不能放縮問題

1 問題 第三方開源框架用了這個第三方開源框架(SubsamplingScaleImageView)加載長圖,但是源代碼在有些手機上面不能進行放縮。 private void displayLongPic(Uri uri, SubsamplingScaleImageView longImg) {longImg.setQuickScaleEnabled(tr…

java barrier_Java并發類CyclicBarrier方法詳解

Cyclic是周期的意思,Barrier是關卡的意思。CyclicBarrier不僅有CountDownLatch的功能,還可以實現屏障等待,即階段性同步。因此適用于,需要循環地實現線程一起做任務的目標。CyclicBarrier允許一組線程相互等待,直到到達…

【ArcGIS風暴】實驗:公路建設成本的計算

實驗平臺:ArcGIS 9.3實驗目的:學習和掌握公路建設成本的計算方法實驗要求:熟練掌握如何生成通行成本層、計算成本距離,并學會計算最佳路徑,且對成本距離與直線距離進行比較。實驗數據:ArcEx7實驗步驟:生成通行成本層1.打開Arcmap,加載數據ArcEX7,如圖 2.執行spatial …

[leetcode]347. Top K Frequent Elements

Given a non-empty array of integers, return the k most frequent elements. For example,Given [1,1,1,2,2,3] and k 2, return [1,2]. Note: You may assume k is always valid, 1 ≤ k ≤ number of unique elements.Your algorithms time complexity must be better th…

合并Spark社區代碼的正確姿勢

原創文章,轉載請保留出處 最近剛剛忙完Spark 2.2.0的性能測試及Bug修復,社區又要發布2.1.2了,國慶期間剛好有空,過了一遍2.1.2的相關JIRA,發現有不少重要修復2.2.0也能用上,接下來需要將有用的PR合到我們內…

.NET 中 GC 的模式與風格

垃圾回收(GC)是托管語言必備的技術之一。GC 的性能是影響托管語言性能的關鍵。我們的 .NET 既能寫桌面程序 (WINFROM , WPF) 又能寫 web 程序 (ASP.NET CORE),甚至還能寫移動端程序。。。不同使用場景的程序對 GC 的風格也有不同的要求&#…

(轉)java中的 | ^ 分別是什么?

|是按位或 ^是按位抑或 &是按位與比如有兩個數 int x 5;int y 11;System.out.println(x|y);System.out.println(x&y);System.out.println(x^y);結果是15, 1 ,14 過程 x5 (0101二進制) y11(1011二進制) x|y 1111 15 x&y 0001 1 x…

[python opencv 計算機視覺零基礎到實戰] 七、邏輯運算與應用

一、學習目標 了解opencv中圖像的邏輯運算了解opencv中邏輯運算的應用 目錄 [python opencv 計算機視覺零基礎到實戰] 一、opencv的helloworld [【python opencv 計算機視覺零基礎到實戰】二、 opencv文件格式與攝像頭讀取] 一、opencv的helloworld [[python opencv 計算機…

Android之如何判斷當前是阿拉伯布局的方法

1 問題 判斷當前是不是阿拉伯布局的方法 2 幾種判斷方法 @SuppressLint("NewApi")public static boolean isLayoutRtl(View view, Resources res) {if (res == null || view == null) return false;Locale curLocale = res.getConfiguration().locale;//如果當前語言…

【ArcGIS風暴】數字化實驗:數據采集與編輯完整操作流程

一.實驗平臺:ArcGIS 9.3 二.實驗目的:對甘肅省的十四個地級市進行圖像配準、數據采集。 三.實驗要求:掌握地理數據采集方法,圖像配準及坐標投影,選擇主要的點、線、面進行投影。 四.實驗數據:甘肅省統計數據,甘肅省行政區劃圖。 (一).影像配準 第一步:加載…

loadrunner java 參數化_LoadRunner 參數化詳解

LoadRunner,是一種預測系統行為和性能的負載測試工具。通過以模擬上千萬用戶實施并發負載及實時性能監測的方式來確認和查找問題,LoadRunner能夠對整個企業架構進行測試。通過使用 LoadRunner,企業能最大限度地縮短測試時間,優化性…

Android之實現RTL的ViewPager

1 問題 如何實現RTL的ViewPager,就是滑動方向和我們之前滑動的方向相反,比如一般,我們用ViewPager滑動4個圖片,依次順序是 1 2 3 4 ,我們在頁面1的時候,我們一般都是習慣向左滑動到2,現在需要實現手指向右滑動到2. 2 解決辦法 1)我們可以使用ViewPager2,這個是可以支…

Why Apache Spark is a Crossover Hit for Data Scientists [FWD]

Spark is a compelling multi-purpose platform for use cases that span investigative, as well as operational, analytics. Data science is a broad church. I am a data scientist — or so I’ve been told — but what I do is actually quite different from what oth…