OpenCV計(jì)算機(jī)視覺處理 課件 模塊八 繪圖和交互_第1頁
OpenCV計(jì)算機(jī)視覺處理 課件 模塊八 繪圖和交互_第2頁
OpenCV計(jì)算機(jī)視覺處理 課件 模塊八 繪圖和交互_第3頁
OpenCV計(jì)算機(jī)視覺處理 課件 模塊八 繪圖和交互_第4頁
OpenCV計(jì)算機(jī)視覺處理 課件 模塊八 繪圖和交互_第5頁
已閱讀5頁,還剩67頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

OpenCV計(jì)算機(jī)視覺處理Computervisionprocessing模塊八繪圖和交互模塊概述在貫徹二十大精神的指引下,我們不斷追求科技創(chuàng)新,以科技力量推動(dòng)社會(huì)發(fā)展和人民幸福。PythonOpenCV作為一項(xiàng)領(lǐng)先的計(jì)算機(jī)視覺庫,不僅為圖像處理和計(jì)算機(jī)視覺任務(wù)提供了強(qiáng)大的功能,還在圖形繪制領(lǐng)域展現(xiàn)了其卓越的能力。通過利用OpenCV的各種繪圖函數(shù),我們可以輕松地在圖像上標(biāo)記感興趣區(qū)域、繪制幾何形狀或文本,為計(jì)算機(jī)視覺應(yīng)用提供了豐富的視覺表達(dá)手段。同時(shí),OpenCV的鼠標(biāo)交互操作、鍵盤交互操作和窗口交互操作等功能,進(jìn)一步增強(qiáng)了用戶與計(jì)算機(jī)視覺系統(tǒng)之間的交互體驗(yàn)。這些功能不僅提高了系統(tǒng)的靈活性和便捷性,也促進(jìn)了人機(jī)交互技術(shù)的創(chuàng)新發(fā)展。本模塊將介紹如何利用PythonOpenCV進(jìn)行圖形繪制,主要包括各種繪圖函數(shù)、鼠標(biāo)交互操作、鍵盤交互操作和窗口交互操作等。學(xué)習(xí)導(dǎo)航學(xué)習(xí)目標(biāo)1.知識(shí)目標(biāo)(1)掌握創(chuàng)建畫布的方法;(2)掌握使用繪圖函數(shù)繪制直線、矩形、圓、橢圓、多邊形等多種幾何圖形的方法;(3)掌握能在圖像的指定位置添加文字說明的方法;(4)熟悉鼠標(biāo)交互功能的類型;(5)掌握使用不同的鼠標(biāo)事件類型和標(biāo)準(zhǔn)進(jìn)行不同的鼠標(biāo)交互操作的方法;(6)掌握通過鍵盤來控制圖像的顯示和處理的方法;(7)掌握waitKey的相關(guān)操作以及等待方法的使用;(8)掌握創(chuàng)建滾動(dòng)條的方法;(9)掌握使用滾動(dòng)條的值調(diào)節(jié)圖像的外觀顯示方法。幫我梳理學(xué)習(xí)目標(biāo)素質(zhì)目標(biāo)和能力目標(biāo)。學(xué)習(xí)目標(biāo)2.能力目標(biāo)(1)通過完成基本繪圖和交互功能代碼的編寫,培養(yǎng)學(xué)生使用相關(guān)庫和框架來簡化開發(fā)工作;(2)通過獨(dú)立分析和解決在編程過程中遇到的問題的能力,提高學(xué)生查閱文檔和在線資源來尋求幫助和解決方案的能力;(3)通過持續(xù)學(xué)習(xí)和自我提升的意識(shí),培養(yǎng)學(xué)生適應(yīng)新技術(shù)和新工具的發(fā)展變化的能力;(4)通過將所學(xué)知識(shí)應(yīng)用于實(shí)際項(xiàng)目中,完成具有實(shí)際意義的作品,培養(yǎng)學(xué)生將理論知識(shí)與實(shí)踐經(jīng)驗(yàn)相結(jié)合解決問題的能力。學(xué)習(xí)目標(biāo)3.素質(zhì)目標(biāo)(1)培養(yǎng)學(xué)生通過邏輯分析和推理解決問題的能力,鍛煉學(xué)生在復(fù)雜情境中做出正確判斷和決策的能力;(2)鼓勵(lì)學(xué)生在繪圖和交互設(shè)計(jì)方面的創(chuàng)新思維和獨(dú)特想法,培養(yǎng)學(xué)生將創(chuàng)意轉(zhuǎn)化為實(shí)際作品的能力;(3)培養(yǎng)學(xué)生在編程和調(diào)試過程中保持耐心和細(xì)心的品質(zhì),學(xué)會(huì)關(guān)注細(xì)節(jié),確保代碼的正確性和穩(wěn)定性;(4)培養(yǎng)學(xué)生在項(xiàng)目中學(xué)會(huì)與他人合作,共同完成任務(wù),培養(yǎng)學(xué)生在團(tuán)隊(duì)中溝通、協(xié)調(diào)和解決問題的能力。任務(wù)一繪制圖像任務(wù)導(dǎo)入OpenCV提供了豐富的繪圖函數(shù),可以實(shí)現(xiàn)繪制直線、矩形、圓、橢圓、多邊形等多種幾何圖形,具體步驟分為創(chuàng)建畫布、繪制圖形、展示圖形和保存圖像四個(gè)步驟。使用OpenCV提供的cv2.line()函數(shù)繪制三角形并將繪制的圖像保存。案例代碼1.#任務(wù)一

案例實(shí)現(xiàn)代碼

2.import

cv2

3.import

numpy

as

np

4.#

第一步:創(chuàng)建畫布

5.#

創(chuàng)建空白畫布,480*640

