最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

openCV提取圖像中的矩形區(qū)域

 更新時間:2020年07月21日 11:30:28   作者:c19961227  
這篇文章主要為大家詳細介紹了openCV提取圖像中的矩形區(qū)域,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

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

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]

#現(xiàn)在的目標是從一堆點中挑出分布在四個角落的點,決定把圖片分為四等份,每個區(qū)域的角度來劃分點,
#默認四個角分別分布在圖像的四等分的區(qū)間上,也就是矩形在圖像中央
# 我們把所有點的坐標,都減去圖片中央的那個點(當成原點),然后按照x y坐標值的正負 判斷屬于哪一個區(qū)間

center=[length/2,depth/2]

# 可以得到小數(shù)
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 = []
# 判斷是那個區(qū)間的
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
# 下面開始判斷每個區(qū)間的極值,要選擇距離中心點最遠的點,就是角點
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)
# 二值圖轉(zhuǎn)為三通道圖
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)
# 銷毀所有創(chuàng)建出的窗口

運行效果

用到的圖片

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 深入了解python基于tkinter寫的畫圖項目

    深入了解python基于tkinter寫的畫圖項目

    這篇文章主要為大家介紹了python基于tkinter寫的畫圖項目,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12
  • Python基礎(chǔ)入門之seed()方法的使用

    Python基礎(chǔ)入門之seed()方法的使用

    這篇文章主要介紹了Python基礎(chǔ)入門之seed()方法的使用,是Python學(xué)習(xí)當中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-05-05
  • Python實戰(zhàn)之單詞打卡統(tǒng)計

    Python實戰(zhàn)之單詞打卡統(tǒng)計

    這篇文章主要介紹了Python實戰(zhàn)之單詞打卡統(tǒng)計,文中有非常詳細的代碼示例,對正在學(xué)習(xí)python的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • Python中schedule模塊定時任務(wù)的使用方法(2)

    Python中schedule模塊定時任務(wù)的使用方法(2)

    這篇文章主要介紹了Python中schedule模塊定時任務(wù)的使用方法,文章基于上一篇文章的內(nèi)容展開的后續(xù),需要的朋友可以參考一下
    2022-05-05
  • Python編程不要再使用print調(diào)試代碼了

    Python編程不要再使用print調(diào)試代碼了

    這篇文章主要為大家介紹了Python編程中代碼的調(diào)試技巧,不要只會用print調(diào)試哦~其他的Python調(diào)試技巧,大家來一起共同學(xué)習(xí)下吧,祝大家多多進步,早日升職加薪
    2021-10-10
  • python configparser中默認值的設(shè)定方式

    python configparser中默認值的設(shè)定方式

    這篇文章主要介紹了python configparser中默認值的設(shè)定方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • 深入理解python多進程編程

    深入理解python多進程編程

    下面小編就為大家?guī)硪黄钊肜斫鈖ython多進程編程。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-06-06
  • 使用python實現(xiàn)對元素的長截圖功能

    使用python實現(xiàn)對元素的長截圖功能

    這篇文章主要介紹了用python實現(xiàn)對元素的長截圖功能,非常不錯,具有一定的參考借鑒價值,需要的朋友參考下吧
    2019-11-11
  • Python內(nèi)置方法實現(xiàn)字符串的秘鑰加解密(推薦)

    Python內(nèi)置方法實現(xiàn)字符串的秘鑰加解密(推薦)

    在Python中實現(xiàn)AES算法需要借助的第三方庫Crypto,其在各個操作系統(tǒng)上的安裝方法有些許復(fù)雜,所以對于簡單的使用有點殺雞用牛刀的意思。這篇文章主要介紹了利用Python內(nèi)置方法實現(xiàn)字符串的秘鑰加解密,需要的朋友可以參考下
    2019-12-12
  • Python的flask接收前臺的ajax的post數(shù)據(jù)和get數(shù)據(jù)的方法

    Python的flask接收前臺的ajax的post數(shù)據(jù)和get數(shù)據(jù)的方法

    這篇文章主要介紹了Python的flask接收前臺的ajax的post數(shù)據(jù)和get數(shù)據(jù)的方法,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04

最新評論

股票| 南木林县| 石渠县| 青河县| 枣庄市| 沂水县| 明溪县| 扬州市| 体育| 连平县| 柘荣县| 罗源县| 普陀区| 育儿| 安仁县| 山阴县| 三河市| 重庆市| 满洲里市| 贵德县| 顺平县| 河池市| 云安县| 巨鹿县| 安图县| 全南县| 英山县| 汕头市| 察隅县| 镇安县| 霸州市| 桦川县| 姜堰市| 白城市| 丰镇市| 博客| 扬中市| 宁波市| 西乌珠穆沁旗| 张北县| 瑞丽市|