五月天青色头像情侣网名,国产亚洲av片在线观看18女人,黑人巨茎大战俄罗斯美女,扒下她的小内裤打屁股

歡迎光臨散文網(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: 顏色變換及空間變換的評論 (共 條)

分享到微博請遵守國家法律
武宣县| 山西省| 富蕴县| 上高县| 聂拉木县| 称多县| 镇沅| 玛沁县| 中宁县| 红桥区| 新营市| 青海省| 安塞县| 岚皋县| 蒲城县| 武隆县| 淅川县| 龙井市| 远安县| 磐安县| 济阳县| 永福县| 开原市| 庄浪县| 沾益县| 黄冈市| 和林格尔县| 奉节县| 都兰县| 溆浦县| 兴隆县| 阳西县| 左权县| 凤山县| 和顺县| 朝阳县| 安仁县| 阜康市| 响水县| 襄垣县| 安阳县|