但是numpy是反著來的,img真實(shí)大小是640*480

6.img

=np.zeros((480,

640,

3),

dtype=np.uint8)

7.#

第二步:繪制圖形

8.#

三角形左上角斜線

9.cv2.line(img,(200,

0),(100,100),(0,0,255),3)

10.#

三角形右上角斜線,

11.cv2.line(img,(200,0),(300,

100),(0,

0,

255),3)

12.#

三角形下方斜線

13.cv2.line(img,(100,100),(300,100),(0,0,255),3)

14.#第三步:顯示圖像

15.cv2.imshow('line',

img)

16.cv2.waitKey()

17.#

第四步:保存圖像

18.cv2.imwrite('triangle.jpg',

img)

案例結(jié)果繪制三角形實(shí)驗(yàn)結(jié)果知識(shí)拆解1.創(chuàng)建畫布(1)創(chuàng)建方法img=np.zeros((480,600,3),dtype=np.uint8)。(2)具體作用使用np.zeros()函數(shù)創(chuàng)建了一個(gè)形狀為(480,600,3)的零數(shù)組,表示畫布的寬度、高度和通道數(shù)??梢耘浜鲜褂胏v2.imshow()函數(shù)顯示畫布。知識(shí)拆解1.創(chuàng)建畫布(3)代碼示例importcv2importnumpyasnp#創(chuàng)建一張空白的畫布canvas=np.zeros((500,500,3),dtype=np.uint8)#顯示畫布cv2.imshow('Canvas',canvas)cv2.waitKey(0)cv2.destroyAllWindows()知識(shí)拆解1.創(chuàng)建畫布(4)知識(shí)運(yùn)用創(chuàng)建一個(gè)空白,寬度為400,高度為600的白色圖像作為畫布。1.#任務(wù)一

創(chuàng)建畫布知識(shí)運(yùn)用案例實(shí)現(xiàn)代碼

2.import

cv2

3.import

numpy

as

np

4.#

創(chuàng)建空白白色畫布,

5.img

=np.ones((400,

600,

3),

dtype=np.uint8)

6.img=img*255

7.cv2.imshow('img',

img)

8.cv2.waitKey()

知識(shí)拆解2.繪制圖形函數(shù)OpenCV提供了多個(gè)圖形函數(shù),這些繪圖函數(shù)有一些共有的參數(shù),主要用于設(shè)置源圖像、顏色、線條屬性等,具體函數(shù)列表如表8-1所示:表8-1OpenCV繪圖函數(shù)知識(shí)拆解2.繪制圖形函數(shù)(1)各個(gè)函數(shù)式中共有的參數(shù)img:在其上面繪制圖形的載體圖像(繪圖的容器載體,也稱為畫布、畫板)。color:繪制形狀的顏色。通常使用BGR模型表示顏色,例如,(0,255,0)表示綠色。對(duì)于灰度圖像,只能傳入灰度值。需要注意,顏色通道的順序是BGR,而不是RGB.thickness:線條的粗細(xì)。默認(rèn)值是1,如果設(shè)置為-1,表示填充圖形。shift:數(shù)據(jù)精度。該參數(shù)用來控制數(shù)值精度(例如圓心坐標(biāo)等),一般情況下不需要設(shè)置。lineType:線條的類型,默認(rèn)是8連接類型。lineType參數(shù)的值及說明如表8-2所示:知識(shí)拆解2.繪制圖形函數(shù)(2)繪制直線函數(shù):cv2.line()作用:cv2.line()用來繪制直線(線段)。語法格式:cv2.line(img,pt1,pt2,color[,thickness[,lineType]])pt1表示線段的第1個(gè)點(diǎn)(起點(diǎn))。pt2表示線段的第2個(gè)點(diǎn)(終點(diǎn))。代碼示例:cv2.line(img,(0,0),(500,500),(0,0,255),3)繪制起點(diǎn)為(0,0),終點(diǎn)為(500,500)紅色線段,線條的粗細(xì)為3。知識(shí)拆解2.繪制圖形函數(shù)(2)繪制直線函數(shù):cv2.line()知識(shí)運(yùn)用:使用cv2.line()函數(shù)繪制田字。案例代碼1.#任務(wù)一

#繪制直線函數(shù)知識(shí)運(yùn)用案例實(shí)現(xiàn)代碼

2.import

cv2

3.import

numpy

as

np

4.#

第一步:創(chuàng)建畫布

5.image

=

np.zeros((600,

600,

3),

np.uint8)

6.#

第二步:繪制三條水平線段

7.cv2.line(image,

(200,

200),

(400,200),

(255,

255,

255),

4)

8.cv2.line(image,

(200,

300),

(400,300),

(255,

255,

255),

4)

9.cv2.line(image,

(200,

400),

(400,400),

(255,

255,

255),

4)

10.#

第三步:繪制三條

垂直線段

11.cv2.line(image,

(200,

200),

(200,400),

(255,

255,

255),

4)

12.cv2.line(image,

(300,

200),

(300,400),

(255,

255,

255),

4)

13.cv2.line(image,

(400,

200),

(400,400),

(255,

255,

255),

4)

14.

#

第四步:顯示圖像15.cv2.imshow("Image",

image)

16.cv2.waitKey(0)

17.cv2.destroyAllWindows()

知識(shí)拆解2.繪制圖形函數(shù)(2)繪制直線函數(shù):cv2.line()知識(shí)運(yùn)用:使用cv2.line()函數(shù)繪制田字。

