最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

OpenCV: 顏色變換及空間變換

2023-04-14 23:38 作者:Uncle_LL  | 我要投稿

目標1

  • 在本教程中,將學習如何將圖像從一個色彩空間轉(zhuǎn)換到另一個,像BGR?灰色,BGR?HSV等

  • 除此之外,將創(chuàng)建一個應用程序,以提取視頻中的彩色對象

  • 學習以下函數(shù):CV2.cvtColor,CV2.inRange

改變顏色空間

OpenCV中有超過270種顏色空間轉(zhuǎn)換方法。但是我們研究兩個最廣泛使用的, BGR?灰色和BGR?HSV。

對于顏色轉(zhuǎn)換,使用CV2.cvtColor(input_image, flag),其中flag決定轉(zhuǎn)換的類型。

import?CV2
flag?=?[i?for?i?in?dir(CV2)?if?i.startswith('COLOR_')]
print(flag)

?
?

大概274種。

注意 HSV的色相范圍為[0,179],飽和度范圍為[0,255],透明度值范圍為[0,255]。不同的軟件使用不同

的規(guī)模。因此,如果要將OpenCV值和它們比較,需要將這些范圍標準化。

img?=?CV2.imread('messi.png')
img_hsv?=?CV2.cvtColor(img,?CV2.COLOR_BGR2HSV)
CV2.imshow('hsv',?img_hsv)
CV2.waitKey(0)
CV2.destroyAllWindows()

?
?

對象追蹤

現(xiàn)在知道了如何將BGR圖像轉(zhuǎn)換成HSV,可以使用它來提取一個有顏色的對象。在HSV中比在BGR顏色空間中更容易表示顏色。在應用程序中,將嘗試提取一個藍色的對象的一個簡單例子。方法如下: 取視頻的每一幀 - 轉(zhuǎn)換從BGR到HSV顏色空間 - 對HSV圖像設置藍色范圍的閾值 - 現(xiàn)在單獨提取藍色對象,可以對圖像做任何想做的事情。

import?CV2
import?numpy?as?np
cap?=?cv.VideoCapture(0)
while(1):
????#?讀取幀
????_,?frame?=?cap.read()
????#?轉(zhuǎn)換顏色空間?BGR?到?HSV
????hsv?=?CV2.cvtColor(frame,?CV2.COLOR_BGR2HSV)
????#?定義HSV中藍色的范圍
????lower_blue?=?np.array([110,50,50])
????upper_blue?=?np.array([130,255,255])
????#?設置HSV的閾值使得只取藍色
????mask?=?CV2.inRange(hsv,?lower_blue,?upper_blue)
????#?將掩膜和圖像逐像素相加
????res?=?CV2.bitwise_and(frame,frame,?mask=?mask)
????CV2.imshow('frame',frame)
????CV2.imshow('mask',mask)
????CV2.imshow('res',res)
????k?=?CV2.waitKey(5)?&?0xFF
????if?k?==?27:
????????break
CV2.destroyAllWindows()

?

注意 圖像中有一些噪點。將在后面的章節(jié)中看到如何刪除它們。 這是對象跟蹤中最簡單的方法。一旦學習了輪廓,就可以做很多事情,例如找到該對象的質(zhì)心并使用它來跟蹤對象,僅通過將手移到相機前面以及其他許多有趣的東西就可以繪制圖表。

如何找到要追蹤的HSV值

這是在stackoverflow.com上發(fā)現(xiàn)的一個常見問題。它非常簡單,你可以使用相同的函數(shù)

CV2.cvtColor()。只需傳遞你想要的BGR值,而不是傳遞圖像。例如,要查找綠色的HSV值,

請在Python終端中嘗試以下命令:

green?=?np.uint8([[[0,255,0]]])
hsv_green?=?CV2.cvtColor(green,?CV2.COLOR_BGR2HSV)
print(hsv_green)

#?[[[?60?255?255]]]

現(xiàn)在把 [10,100,100] 和 [10,255, 255] 分別作為下界和上界。除了這個方法之外,可以使用任何圖像編輯工具(如GIMP或任何在線轉(zhuǎn)換器)來查找這些值,但是不要忘記調(diào)整HSV范圍。

目標2

  • 學習將不同的幾何變換應用到圖像上,如平移、旋轉(zhuǎn)、仿射變換等。

  • 函數(shù):?cv.getPerspectiveTransform

變換

OpenCV提供了兩個轉(zhuǎn)換函數(shù)CV2.warpAffineCV2.warpPerspective,可以使用它們進行各種轉(zhuǎn)換。CV2.warpAffine采用2x3轉(zhuǎn)換矩陣,而CV2.warpPerspective采用3x3轉(zhuǎn)換矩陣作為輸入。

縮放

