OpenCV 擷取任意形狀的ROI

2021-10-10 21:04:54 字數 2582 閱讀 7259

規則矩形的roi提取可以使用 numpy 的資料切片操作,但是真實場景的roi形狀並不規則,可能伴隨著旋轉角度、多點折線等特徵。這裡介紹利用 opencv 擷取任意形狀roi的基本思路。會使用到的幾個比較重要的方法有:

直線擬合:cv.fitline

旋轉矩陣:cv.getrotationmatrix2d

仿射變換:cv.warpaffine

輪廓繪製:cv.drawcontours

影象融合:cv.add

外接框擬合:cv.minarearect

一、基本思路

這裡針對的是一般的 bgr 影象,roi 以二維座標點的形式給出,可以是多個點、多邊形。

二、**實現

import cv2 as cv

import numpy as np

import math

defcrop

(image, pts)

:'''

:param image: numpy.array, origin image

:param pts: numpy.array, points of bbox at any angle, shape with (-1, 2)

:return:

'''h, w = image.shape[:2

]# 計算 roi 的傾斜角度

cos_a, sin_a, _, _ = cv.fitline(pts, cv.dist_l2,0,

0.01

,0.01

) angle = math.asin(sin_a)

*180

/ math.pi # 此處需要注意角度的正負

# 根據 roi 傾斜角計算旋轉矩陣,旋轉中心就是 roi 的中心

cx, cy = np.mean(pts[:,

0]), np.mean(pts[:,

1]) m = cv.getrotationmatrix2d(

(cx, cy)

, angle,1)

cos = np.

abs(m[0,

0]) sin = np.

abs(m[0,

1])# 計算旋轉之後影象的寬度和高度

nw =

int(

(h * sin)

+(w * cos)

) nh =

int(

(h * cos)

+(w * sin)

)# 調整旋轉矩陣

m[0,

2]+=(nw /2)

- cx

m[1,

2]+=(nh /2)

- cy

# 旋轉影象

image = cv.warpaffine(image, m,

(nw, nh)

, bordervalue=

(255

,255

,255))

# 計算旋轉之後的 roi

pts = np.pad(pts, pad_width=((

0,0)

,(0,

1)), mode=

'constant'

, constant_values=((

0,0)

,(0,

1)))

.reshape((-

1,3,

1)) pts =

[np.dot(m, pts[i]

)for i in

range

(pts.shape[0]

)]pts = np.array(pts, np.int32)

.reshape((-

1,1,

2))# 計算 roi 掩碼

mask = np.zeros(

(nh, nw,3)

, dtype=np.uint8)

+255

mask = cv.drawcontours(mask,

[pts],-

1,(0

,0,0

),-1

)# 掩碼融合

image = cv.add(image, mask)

# 擷取規則影象

幾點說明:

cv2.add(image, np.zeros(np.shape(image)

, dtype=np.uint8)

, mask=mask)

任意形狀的ImageView

demo位址 執行效果 zwimageview.h中 import inte ce zwimageview uiview path 形狀 property nonatomic,assign cgpathref path image property nonatomic,strong uiimage ...

openCV任意幾何形狀感興趣區域(ROI)提取

影象感興趣區域 roi 提取主要使用掩模來進行。掩模是二值影象,感興趣區域的掩模值設定為255,非感興趣區域的掩模值為0 獲取掩模的方法主要有兩種 方法一 使用opencv中mat函式方法,呼叫mat rect setto方法設定掩模 mat mat operator const rect roi ...

openCV任意幾何形狀感興趣區域(ROI)提取

影象感興趣區域 roi 提取主要使用掩模來進行。掩模是二值影象,感興趣區域的掩模值設定為255,非感興趣區域的掩模值為0 獲取掩模的方法主要有兩種 方法一使用opencv中mat函式方法,呼叫mat rect setto方法設定掩模 mat mat operator const rect roi c...