繪制田實(shí)驗(yàn)結(jié)果知識(shí)拆解2.繪制圖形函數(shù)(3)繪制矩形函數(shù):cv2.rectangle()作用:cv2.rectangle()用來繪制矩形。語法格式:cv2.rectangle(img,pt1,pt2,color[,thickness[,lineType]])ptl為矩形頂點(diǎn)。pt2為矩形中與pt1對(duì)角的頂點(diǎn)。代碼示例:cv2.rectangle(image,(80,80),(120,120),(255,0,0),thickness=5)繪制左上角為(120,120),右下角為(120,120)藍(lán)色線條,線條粗細(xì)為5的矩形。

知識(shí)拆解2.繪制圖形函數(shù)(3)繪制矩形函數(shù):cv2.rectangle()知識(shí)運(yùn)用:用心付出,終有回報(bào),只要夠努力,一定會(huì)站上領(lǐng)獎(jiǎng)臺(tái)上。使用cv2.rectangle函數(shù)繪制領(lǐng)獎(jiǎng)臺(tái)造型。案例代碼1.#任務(wù)一

#繪制矩形函數(shù)知識(shí)運(yùn)用案例實(shí)現(xiàn)代碼

2.import

cv2

3.import

numpy

as

np

4.#

第一步:創(chuàng)建空白白色畫布,

5.image

=np.ones((500,

550,

3),

dtype=np.uint8)

6.image=image*255

7.#

第二步:繪制三個(gè)不等高、等寬的填充矩形,構(gòu)造出領(lǐng)獎(jiǎng)臺(tái)造型

繪制領(lǐng)獎(jiǎng)臺(tái)實(shí)驗(yàn)結(jié)果知識(shí)拆解2.繪制圖形函數(shù)(3)繪制矩形函數(shù):cv2.rectangle()知識(shí)運(yùn)用:用心付出,終有回報(bào),只要夠努力,一定會(huì)站上領(lǐng)獎(jiǎng)臺(tái)上。使用cv2.rectangle函數(shù)繪制領(lǐng)獎(jiǎng)臺(tái)造型。案例代碼8.cv2.rectangle(image,

(50,

200),

(200,

400),(0,255,255),

thickness=-1)

9.cv2.rectangle(image,

(200,

100),

(350,

400),(0,0,255),

thickness=-1)

10.cv2.rectangle(image,

(350,

250),

(500,

400),(255,0,0),

thickness=-1)

11.

#

第三步:顯示圖像12.cv2.imshow("Image",

image)

13.cv2.waitKey(0)

14.cv2.destroyAllWindows()

知識(shí)拆解2.繪制圖形函數(shù)(4)繪制圓形函數(shù):cv2.circle()作用:cv2.circle()用來繪制圓形。語法格式:cv2.circle(img,center,radius,color[,thickness[,lineType]])center為圓心。radius為半徑。代碼示例:cv2.circle(img,(256,256),100,(0,0,255),5),以(256,256)為圓心,繪制半徑為100,線寬為5的紅圓。線寬改為-1,為填充圓。知識(shí)拆解2.繪制圖形函數(shù)(4)繪制圓形函數(shù):cv2.circle()知識(shí)運(yùn)用:飛鏢靶子由多個(gè)同心圓組成,每個(gè)環(huán)的顏色不同。使用cv2.circle函數(shù)繪制彩色飛鏢靶子。1.#任務(wù)一#繪制圓形函數(shù)知識(shí)運(yùn)用案例實(shí)現(xiàn)代碼

2.importnumpyasnp3.importcv24.#第一步:創(chuàng)建空白白色畫布

5.d=3006.img=np.ones((d,d,3),dtype="uint8")*2557.#第二步,使用for循環(huán)由外向內(nèi)繪制10個(gè)彩色的同心圓,半徑依次遞減108.forrinrange(100,10,-10):飛鏢靶子實(shí)驗(yàn)結(jié)果知識(shí)拆解2.繪制圖形函數(shù)(4)繪制圓形函數(shù):cv2.circle()知識(shí)運(yùn)用:飛鏢靶子由多個(gè)同心圓組成,每個(gè)環(huán)的顏色不同。使用cv2.circle函數(shù)繪制彩色飛鏢靶子。9.#第三步

生成隨機(jī)顏色,3個(gè)[0,256]的隨機(jī)數(shù)

10.color=np.random.randint(0,high=256,size=(3,)).tolist()11.#第四步繪制圓

12.img=cv2.circle(img,(150,150),r,color,-1)13.cv2.imshow("circle",img)14.cv2.waitKey()15.cv2.destroyAllWindows()知識(shí)拆解2.繪制圖形函數(shù)(5)繪制橢圓函數(shù):cv2.ellipse()作用:cv2.ellipse()用來繪制橢圓,也可以繪制扇形。語法格式:cv2.ellipse(img,center,axes,angle,startAngle,endAngle,color[,thickness[,lineType]])center為橢圓的圓心坐標(biāo)。axes為軸的長度。angle為偏轉(zhuǎn)的角度。startAngle為圓弧起始角的角度。endAngle為圓弧終結(jié)角的角度。知識(shí)拆解2.繪制圖形函數(shù)(5)繪制橢圓函數(shù):cv2.ellipse()代碼示例:cv2.ellipse(img,(200,200),(100,50),60,0,360,(0,0,255),4),繪制圓心為(200,200),水平方向軸長為100,垂直方向軸長為50,偏轉(zhuǎn)角度為60度,圓弧起始角的角度為0度,圓弧終結(jié)角的角度為360度,顏色為紅色,線寬為4的橢圓。cv2.ellipse(img,(200,200),(50,100),60,0,180,(0,0,255),-1),繪制圓心為(200,200),水平方向軸長為50,垂直方向軸長為100,偏轉(zhuǎn)角度為60度,圓弧起始角的角度為0度,圓弧終結(jié)角的角度為180度,顏色為紅色,填充橢圓。知識(shí)拆解2.繪制圖形函數(shù)(5)繪制橢圓函數(shù):cv2.ellipse()知識(shí)運(yùn)用:花朵使人心情愉悅,使用cv2.ellipse函數(shù)繪制花朵,6片紅色花瓣,6根黃色花蕊。1.#任務(wù)一

