激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - openCV提取圖像中的矩形區域

openCV提取圖像中的矩形區域

2020-07-21 17:52c19961227 Python

這篇文章主要為大家詳細介紹了openCV提取圖像中的矩形區域,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

改編自詳解利用OpenCV提取圖像中的矩形區域(PPT屏幕等) 原文是c++版,我改成了python版,供大家參考學習。
主要思想:邊緣檢測—》輪廓檢測—》找出最大的面積的輪廓—》找出頂點—》投影變換

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
import numpy as np
import cv2
# 這個成功的扣下了ppt白板
srcPic = cv2.imread('2345.jpg')
length=srcPic.shape[0]
depth=srcPic.shape[1]
polyPic = srcPic
shrinkedPic = srcPic
greyPic = cv2.cvtColor(shrinkedPic, cv2.COLOR_BGR2GRAY)
ret, binPic = cv2.threshold(greyPic, 130, 255, cv2.THRESH_BINARY)
print(binPic.shape)
median = cv2.medianBlur(binPic, 5)
# 進行邊緣檢測
cannyPic = cv2.Canny(median, 10, 200)
 
cv2.namedWindow("binary", 0)
cv2.namedWindow("binary2", 0)
cv2.imshow("binary", cannyPic)
# 找出輪廓
contours, hierarchy = cv2.findContours(cannyPic, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE)
cv2.imwrite('binary2.png', cannyPic)
cv2.imshow("binary2", cannyPic)
i = 0
maxArea = 0
# 挨個檢查看那個輪廓面積最大
for i in range(len(contours)):
 if cv2.contourArea(contours[i]) > cv2.contourArea(contours[maxArea]):
 maxArea = i
#檢查輪廓得到分布在四個角上的點
hull = cv2.convexHull(contours[maxArea])
s = [[1,2]]
z = [[2,3]]
for i in hull:
 s.append([i[0][0],i[0][1]])
 z.append([i[0][0],i[0][1]])
del s[0]
del z[0]
 
#現在的目標是從一堆點中挑出分布在四個角落的點,決定把圖片分為四等份,每個區域的角度來劃分點,
#默認四個角分別分布在圖像的四等分的區間上,也就是矩形在圖像中央
# 我們把所有點的坐標,都減去圖片中央的那個點(當成原點),然后按照x y坐標值的正負 判斷屬于哪一個區間
 
center=[length/2,depth/2]
 
# 可以得到小數
for i in range(len(s)):
 s[i][0] = s[i][0] - center[0]
 s[i][1] = s[i][1] - center[1]
one = []
two = []
three = []
four = []
# 判斷是那個區間的
for i in range(len(z)):
 if s[i][0] <= 0 and s[i][1] <0 :
 one.append(i)
 elif s[i][0] > 0 and s[i][1] <0 :
 two.append(i)
 elif s[i][0] >= 0 and s[i][1] > 0:
 four.append(i)
 else:three.append(i)
 
p=[]
distance=0
temp = 0
# 下面開始判斷每個區間的極值,要選擇距離中心點最遠的點,就是角點
for i in one :
 x=z[i][0]-center[0]
 y=z[i][1]-center[1]
 d=x*x+y*y
 if d > distance :
 temp = i
 distance = d
p.append([z[temp][0],z[temp][1]])
distance=0
temp=0
for i in two :
 x=z[i][0]-center[0]
 y=z[i][1]-center[1]
 d=x*x+y*y
 if d > distance :
 temp = i
 distance = d
p.append([z[temp][0],z[temp][1]])
distance=0
temp=0
for i in three :
 x=z[i][0]-center[0]
 y=z[i][1]-center[1]
 d=x*x+y*y
 if d > distance :
 temp = i
 distance = d
p.append([z[temp][0],z[temp][1]])
distance=0
temp=0
for i in four :
 x=z[i][0]-center[0]
 y=z[i][1]-center[1]
 d=x*x+y*y
 if d > distance :
 temp = i
 distance = d
p.append([z[temp][0],z[temp][1]])
 
 
for i in p:
 cv2.circle(polyPic, (i[0],i[1]),2,(0,255,0),2)
# 給四個點排一下順序
a=[]
b=[]
st=[]
for i in p:
 a.append(i[0])
 b.append(i[1])
index=np.lexsort((b, a))
for i in index:
 st.append(p[i])
p = st
print(p)
pts1 = np.float32([[p[0][0],p[0][1]],[p[1][0],p[1][1]],[p[2][0],p[2][1]],[p[3][0],p[3][1]]])
# dst=np.float32([[0,0],[0,srcPic.shape[1]],[srcPic.shape[0],0],[srcPic.shape[0],srcPic.shape[1]]])
dst=np.float32([[0,0],[0,600],[400,0],[400,600]])
 
# 投影變換
M = cv2.getPerspectiveTransform(pts1,dst)
cv2.namedWindow("srcPic2", 0)
cv2.imshow("srcPic2", srcPic)
#dstImage = cv2.warpPerspective(srcPic,M,(srcPic.shape[0],srcPic.shape[1]))
dstImage = cv2.warpPerspective(srcPic,M,(400,600))
 
 
# 在原圖上畫出紅色的檢測痕跡,先生成一個黑色圖
black = np.zeros((shrinkedPic.shape[0], shrinkedPic.shape[1]), dtype=np.uint8)
# 二值圖轉為三通道圖
black3 = cv2.merge([black, black, black])
# black=black2
cv2.drawContours(black, contours, maxArea, 255, 11)
cv2.drawContours(black3, contours, maxArea, (255, 0, 0), 11)
cv2.imwrite('cv.png', black)
 
cv2.namedWindow("cannyPic", 0)
cv2.imshow("cannyPic", black)
cv2.namedWindow("shrinkedPic", 0)
cv2.imshow("shrinkedPic", polyPic)
cv2.namedWindow("dstImage", 0)
cv2.imshow("dstImage", dstImage)
# 等待一個按下鍵盤事件
cv2.waitKey(0)
# 銷毀所有創建出的窗口

運行效果

openCV提取圖像中的矩形區域

用到的圖片

openCV提取圖像中的矩形區域

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:https://blog.csdn.net/c19961227/article/details/90693098

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 精品一区二区三区毛片 | 午夜热门福利 | 中文字幕在线永久视频 | 欧美性生交xxxxx免费观看 | 国产亚洲精品久久久久久大师 | 午夜生活理论片 | 狠狠操人人干 | 中国杭州少妇xxxx做受 | 亚洲综合视频网 | 日产精品久久久一区二区福利 | 色97在线 | 免费毛片a线观看 | 粉嫩av一区二区三区四区在线观看 | 美国一级黄色毛片 | 日本一区二区三区视频在线 | 一级一级一级一级毛片 | 男女隐私免费视频 | av在线日韩| 天堂二区| 日韩电影一区二区 | 成人免费毛片在线观看 | 亚洲成人夜色 | 日本高清黄色片 | 999久久久精品视频 欧美日韩网站在线观看 | 国产电影精品久久 | 91丝袜| av电影院在线观看 | 国产精品久久久久久久不卡 | 请播放一级毛片 | 国产精品久久久久久久久久久久久久久久 | 性明星video另类hd | av人人 | 九色中文字幕 | 在线一级片 | 国产一级毛片高清视频完整版 | xxxx hd videos| 久久成人免费网 | 午夜激情视频免费 | 少妇一级淫片免费放播放 | 日韩美香港a一级毛片 | 国产一区视频观看 |