縮放只是調(diào)整圖像的大小。為此,OpenCV帶有一個函數(shù)CV2.resize()。圖像的大小可以手動指定,也可以指定縮放比例。也可使用不同的插值方法。首選的插值方法是CV2.INTER_AREA用于縮小,CV2.INTER_CUBIC(慢)和CV2.INTER_LINEAR用于縮放。默認情況下,出使用的插值方法為CV2.INTER_LINEAR??梢允褂靡韵路椒ㄕ{(diào)整輸入圖像的大?。?/p>

import?CV2
import?numpy?as?np
img?=?CV2.imread('messi.png')
res?=?CV2.resize(img,?None,?fx=2,?fy=2,?interpolation=cv.INTER_CUBIC)
#或者
height,?width?=?img.shape[:2]
res?=?CV2.resize(img,(2*width,?2*height),?interpolation=CV2.INTER_CUBIC)

平移

平移是物體位置的移動。如果知道在(x,y)方向上的位移,則將其設為(t_x, t_y ),可以創(chuàng)建轉(zhuǎn)換矩陣M ,如下所示:

?

可以將其放入np.float32類型的Numpy數(shù)組中,并將其傳遞給CV2.warpAffine函數(shù)。參見下面偏移為(100, 50)的示例:

import?CV2
import?numpy?as?np
img?=?CV2.imread('messi.png',?0)
rows,cols?=?img.shape
M?=?np.float32([[1,0,100],[0,1,50]])??#?方向
dst?=?cv.warpAffine(img,M,(cols,rows))
cv.imshow('img',dst)
cv.waitKey(0)
cv.destroyAllWindows()

警告?CV2.warpAffine函數(shù)的第三個參數(shù)是輸出圖像的大小,其形式應為(width,height)。記住width =列數(shù),height =行數(shù)。

?
??

旋轉(zhuǎn)

圖像旋轉(zhuǎn)角度為θ是通過以下形式的變換矩陣實現(xiàn)的:

?

但是OpenCV提供了可縮放的旋轉(zhuǎn)以及可調(diào)整的旋轉(zhuǎn)中心,因此可以在自己喜歡的任何位置旋轉(zhuǎn)。修改后的變換矩陣為

?

其中:

?

為了找到此轉(zhuǎn)換矩陣,OpenCV提供了一個函數(shù)CV2.getRotationMatrix2D。請檢查以下示例,該示例將圖像相對于中心旋轉(zhuǎn)90度而沒有任何縮放比例。

img?=?CV2.imread('messi.png',?0)
rows,cols?=?img.shape
M?=?CV2.getRotationMatrix2D(((cols-1)/2.0,?(rows-1)/2.0),?90,1)??#?cols-1?和?rows-1?是坐標限制
dst?=?CV2.warpAffine(img,?M,?(cols,rows))

?

仿射變換

在仿射變換中,原始圖像中的所有平行線在輸出圖像中仍將平行。為了找到變換矩陣,需要輸入圖像中的三個點及其在輸出圖像中的對應位置。然后CV2.getAffineTransform將創(chuàng)建一個2x3矩陣,該矩陣將傳遞給CV2.warpAffine。

查看以下示例,并查看選擇的點(以綠色標記):

img?=?CV2.imread('draw.png')
rows,cols,c?=?img.shape
pts1?=?np.float32([[50,50],[200,50],[50,200]])
pts2?=?np.float32([[10,100],[200,50],[100,250]])
M?=?CV2.getAffineTransform(pts1,?pts2)
dst?=?CV2.warpAffine(img,M,(cols,rows))
plt.subplot(121),plt.imshow(img),plt.title('Input')
plt.subplot(122),plt.imshow(dst),plt.title('Output')

查看結(jié)果:

?

透視變換

對于透視變換,需要3x3變換矩陣。即使在轉(zhuǎn)換后,直線也將保持直線。要找到此變換矩陣,需要在輸入圖像上有4個點,在輸出圖像上需要相應的點。在這四個點中,其中三個不應共線。然后可以通過函數(shù)CV2.getPerspectiveTransform找到變換矩陣。然后將CV2.warpPerspective應用于此3x3轉(zhuǎn)換矩陣。

img?=?CV2.imread('sudo.png')
rows,?cols,?ch?=?img.shape
pts1?=?np.float32([[56,65],[368,52],[28,387],[389,390]])
pts2?=?np.float32([[0,0],[300,0],[0,300],[300,300]])
M?=?CV2.getPerspectiveTransform(pts1,?pts2)
dst?=?CV2.warpPerspective(img,?M,?(300,300))
plt.subplot(121),plt.imshow(img),?plt.title('Input')
plt.subplot(122),plt.imshow(dst),?plt.title('Output')
plt.show()

?

其他資源

  • Computer Vision: Algorithms and Applications, Richard Szeliski


OpenCV: 顏色變換及空間變換的評論 (共 條)

分享到微博請遵守國家法律
天台县| 民勤县| 东安县| 邵武市| 澄城县| 陵川县| 南漳县| 镇安县| 泽普县| 佛冈县| 三江| 平度市| 股票| 洞口县| 施秉县| 错那县| 松溪县| 盐池县| 台南县| 拉孜县| 东阳市| 南华县| 福安市| 陆丰市| 富源县| 土默特右旗| 库车县| 富源县| 高陵县| 芮城县| 东阳市| 灵武市| 信宜市| 安福县| 微山县| 万山特区| 类乌齐县| 龙川县| 伊金霍洛旗| 茌平县| 锡林郭勒盟|