#繪制橢圓函數(shù)知識(shí)運(yùn)用案例實(shí)現(xiàn)代碼

2.import

cv2

as

cv

3.import

numpy

as

np

4.

#

第一步:創(chuàng)建一張畫布

5.img

=

np.zeros((1000,

1000,

3),

np.uint8)

6.#

第二步:給畫布填充顏色

7.img.fill(255)

8.#第三步:使用橢圓繪制紅色花瓣,6個(gè)半橢圓,依次旋轉(zhuǎn)60度

9.for

angle

in

range(0,360,60):

知識(shí)拆解2.繪制圖形函數(shù)(5)繪制橢圓函數(shù):cv2.ellipse()知識(shí)運(yùn)用:花朵使人心情愉悅,使用cv2.ellipse函數(shù)繪制花朵,6片紅色花瓣,6根黃色花蕊。10.

cv.ellipse(img,

(500,

500),

(100,

300),

angle,

0,

180,

(0,

0,

255),

-1)

11.#第四步:使用橢圓繪制黃色花蕊,6個(gè)半橢圓,依次旋轉(zhuǎn)60度

12.for

angle

in

range(0,360,60):

13.

cv.ellipse(img,

(500,

500),

(5,

70),

angle,

0,

180,

(0,

255,

255),-1)

14.dWindow('flower',

cv.WINDOW_NORMAL)

15.#第五步:顯示圖像16.cv.imshow('flower',

img)

17.cv.imwrite('flower.png',

img)

18.cv.waitKey(0)

19.cv.destroyAllWindows()

知識(shí)拆解2.繪制圖形函數(shù)(5)繪制橢圓函數(shù):cv2.ellipse()知識(shí)運(yùn)用:花朵使人心情愉悅,使用cv2.ellipse函數(shù)繪制花朵,6片紅色花瓣,6根黃色花蕊。繪制花朵實(shí)驗(yàn)結(jié)果知識(shí)拆解2.繪制圖形函數(shù)(6)繪制多邊形函數(shù):cv2.polylines()作用:cv2.polylines()用來繪制多邊形。語法格式:cv2.polylines(img,pts,isClosed,color[,thickness[,lineType[,shift]]])pts為包含一個(gè)三元組元素的列表,包含了多邊形的各個(gè)頂點(diǎn)。isClosed為閉合標(biāo)記,用來指示多邊形是否是封閉的。若該值為True,則將最后一個(gè)點(diǎn)與第一個(gè)點(diǎn)連接,讓多邊形閉合;否則,僅僅將各個(gè)點(diǎn)依次連接起來,構(gòu)成一條曲線。在使用函數(shù)cv2.polylines()繪制多邊形時(shí),需要給出每個(gè)頂點(diǎn)的坐標(biāo)。這些點(diǎn)的坐標(biāo)構(gòu)建了一個(gè)大小等于“頂點(diǎn)個(gè)數(shù)*1*2”的數(shù)組,這個(gè)數(shù)組的數(shù)據(jù)類型必須為32。知識(shí)拆解2.繪制圖形函數(shù)(6)繪制多邊形函數(shù):cv2.polylines()代碼示例:pts=np.array([[10,50],[100,50],[100,100],[10,100]])pts=pts.reshape((-1,1,2))cv2.polylines(img,[pts],True,(0,255,0),3)繪制多邊形,多邊形的邊數(shù)根據(jù)pts的頂點(diǎn)數(shù)確定。代碼示例繪制一個(gè)閉合的四邊形,顏色為綠色,線條粗細(xì)為3。知識(shí)拆解2.繪制圖形函數(shù)(6)繪制多邊形函數(shù):cv2.polylines()知識(shí)運(yùn)用:五角星具有“勝利”的含義,被很多國家的軍隊(duì)作為軍官(尤其是高級(jí)軍官)的軍銜標(biāo)志使用。也常常運(yùn)用在旗幟上,我國的國旗就是五星紅旗。使用cv2.polylines函數(shù)繪制五角星。1.#任務(wù)一

#繪制多邊形函數(shù)知識(shí)運(yùn)用案例實(shí)現(xiàn)代碼

2.import

cv2

3.import

numpy

as

np

4.#第一步:創(chuàng)建白色畫布

5.img

=

np.ones((512,512,3))

6.#第二步:設(shè)置圖形顏色

7.color=(0,0,255)

繪制五角星實(shí)驗(yàn)結(jié)果知識(shí)拆解2.繪制圖形函數(shù)(6)繪制多邊形函數(shù):cv2.polylines()知識(shí)運(yùn)用:五角星具有“勝利”的含義,被很多國家的軍隊(duì)作為軍官(尤其是高級(jí)軍官)的軍銜標(biāo)志使用。也常常運(yùn)用在旗幟上,我國的國旗就是五星紅旗。使用cv2.polylines函數(shù)繪制五角星。8.#第三步:設(shè)置五角星的十個(gè)頂點(diǎn)

9.pts

=

np.array([[70,190],[222,190],[280,61],[330,190],[467,190],

10.

[358,260],[392,380],[280,308],[138,380],[195,260]])

11.#第四步:使用reshape函數(shù),將頂點(diǎn)數(shù)組轉(zhuǎn)換為為10x1x2的numpy中的

ndarray

12.pts

=

pts.reshape((-1,1,2))

13.#第五步:繪制五角星

14.cv2.polylines(img,[pts],True,color,5)

15.cv2.imshow('star',img)

16.cv2.waitKey()

