opencv使用筆記

2021-08-21 09:03:09 字數 4566 閱讀 1872

2023年07月08日 11:18:55

影象的幾何變換主要包括:平移、擴大與縮小、旋轉、仿射、透視等等。影象變換是建立在矩陣運算基礎上的,通過矩陣運算可以很快的找到對應關係。理解變換的原理需要理解變換的構造方法以及矩陣的運算方法,曾經寫過matlab下的簡單影象變換原理,裡面有最基礎的構造原理可以看看: 

matlab之原始處理影象幾何變換

下面介紹的影象操作假設你已經知道了為什麼需要用矩陣構造才能實現了(上面那個部落格有介紹為什麼)。那麼關於偏移很簡單,影象的平移,沿著x方向tx距離,y方向ty距離,那麼需要構造移動矩陣: m=

[100

1txt

y]m=[10tx01ty]

通過numpy來產生這個矩陣,並將其賦值給仿射函式cv2.warpaffine(). 

仿射函式cv2.warpaffine()接受三個引數,需要變換的原始影象,移動矩陣m 以及變換的影象大小(這個大小如果不和原始影象大小相同,那麼函式會自 動通過插值來調整畫素間的關係)。 

乙個例子如下:

res = cv2.warpaffine(img,h,(rows,cols)) #需要影象、變換矩陣、變換後的大小

影象的擴大與縮小有專門的乙個函式,cv2.resize(),那麼關於伸縮需要確定的就是縮放比例,可以是x與y方向相同倍數,也可以單獨設定x與y的縮放比例。另外乙個就是在縮放以後影象必然就會變化,這就又涉及到乙個插值問題。那麼這個函式中,縮放有幾種不同的插值(interpolation)方法,在縮小時推薦cv2.inter_arer,擴大是推薦cv2.inter_cubic和cv2.inter_linear。預設都是cv2.inter_linear,比如:

# 插值:interpolation

# none本應該是放影象大小的位置的,後面設定了縮放比例,

#所有就不要了

res1 = cv2.resize(img,none,fx=2,fy=2,interpolation=cv2.inter_cubic)

#直接規定縮放大小,這個時候就不需要縮放因子

通過座標軸可以看到影象擴大了一倍,並且兩種方法相同。

影象的旋轉矩陣一般為: m=

[cos

(θ)s

in(θ

)−si

n(θ)

cos(

θ)]m=[cos(θ)−sin(θ)sin(θ)cos(θ)]

但是單純的這個矩陣是在原點處進行變換的,為了能夠在任意位置進行旋轉變換,opencv採用了另一種方式:  m

=[α−

β−βα

(1−α

)cen

terx

−βce

nter

yβce

nter

x+(1

−α)c

ente

ry]m=[α−β(1−α)centerx−βcentery−βαβcenterx+(1−α)centery]

為了構造這個矩陣,opencv提供了乙個函式: 

cv2.getrotationmatrix2d(),這個函式需要三個引數,旋轉中心,旋轉角度,旋轉後影象的縮放比例,比如下例:

rows,cols = img.shape[:2]

#第乙個引數旋轉中心,第二個引數旋轉角度,第三個引數:縮放比例

m = cv2.getrotationmatrix2d((cols/2,rows/2),45,1)

#第三個引數:變換後的影象大小

影象的旋轉加上拉公升就是影象仿射變換,仿射變化也是需要乙個m矩陣就可以,但是由於仿射變換比較複雜,一般直接找很難找到這個矩陣,opencv提供了根據變換前後三個點的對應關係來自動求解m。這個函式是 

m=cv2.getaffinetransform(pos1,pos2),其中兩個位置就是變換前後的對應位置關係。輸 出的就是仿射矩陣m。然後在使用函式cv2.warpaffine()。形象化的圖如下(引用參考的) 

乙個例子比如:

#第三個引數:變換後的影象大小

透視需要的是乙個3*3的矩陣,同理opencv在構造這個矩陣的時候還是採用一種點對應的關係來通過函式自己尋找的,因為我們自己很難計算出來。這個函式是m = cv2.getperspectivetransform(pts1,pts2),其中pts需要變換前後的4個點對應位置。得到m後在通過函式cv2.warpperspective(img,m,(200,200))進行。形象化的圖如下(引用參考的) 

乙個例子如下:

Opencv使用筆記

opencv 2.x,返回,contours,hierachy opencv 3.x 返回 image,contours,hierachy,contours是個list,每個是乙個shape為 nx2 的輪廓,n為輪廓點個數2為x,y值,2.warpaffine 使用三個點,如引數點數多與3個,那麼...

OpenCV應用筆記

1 使用cvsmooth函式,src與dst的depth要一致,否則會出現raiseexception錯誤。src和dst的位深不能為64位浮點。簡單模糊和高斯模糊支援 1 或 3 通道,8 位元 和 32 位元 浮點影象。這兩種方法可以 in place 方式處理影象。2 關於直接讀取iplima...

opencv 的 Mat 類使用筆記

環境 windows,visual studio 15,opencv3.4.2,c 建立乙個2 2的矩陣,a矩陣的深度是1,b的深度是2,c的深度是3 建立的矩陣的 truew deepth w 其中cv 8uc1,cv 8uc2,cv 8uc3決定寬高之外的通道數,其中8是每個數字佔8位,u是無符...