python cv2 求直線和輪廓的交點

2021-10-10 07:52:37 字數 4200 閱讀 1580

例項鎮樓

# 讀取並灰度值化

)# 二值化,過濾掉噪音

如給定一條直線,用點p1(20, 200),p2(340, 90)來表示。若已知在這條直線上位於輪廓2外側的2個點a,b,就可列舉線段ab上所有的點,推斷這些點和輪廓的關係(輪廓上,輪廓內,輪廓外)。如何求解點a和b? 為了提高列舉速度,可先求輪廓的boundingbox,直線和boundingbox的交點即a和b點。

x, y, w, h = cv2.boundingrect(conts[0]

)cv2.rectangle(img,

(x, y)

,(x + w, y + h),(

255,0,

0),1

)# 隨便畫一條直線

p1, p2 =(20

,200),

(340,90

)if p2[0]

!= p1[0]

:# 若存在斜率 y=kx+b

k =(p2[1]

- p1[1]

)/(p2[0]

- p1[0]

) b = p1[1]

- p1[0]

* k # 求解直線和boundingbox的交點a和b

pa, pb =

(x,int

(k * x + b)),

((x + w)

,int

(k *

(x + w)

+ b)

)else

:# 若斜率不存在,垂直的直線

c++版opencv中列舉點的函式有lineiterator,但cv2中好像無類似函式,因此使用skimage.draw.line來代替。(ps:若列舉的點全都不在輪廓上,可使用1內1外的中點近似)

# 列舉2點之間的線段點

for pt in

zip(

*line(

*pa,

*pb)):

if cv2.pointpolygontest(conts[0]

, pt,

false)==

0:# 若點在輪廓上

# 讀取並灰度值化

)# 二值化,過濾掉噪音

img = np.where(img <

100,0,

255)

.astype(np.uint8)

# 假定只有乙個輪廓conts[0]

# 顏色區分,把原圖再轉為bgr

img = cv2.cvtcolor(img, cv2.color_gray2bgr)

cv2.drawcontours(img, conts,-1

,(0,

255,0)

,1)x, y, w, h = cv2.boundingrect(conts[0]

)cv2.rectangle(img,

(x, y)

,(x + w, y + h),(

255,0,

0),1

)# 隨便畫一條直線

p1, p2 =(20

,200),

(340,90

)if p2[0]

!= p1[0]

:# 若存在斜率 y=kx+b

k =(p2[1]

- p1[1]

)/(p2[0]

- p1[0]

) b = p1[1]

- p1[0]

* k # 求解直線和boundingbox的交點a和b

pa, pb =

(x,int

(k * x + b)),

((x + w)

,int

(k *

(x + w)

+ b)

)else

:# 若斜率不存在,垂直的直線

pa, pb =

(p1[0]

, y)

,(p1[0]

, y + h)

cv2.circle(img, pa,2,

(0,255

,255),

2)cv2.circle(img, pb,2,

(0,255

,255),

2)cv2.puttext(img,

'a',

(pa[0]

-10, pa[1]

-10), cv2.font_hershey_******x,

0.5,

(255

,255,0

),1)

cv2.puttext(img,

'b',

(pb[0]

+10, pb[1]

-10), cv2.font_hershey_******x,

0.5,

(255

,255,0

),1)

cv2.line(img, p1, p2,

(255

,255,0

),1)

# 列舉2點之間的線段點

for pt in

zip(

*line(

*pa,

*pb)):

if cv2.pointpolygontest(conts[0]

, pt,

false)==

0:# 若點在輪廓上

cv2.circle(img, pt,2,

(0,0

,255),

2)cv2.imshow(

'0', img)

cv2.waitkey(

0)

reference:

opencv安裝與python cv2安裝

1 opencv安裝 在cmd下面輸入 python進入python命令列,然後輸入 import cv2,如沒有錯誤資訊證明安裝成功。2,乙個簡單的測試 新建text.py,輸入如下的程式,cmd下輸入python text.py,如果可以正確的顯示,證明安裝成功。顯示的如下所示 基於上面的安裝就...

python cv2簡單使用操作筆記

讀入影象儲存影象 import numpy as np import cv2 載入影象 還可先建立視窗 cv2.namedwindow image cv2.window normal 顯示影象 視窗名字,視窗放出影象,多個視窗時命名不可以一樣 cv2.imshow image img 檢測特定鍵是否...

求拋物線和直線交點 定拋物線與動直線交點問題

中考第26題,代數綜合題,是一道關於二次函式的綜合題,一般與一次函式結合考察影象交點問題,一般是動態問題,要麼拋物線動,要麼直線動,要麼都動起來,本題為定拋物線與動直線交點問題。在求範圍的時候特別注意等號的存在!已知拋物線g y a x h 2的對稱軸為直線x 1,且經過原點.1 求拋物線g 的函式...