知識(shí)拆解2.繪制圖形函數(shù)(6)繪制多邊形函數(shù):cv2.polylines()#五角星的頂點(diǎn)坐標(biāo)如何確定?#外點(diǎn),R外接圓半徑x=R*cos(72°*k)y=R*sin(72°*k)k=0,1,2,3,4#內(nèi)點(diǎn)r=R*sin18°/sin36°x=r*cos(72°*k+36°)y=r*sin(72°*k+36°)k=0,1,2,3,4知識(shí)拆解2.繪制圖形函數(shù)(7)繪制文字函數(shù):cv2.putText()作用:cv2.putText()用于在圖形上繪制文字。語法格式:cv2.putText(img,text,org,fontFace,fontScale,color[,thickness[,lineType[,bottomLeftOrigin]]])text為要繪制的字體。org為繪制字體的位置,以文字的左下角為起點(diǎn)。fontScale表示字體大小。botomlefOrigin用于控制文字的方向。默認(rèn)值為False,當(dāng)設(shè)置為True時(shí),文字是垂直鏡像的效果。fontFace表示字體類型,其參數(shù)類型及含義如表8-3所示:知識(shí)拆解2.繪制圖形函數(shù)(7)繪制文字函數(shù):cv2.putText()代碼示例:cv2.putText(img,'IloveChina',(100,100),cv2.FONT_HERSHEY_COMPLEX,3,(128,128,128),2,cv2.LINE_AA),在img圖像上添加文字,文字內(nèi)容為IloveChina,文字左下角位置為(100,100),字體為正常大小的serif字體,字體大小為3,顏色為(128,128,128),字體線條粗細(xì)為2,線條的類型抗鋸齒。知識(shí)拆解2.繪制圖形函數(shù)(7)繪制文字函數(shù):cv2.putText()知識(shí)運(yùn)用:在圖片上添加說明,可以增加圖片的可讀性,請(qǐng)?jiān)诮o點(diǎn)的圖片上添加文字“IloveChina”,字體、字號(hào)、文字顏色、字體線條粗細(xì)等參數(shù)自定義。1.#任務(wù)一

繪制文字案例實(shí)現(xiàn)

2.import

cv2

3.#第一步:定義添加文字內(nèi)容

4.text="I

LOVE

CHINA"

5.#第二步:加載地圖

6.img=cv2.imread("sea.png")

7.#第三步:在添加文字

8.cv2.putText(img,text,(500,300),cv2.FONT_HERSHEY_SIMPLEX,0.75,(0,0,255),2)

9.#第四步:顯示圖像10.dWindow("img")

11.cv2.imshow("img",img)

12.while

True:

13.

cv2.imshow("img",img)

14.

if

cv2.waitKey(1)

&

0xFF

==

ord('q'):

#

按q鍵退出

15.

break

cv2.destroyAllWindows()

知識(shí)拆解2.繪制圖形函數(shù)(7)繪制文字函數(shù):cv2.putText()知識(shí)運(yùn)用:在圖片上添加說明,可以增加圖片的可讀性,請(qǐng)?jiān)诮o點(diǎn)的圖片上添加文字“IloveChina”,字體、字號(hào)、文字顏色、字體線條粗細(xì)等參數(shù)自定義。添加文字實(shí)驗(yàn)結(jié)果任務(wù)小結(jié)

繪制圖形函數(shù)創(chuàng)建畫布創(chuàng)建方法;具體作用;代碼示例;知識(shí)運(yùn)用。各個(gè)函數(shù)式中共有的參數(shù);繪制直線函數(shù):cv2.line();繪制矩形函數(shù):cv2.rectangle();繪制圓形函數(shù):cv2.circle();繪制橢圓函數(shù):cv2.ellipse();繪制多邊形函數(shù):cv2.polylines();繪制文字函數(shù):cv2.putText()。任務(wù)一

繪制圖像任務(wù)二鼠標(biāo)交互操作任務(wù)導(dǎo)入在OpenCV中,可以使用cv2.setMouseCallback函數(shù)來設(shè)置鼠標(biāo)回調(diào)函數(shù),監(jiān)聽鼠標(biāo)的各種事件,實(shí)現(xiàn)鼠標(biāo)與圖像交互。編寫代碼實(shí)現(xiàn)點(diǎn)擊鼠標(biāo)時(shí),輸出鼠標(biāo)對(duì)應(yīng)的操作和坐標(biāo)信息。案例代碼1.#任務(wù)二案例導(dǎo)入代碼實(shí)現(xiàn)

2.import

cv2

3.import

numpy

as

np

4.dWindow('show')

5.#第一步:定義函數(shù)

6.def

mouse_event(event,x,y,flags,para,):

7.

if

event

==

cv2.EVENT_LBUTTONDOWN:

8.

print("鼠標(biāo)左鍵按下,坐標(biāo)為:%s

%s"%(x,y))

9.

if

event

==

cv2.EVENT_LBUTTONUP:

10.

print("鼠標(biāo)左鍵抬起,坐標(biāo)為:%s

%s"

%

(x,

y))

11.

if

event

==

cv2.EVENT_LBUTTONDBLCLK:

12.

print("鼠標(biāo)左鍵雙擊,坐標(biāo)為:%s

%s"

%

(x,

y))

13.

if

event

==

cv2.EVENT_FLAG_LBUTTON:

14.

print("鼠標(biāo)左鍵拖拽,坐標(biāo)為:%s

%s"

%

(x,

y))

案例代碼

15.img

=

np.zeros((600,600,4),np.uint8)

16.cv2.imshow('show',img)

17.#第二步:回調(diào)函數(shù)

18.cv2.setMouseCallback('show',mouse_event)

19.cv2.waitKey()

20.cv2.destroyAllWindows()

鼠標(biāo)交互實(shí)驗(yàn)結(jié)果知識(shí)拆解1.鼠標(biāo)事件類型(event類型)在OpenCV中,通過設(shè)置鼠標(biāo)回調(diào)函數(shù)可以處理各種鼠標(biāo)事件,常見的鼠標(biāo)事件類型如表8-4所示:表8-4常用鼠標(biāo)事件值

含義值cv2.EVENT_LBUTTONDBLCLK雙擊左鍵7cv2.EVENT_LBUTTONDOWN按下左鍵1cv2.EVEN_LBUTTONUP抬起左鍵4cv2.EVENT_MBUTTONDBLCLK雙擊中間鍵9cv2.EVENT_MBUTTONDOWN按下中間鍵3cv2.EVENT_MBUTTONUP抬起中間鍵6cv2.EVENT_MOUSEWHEEL鼠標(biāo)滾輪滾動(dòng)10cv2.EVENT_MOUSEHWHEEL鼠標(biāo)滾輪橫向滾輪滾動(dòng)11cv2.EVENT_MOUSEMOVE鼠標(biāo)移動(dòng)0cv2.EVENT_RBUTTONDOWN右鍵按下2cv2.EVENT_RBUTTONDBLCLK右鍵雙擊8cv2.EVENT_RBUTTONUP右鍵釋放5知識(shí)拆解2.鼠標(biāo)事件標(biāo)志(flags)通過設(shè)置鼠標(biāo)回調(diào)函數(shù),可以根據(jù)這些事件類型和標(biāo)志來執(zhí)行相應(yīng)的操作,常見的鼠標(biāo)標(biāo)志及含義如表8-5所示:表8-5常見的鼠標(biāo)標(biāo)志及含義值含義值cv2.EVENT_FLAG_ALTKEY按下Alt鍵32cv2.EVENT_FLAG_CTRLKEY按下Ctrl鍵8cv2.EVENT_FLAG_LBUTTON左鍵按下1cv2.EVENT_FLAG_MBUTTON中間鍵按下4cv2.EVENT_FLAG_RBUTTON右鍵按下2cv2.EVENT_FLAG_SHIFTKEY按下Shift鍵16知識(shí)拆解3.OnMouseAction()響應(yīng)函數(shù)當(dāng)用戶觸發(fā)鼠標(biāo)事件時(shí),我們希望對(duì)該事件做出響應(yīng)。例如,用戶單擊鼠標(biāo),我們就畫一個(gè)圓。通常的做法是,創(chuàng)建一個(gè)OnMouseAction()響應(yīng)函數(shù),將要實(shí)現(xiàn)的操作寫在該響應(yīng)函數(shù)內(nèi)。響應(yīng)函數(shù)是按照固定的格式創(chuàng)建的,其格式為:defOnMouseAction(event,x,y,flags,param):參數(shù)說明:event表示觸發(fā)了何種事件。x,y代表觸發(fā)鼠標(biāo)事件時(shí),鼠標(biāo)在窗口中的坐標(biāo)(x,y)。param為函數(shù)ID,標(biāo)識(shí)所響應(yīng)的事件函數(shù),相當(dāng)于自定義-一個(gè)OnMouseAction0函數(shù)的ID。flags代表鼠標(biāo)的拖曳事件,以及鍵盤鼠標(biāo)聯(lián)合事件。備注:OnMouseAction為響應(yīng)函數(shù)的名稱,該名稱可以自定義。創(chuàng)建方法:draw_circle(event,x,y,flags,param),創(chuàng)建一個(gè)名為draw_circle的響應(yīng)函數(shù)。知識(shí)拆解4.cv2.setMouseCallback()回調(diào)函數(shù)定義響應(yīng)函數(shù)以后,要將該函數(shù)與一個(gè)特定的窗口建立聯(lián)系(綁定),讓該窗口內(nèi)的鼠標(biāo)觸發(fā)事件時(shí),能夠找到該響應(yīng)函數(shù)并執(zhí)行。要將函數(shù)與窗口綁定,可以通過回調(diào)函數(shù)cv2.setMouseCallback()實(shí)現(xiàn)。語法格式:cv2.setMouseCallback(winname,onMouse)參數(shù)說明:winname為綁定的窗口名。onMouse為綁定的響應(yīng)函數(shù)名。創(chuàng)建方法:cv.setMouseCallback('img',draw_circle),調(diào)用名為draw_circle的函數(shù)。知識(shí)拆解4.cv2.setMouseCallback()回調(diào)函數(shù)知識(shí)運(yùn)用:案例一:生活中有很多事情存在著不確定性,編寫代碼,實(shí)現(xiàn)雙擊鼠標(biāo)繪制隨機(jī)大小和顏色的圓。1.#任務(wù)二

知識(shí)運(yùn)用

繪制隨機(jī)大小和顏色的圓案例代碼實(shí)現(xiàn)

2.import

cv2

3.import

numpy

as

np

4.import

random

5.#

第一步:定義繪制圓形函數(shù)

6.def

draw_circle(event,

x,

y,

flags,

param):

7.

#

鼠標(biāo)左鍵雙擊

8.

if

event

==

cv2.EVENT_LBUTTONDBLCLK:

9.

#

每次點(diǎn)擊,都是一種

新顏色

10.

size=random.randint(10,

100)

11.

r

=

random.randint(0,

255)

12.

g

=

random.randint(0,

255)

繪制隨機(jī)圓實(shí)驗(yàn)結(jié)果知識(shí)拆解4.cv2.setMouseCallback()回調(diào)函數(shù)知識(shí)運(yùn)用:案例一:生活中有很多事情存在著不確定性,編寫代碼,實(shí)現(xiàn)雙擊鼠標(biāo)繪制隨機(jī)大小和顏色的圓。13.

b

=

random.randint(0,

255)

14.

cv2.circle(img,

(x,

y),

size,

(b,

g,

r),

-1)

15.img

=

np.zeros((600,

1000,

3),

np.uint8)

16.dWindow('draw

circles')

17.#

第二步:回調(diào)繪制圓形函數(shù)

18.cv2.setMouseCallback('draw

circles',

draw_circle)

19.while

True:

20.

#

每次鼠標(biāo)點(diǎn)擊事件都會(huì)觸發(fā)draw_circle,而函數(shù)體內(nèi)會(huì)改變img

21.

cv2.imshow('draw

circles',

img)

22.

if

cv2.waitKey(1)

&

0xFF

==

ord('q'):

#

按q鍵退出

23.

break

24.cv2.destroyAllWindows()

知識(shí)拆解4.cv2.setMouseCallback()回調(diào)函數(shù)知識(shí)運(yùn)用:案例二:編寫代碼,實(shí)現(xiàn)單擊鼠標(biāo)左鍵輸出文字“ILOVECHINA”,單擊鼠標(biāo)右鍵輸出文字“Comeon”,字體數(shù)字隨機(jī)設(shè)置。1.#任務(wù)二

知識(shí)運(yùn)用

單擊鼠標(biāo)左鍵輸出文字“I

LOVE

CHINA”,單擊鼠標(biāo)右鍵輸出文字“Come

on”案例代碼實(shí)現(xiàn)

2.import

cv2

3.#第一步:定義onMouse函數(shù),實(shí)現(xiàn)繪制文字

4.def

onMouse(event,x,y,flag,params):

5.

text="I

LOVE

CHINA"

6.

text1="come

on"

7.

#鼠標(biāo)左鍵按下,I

LOVE

CHINA

8.

if

event==cv2.EVENT_LBUTTONDOWN:

9.

cv2.circle(img,(x,y),radius=5,color=(255,255,0),thickness=-1)

10.

#圖片、文字、位置、類型、大小、字顏色、粗細(xì)

11.

cv2.putText(img,text,(x,y),cv2.FONT_HERSHEY_SIMPLEX,0.75,(0,0,255),2)

12.

#鼠標(biāo)右鍵按下,come

on

鼠標(biāo)交互實(shí)驗(yàn)結(jié)果知識(shí)拆解4.cv2.setMouseCallback()回調(diào)函數(shù)知識(shí)運(yùn)用:案例二:編寫代碼,實(shí)現(xiàn)單擊鼠標(biāo)左鍵輸出文字“ILOVECHINA”,單擊鼠標(biāo)右鍵輸出文字“Comeon”,字體數(shù)字隨機(jī)設(shè)置。13.

if

event==cv2.EVENT_RBUTTONDOWN:

14.

cv2.circle(img,(x,y),radius=5,color=(0,0,255),thickness=-1)

15.

#圖片、文字、位置、類型、大小、字顏色、粗細(xì)

16.

cv2.putText(img,text1,(x,y),cv2.FONT_HERSHEY_SIMPLEX,0.75,(255,0,255),2)

17.img=cv2.imread("hill.png")

18.dWindow("img")

19.#第二步:回調(diào)onMouse函數(shù)

20.cv2.setMouseCallback('img',onMouse)

21.cv2.imshow("img",img)

22.while

True:

23.

cv2.imshow("img",img)

24.

if

cv2.waitKey(1)

&

0xFF

==

ord('q'):

#

按q鍵退出

25.

break

26.cv2.destroyAllWindows()

任務(wù)小結(jié)

鼠標(biāo)事件標(biāo)志(flags)鼠標(biāo)事件類型(event類型)常用鼠標(biāo)事件。常見的鼠標(biāo)標(biāo)志及含義。任務(wù)二

鼠標(biāo)交互操作

OnMouseAction()響應(yīng)函數(shù)cv2.setMouseCallback()回調(diào)函數(shù)格式;參數(shù)說明;創(chuàng)建方法。格式;參數(shù)說明;創(chuàng)建方法;知識(shí)運(yùn)用:繪制隨機(jī)大小和顏色的圓、隨機(jī)文字。任務(wù)三鍵盤交互操作任務(wù)導(dǎo)入OpenCV不僅支持強(qiáng)大的圖像處理功能,還提供了靈活的鍵盤交互功能,使得用戶能夠通過鍵盤來控制圖像的顯示和處理。編寫代碼實(shí)現(xiàn)通過鍵盤按下事件來實(shí)現(xiàn)圖像的放大和縮小。案例代碼1.#任務(wù)三

案例導(dǎo)入代碼實(shí)現(xiàn)

2.import

cv2

3.#第一步:編寫實(shí)現(xiàn)圖片放大縮小的函數(shù)img_resize

4.def

img_resize(factor):

5.

global

image

6.

height,

width

=

image.shape[:2]

7.

new_height

=

int(height

*

factor)

8.

new_width

=

int(width

*

factor)

9.

image

=

cv2.resize(image,

(new_width,

new_height))

10.

cv2.imshow("Image",

image)

11.#

第二步:讀取圖像

12.image

=

cv2.imread("horse.png")

13.#

第三步:創(chuàng)建圖像窗口

14.dWindow("Image")

15.cv2.imshow("Image",

image)

16.while

True:

17.

key

=

cv2.waitKey(0)

18.

if

key

==

ord('q'):

#

按下

'q'

鍵退出循環(huán)

19.

break

20.

elif

key

==

ord('+'):

#

按下

'+'

鍵放大圖像

21.

img_resize(1.1)

22.

elif

key

==

ord('-'):

#

按下

'-'

鍵縮小圖像

23.

img_resize(0.9)

24.#

第四步:關(guān)閉窗口

25.cv2.destroyAllWindows()

案例代碼鍵盤交互實(shí)驗(yàn)結(jié)果知識(shí)拆解1.waitKey()函數(shù)waitKey()函數(shù)的功能是不斷刷新圖像,頻率時(shí)間為delay,單位為ms,該函數(shù)通常用在顯示圖像函數(shù)之后,返回值為當(dāng)前鍵盤按鍵值(ASCII碼)。語法格式:waitKey(delay)delay:等待時(shí)間(毫秒)作用:通過waitKey()可以獲取鍵盤輸入使用方法:cv2.waitKey(0),表示程序會(huì)無限制的等待用戶的按鍵事件;key=cv2.waitKey(1000)設(shè)置延時(shí)時(shí)間為1000ms,每隔1000ms延時(shí)時(shí)間便讀取鍵盤按鍵值,返回給cv2.waitkey()知識(shí)拆解2.ord()函數(shù)語法格式:ord(char)作用:返回char所對(duì)應(yīng)的十進(jìn)制整數(shù)ASCII數(shù)值,如ord(‘a(chǎn)’)返回97,ord(‘A’)返回65。知識(shí)運(yùn)用:a.圖像的顯示模式有多種,編寫代碼,實(shí)現(xiàn)按ESC退出程序、按1顯示HSV圖像、按2顯示YCrCb圖像、按3顯示RGB圖像、按0恢復(fù)原圖BGR顯示。知識(shí)拆解2.ord()函數(shù)知識(shí)運(yùn)用:a.圖像的顯示模式有多種,編寫代碼,實(shí)現(xiàn)按ESC退出程序、按1顯示HSV圖像、按2顯示YCrCb圖像、按3顯示RGB圖像、按0恢復(fù)原圖BGR顯示。1.#任務(wù)三

知識(shí)運(yùn)用代碼實(shí)現(xiàn)

2.import

cv2

as

cv

3.#第一步:讀入圖像4.image

=

cv.imread("sea.png")

5.dWindow("keyboard_sea",

cv.WINDOW_AUTOSIZE)

6.#第二步:顯示圖像7.cv.imshow("keyboard_sea",

image)

8.while

True:

9.

#

等待10ms

10.

c

=

cv.waitKey(10)

11.

#

按ESC鍵退出

12.

if

c

==

27:

知識(shí)拆解2.ord()函數(shù)知識(shí)運(yùn)用:a.圖像的顯示模式有多種,編寫代碼,實(shí)現(xiàn)按ESC退出程序、按1顯示HSV圖像、按2顯示YCrCb圖像、按3顯示RGB圖像、按0恢復(fù)原圖BGR顯示。13.

break

14.

#按

0顯示原圖像

15.

elif

c

==

48:

16.

cv.imshow("keyboard_sea",

image)

17.

#

按1顯示圖像HSV模式

18.

elif

c

==

49:

19.

hsv

=

cv.cvtColor(image,

cv.COLOR_BGR2HSV)

20.

cv.imshow("keyboard_sea",

hsv)

21.

#

按2顯示圖像YCrCb模式

22.

elif

c

==

50:

23.

ycrcb

=

cv.cvtColor(image,

cv.COLOR_BGR2YCrCb)

24.

cv.imshow("keyboard_sea",

ycrcb)

知識(shí)拆解2.ord()函數(shù)知識(shí)運(yùn)用:a.圖像的顯示模式有多種,編寫代碼,實(shí)現(xiàn)按ESC退出程序、按1顯示HSV圖像、按2顯示YCrCb圖像、按3顯示RGB圖像、按0恢復(fù)原圖BGR顯示。25.

#

按3顯示圖像RGB模式

26.

elif

c

==

51:

27.

rgb

=

cv.cvtColor(image,

cv.COLOR_BGR2RGB)

28.

cv.imshow("keyboard_sea",

rgb)

29.

else:

30.

if

c

!=

-1:

31.

print("Key:

",

c,

"is

not

define.")

32.cv.waitKey(0)

33.cv.destroyAllWindows()

任務(wù)小結(jié)

ord()函數(shù)waitKey()函數(shù)任務(wù)三

鍵盤交互操作語法格式;作用;使用方法。語法格式;作用;知識(shí)運(yùn)用。任務(wù)四窗口交互操作任務(wù)導(dǎo)入滾動(dòng)條在OpenCV中是非常方便的交互工具,它依附于特定的窗口而存在。通過調(diào)節(jié)滾動(dòng)條能夠設(shè)置、獲取指定范圍內(nèi)的特定值,編寫代碼用滾動(dòng)條實(shí)現(xiàn)調(diào)色板。案例代碼滾動(dòng)條實(shí)驗(yàn)結(jié)果案例代碼1.#任務(wù)四

案例導(dǎo)入代碼實(shí)現(xiàn)

2.import

numpy

as

np

3.import

cv2

as

cv

4.def

nothing(x):

5.

pass

6.#

第一步:創(chuàng)建畫布

7.img

=

np.zeros((300,512,3),

np.uint8)

8.dWindow('image')

9.#第二步:

創(chuàng)建滾動(dòng)條

10.cv.createTrackbar('R','image',0,255,nothing)

11.cv.createTrackbar('G','image',0,255,nothing)

12.cv.createTrackbar('B','image',0,255,nothing)

13.while(1):

14.

cv.imshow('image',img)

15.

k

=

cv.waitKey(1)

16.

if

k

==

ord('q'):

17.

break

18.

#

第三步:獲取滾動(dòng)條值

19.

r

=

cv.getTrackbarPos('R','image')

20.

g

=

cv.getTrackbarPos('G','image')

21.

b

=

cv.getTrackbarPos('B','image')

22.

#第四步:使用滾動(dòng)條的值設(shè)置畫布背景顏色

23.

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論