
📢📢📢📣📣📣
🌻🌻🌻Hello,大家好我叫是Dream呀,一個有趣的Python博主,小白一枚,多多關照😜😜😜
🏅🏅🏅CSDN Python領域新星創作者,大二在讀,歡迎大家找我合作學習
💕入門須知:這片樂園從不缺乏天才,努力才是你的最終入場券!🚀🚀🚀
💓最后,愿我們都能在看不到的地方閃閃發光,一起加油進步🍺🍺🍺
🍉🍉🍉“一萬次悲傷,依然會有Dream,我一直在最溫暖的地方等你”,唱的就是我!哈哈哈~🌈🌈🌈
🌟🌟🌟???
Python OpenCV實戰——畫圖:
- 一、OpenCV實戰之畫圖
- 1.畫直線和矩形
- 1.1 畫直線
- 1.2 畫矩形
- 2 .畫圓形
- 二、滑鼠作為畫筆
- 1.滑鼠事件概述
- 2.滑鼠事件發生的結構
- 2.1event事件串列
- 2.2 flag串列
- 2.3代碼演示
- 3.實作一個滑鼠事件
- 3.1創建自定義滑鼠回呼函式
- 3.2在__main__部分里,實作回呼函式
- 3.3高逼格代碼
- 三、軌跡欄作為調色板
- 1.函式cv.getTrackbarPos()
- 2.函式 cv2.setTrackbarPos()
- 3.設定開關switch = '0 : OFF \n1 : ON'
- 📢📢📢最后的福利
前言:在上篇文章中我們已經介紹了Python OpenCV的詳細入門基礎知識 還看不懂Python OpenCV?不,我不允許!, 接下來讓我們利用OpenCV進行一次畫圖的實戰吧!
一、OpenCV實戰之畫圖
1.畫直線和矩形
首先定義一個畫布:
import numpy as np #1
import cv2 #2
canvas = np.zeros((300, 300, 3), dtype="uint8") #3
我們使用np.zeros()方法構造了一個300*300的NumPy陣列,同時分配了三個顏色空間,分別表示Red,Green,Blue,正如zeros名字所描述的一樣,這個方法用0填充了這個陣列的每一個元素,在np.zeros()的第二個變數是資料型別:dtype,由于我們需要用RGB格式來表示我們的影像,它的取值范圍是[0,255],所以我們用“uint8”就顯得至關重要了,如果不宣告的話np.zeros()默認的變數型別是float64.
1.1 畫直線
# 我們定義了一個元組來表示綠色
green = (0, 255, 0) #4
# 我們在canvas上畫了一條綠線從坐標(0,0)到(300,300),將結果顯示出來,并等待按下任意按鍵
cv2.line(canvas, (0, 0), (300, 300), green) #5
cv2.imshow("Canvas", canvas) #6
cv2.waitKey(0) #7
# 我們定義了一個元組來表示紅色,再次強調OpenCV是BGR模式而不是RGB模式
red = (0, 0, 255) #8
# 我們在canvas上畫了一條紅線從坐標(300,0)到(0,300),
#并且該線的線型為3個像素,這也是最后一個引數的含義,然后將結果顯示出來,并等待按下任意按鍵
cv2.line(canvas, (300, 0), (0, 300), red, 3) #9
cv2.imshow("Canvas", canvas) #10
cv2.waitKey(0) #11
cv2.line(canvas, (0, 0), (300, 300), green) 在canvas上畫了一條綠線從坐標(0,0)到(300,300)
運行效果:

1.2 畫矩形
我們使用了cv2.rectangle()方法,這個方法與cv2.line()方法用法是一樣的:
- 第一個引數表示我們想要在canvas這個畫布上進行畫圖,
- 第二個引數是我們矩形的開始點(10,10),
- 第三個引數是我們矩形的結束點(60,60),通過這兩個點我們定義了一個50*50像素大小的區域,
- 第四個引數是我們矩形邊框的顏色——綠色,然后將結果顯示出來,并等待按下任意按鍵,
- 當我們將最后一個設定線型的引數設定為“-1”,我們便可以得到一個填充的矩形,
cv2.rectangle(canvas, (10, 10), (60, 60), green) #12
cv2.imshow("Canvas", canvas) #13
cv2.waitKey(0) #14
# 在第15行代碼中,正如我們可以控制話直線的線型粗細程度,我們也可以控制畫矩形的線型粗細,
# 在這行代碼中最后一個引數“5”,則表示我們將在canvas上畫出一個邊框粗細為5個像素大小的起點為(50, 200),終點為 (200, 225)的紅色矩形,
# 然后將結果顯示出來,并等待按下任意按鍵,
cv2.rectangle(canvas, (50, 200), (200, 225), red, 5) #15
cv2.imshow("Canvas", canvas) #16
cv2.waitKey(0) #17
# 到目前為止,我們畫的都是圖形的邊框,如果我們想要填充這個邊框怎么辦呢?
# 在第19行代碼中:我們畫了一個起點為(200,50),終點為(225,125)的藍色矩形,
# 當我們將最后一個設定線型的引數設定為“-1”,我們便可以得到一個填充藍色的矩形,
blue = (255, 0, 0) #18
cv2.rectangle(canvas, (200, 50), (225, 125), blue, -1) #19
cv2.imshow("Canvas", canvas) #20
運行效果:

2 .畫圓形
通過cv2.circle()來進行畫圓:
- 第一個引數表示在canvas上進行繪畫,
- 第二個引數表示圓心,
- 第三個引數表示半徑,
- 第四個引數表示顏色
import numpy as np #1
import cv2 #2
# 畫圓形和畫直線和矩形是一樣容易的,但是它有有一些不同:
# 我們重新將我們的畫板變成一個白板
canvas = np.zeros((300, 300, 3), dtype="uint8") #22
# 我們定義并計算一個中心點的坐標(centerX,centerY),在第1節和第2節我們均提到過shape[0]表示圖片的高度,
# shape[1]表示圖片的寬度,分別取它們的一半,得到centerY,centerX
(centerX, centerY) = (canvas.shape[1] // 2, canvas.shape[0] // 2) #23
# 定義一個白色的像素
white = (255, 255, 255) # 24
for r in range(0, 175, 25): # 25 我們從[0,175)的范圍以跨度為25進行回圈來取圓的半徑
cv2.circle(canvas, (centerX, centerY), r, white) #26第26行通過cv2.circle()來進行畫圓,
# 第一個引數表示在canvas上進行繪畫,第二個引數表示圓心,第三個引數表示半徑,第四個引數表示顏色,然后將結果顯示出來,并等待按下任意按鍵,
cv2.imshow("Canvas", canvas)
cv2.waitKey(0) #28
運行效果:

二、滑鼠作為畫筆
1.滑鼠事件概述
opencv可以實作gui擁有的功能——所以,opencv中也包含了滑鼠事件——通過點擊等等事件,執行相應的回呼函式,實作指定的功能,最終實作互動!
2.滑鼠事件發生的結構
滑鼠回呼函式的構造:函式名任意——但是引數應依次包含:event(事件),x, y,flags(標志),param(其它引數)
- event:滑鼠事件,可用引數對應值代替
- x:滑鼠x坐標
- y:滑鼠y坐標
- flags:滑鼠狀態,可用引數對應值代替
- param:param是用戶定義的傳遞到setMouseCallback函式呼叫的引數 補充一下:事件和標志都可以作為事件觸發的條件
import cv2 as cv
import numpy as np
def mouse_circle(event, x, y, flags, param):
if event == cv.EVENT_LBUTTONDOWN: # 該事件為滑鼠左鍵按下
pass # 執行任務
2.1event事件串列
opencv下包含的所有事件——包含flag和event事件串列:
-
if event == cv.EVENT_LBUTTONDBLCLK: # 觸發事件為左鍵雙擊
-
if event ==cv.EVENT_LBUTTONDOWN: # 觸發事件為左鍵按下時
-
if event == cv.EVENT_LBUTTONUP: #觸發事件為左鍵彈起時
-
if event == cv.EVENT_RBUTTONDBLCLK: # 觸發事件為右鍵雙擊時
-
if event== cv.EVENT_RBUTTONDOWN: # 觸發事件為右鍵按下時
-
if event == cv.EVENT_RBUTTONUP: # 觸發事件為右鍵彈起時
-
if event == cv.EVENT_MBUTTONDBLCLK:# 觸發事件為中鍵滾輪雙擊時
-
if event == cv.EVENT_MBUTTONDOWN: # 觸發事件為中鍵滾輪按下時
-
if event == cv.EVENT_MBUTTONUP: # 觸發事件為中鍵滾輪彈起時
-
if event ==cv.EVENT_MOUSEWHEEL: # 觸發事件為中鍵滾輪滾動時
-
if event == cv.EVENT_MOUSEMOVE:# 觸發事件為滑鼠移動時
2.2 flag串列
- if flags == cv.EVENT_FLAG_ALTKEY: # 觸發標志為ALT鍵按下時
- if flags ==cv.EVENT_FLAG_CTRLKEY: # 觸發標志為CTRL鍵按下時
- if flags ==cv.EVENT_FLAG_LBUTTON: # 觸發標志為滑鼠左鍵按下時
- if flags ==cv.EVENT_FLAG_MBUTTON: # 觸發標志為滑鼠中鍵滾輪按下時
- if flags ==cv.EVENT_FLAG_RBUTTON: # 觸發標志為滑鼠右鍵按下時
- if flags ==cv.EVENT_FLAG_SHIFTKEY: # 觸發標志為SHIFT鍵按下時
2.3代碼演示
用滑鼠的回呼函式在我們雙擊的地方繪制一個圓圈:
import numpy as np
import cv2 as cv
# 滑鼠回呼函式
def draw_circle(event,x,y,flags,param):
if event == cv.EVENT_LBUTTONDBLCLK:
cv.circle(img,(x,y),100,(255,0,0),-1)
# 創建一個黑色的影像,一個視窗,并系結到視窗的功能
img = np.zeros((512,512,3), np.uint8)
cv.namedWindow('image')
cv.setMouseCallback('image',draw_circle)
while(1):
cv.imshow('image',img)
if cv.waitKey(20) & 0xFF == ord('q'):
break
cv.waitKey(0)
cv.destroyAllWindows()
效果展示:

3.實作一個滑鼠事件
3.1創建自定義滑鼠回呼函式
我們這里用到event——事件引數,當然,你可以修改它的名字
import cv2 as cv
import numpy as np
cv.setMouseCallback('imag', mouse_circle)
# 第一個引數為表單名稱——指的是哪個表單下執行
# 第二個引數為滑鼠回呼函式的名稱——傳入函式名稱,指的是傳入整個函式宣告,而不是直接執行函式
def mouse_circle(event, x, y, flags, param):
if event == cv.EVENT_LBUTTONDOWN: # 觸發事件為左鍵按下時
cv.rectangle(img, (x, y), (x+88, y+88), (174, 238, 238), -1) # 畫一個88*88的GhostWhite(顏色)矩形
3.2在__main__部分里,實作回呼函式
需要先創建一張照片(影像),接著創建一個表單——然后把后邊涉及的相關表單放在同一個表單下!!!(回呼函式的實作也是掛在同一個表單下的哦,要一一對應)
if __name__ == "__main__":
img = np.zeros((512, 512, 3), np.uint8)
cv.namedWindow('imag', cv.WINDOW_NORMAL) # 創建一個可改變大小的表單
cv.resizeWindow('imag', 510, 510) # 大小設定
cv.setMouseCallback('imag', mouse_circle) # 實作滑鼠回呼函式到imag的表單
while True:
cv.imshow('imag', img)
k = cv.waitKey(10) & 0xFF # 讀取按鍵
if k == ord('q') or k == ord('Q'): # 結束繪制
break
cv.destroyAllWindows()
效果演示:

3.3高逼格代碼
現在實作一個更高級的應用,類似畫圖工具一樣,要么畫圓,要么畫矩形,依照選擇的模式來實作,所以滑鼠回呼函式有兩部分,一個用來畫矩形,一個用來畫圓,這個例子灰常有用,尤其是在互動式應用像是目標追蹤和影像分割,
ps(有時間我一定看)
import numpy as np
import cv2
drawing = False #滑鼠按下為真
mode = True #如果為真,畫矩形,按m切換為曲線
ix,iy=-1,-1
def draw_circle(event,x,y,flags,param):
global ix,iy,drawing,mode
if event == cv2.EVENT_LBUTTONDOWN:
drawing = True
ix,iy=x,y
elif event == cv2.EVENT_MOUSEMOVE:
if drawing == True:
if mode == True:
cv2.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)
else:
cv2.circle(img,(x,y),5,(0,0,255),-1)
elif event == cv2.EVENT_LBUTTONUP:
drawing = False
if mode == True:
cv2.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)
else:
cv2.circle(img,(x,y),5,(0,0,255),-1)
img = np.zeros((512,512,3),np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image',draw_circle)
while(1):
cv2.imshow('image',img)
k = cv2.waitKey(1) & 0xFF
if k == ord('m') :
mode = not mode
elif k == 27:
break
cv2.destroyAllWindows()
效果展示:

三、軌跡欄作為調色板
將創建一個簡單的應用程式,以顯示您指定的顏色,您有一個顯示顏色的視窗,以及三個用于指定B、G、R顏色的跟蹤欄,滑動軌跡欄,并相應地更改視窗顏色,默認情況下,初始顏色將設定為黑色,
1.函式cv.getTrackbarPos()
功能: 得到滑動條的數值
- 第一個引數是軌跡欄名稱,
- 第二個引數是它附加到的視窗名稱,
- 第三個引數是默認值,
- 第四個引數是最大值,
- 第五個是執行的回呼函式每次跟蹤欄值更改,
- 回呼函式始終具有默認引數,即軌跡欄位置,
2.函式 cv2.setTrackbarPos()
功能:
設定滑動條的默認值
引數:
- 第一個引數是滑動條名字,
- 第二個時所在視窗,
- 第三個引數是滑動條默認值,
3.設定開關switch = ‘0 : OFF \n1 : ON’
創建了一個開關,只有在該開關為ON的情況下,該應用程式才能在其中運行,否則螢屏始終為黑色,
import numpy as np
import cv2 as cv
def nothing(x):
pass
# 創建一個黑色的影像,一個視窗
img = np.zeros((300,512,3), np.uint8)
cv.namedWindow('image')
# 創建顏色變化的軌跡欄
cv.createTrackbar('R','image',0,255,nothing)
cv.createTrackbar('G','image',0,255,nothing)
cv.createTrackbar('B','image',0,255,nothing)
# 為 ON/OFF 功能創建開關
switch = '0 : OFF \n1 : ON'
cv.createTrackbar(switch, 'image',0,1,nothing)
while(1):
cv.imshow('image',img)
k = cv.waitKey(1) & 0xFF
if k == 27:
break
# 得到四條軌跡的當前位置
r = cv.getTrackbarPos('R','image')
g = cv.getTrackbarPos('G','image')
b = cv.getTrackbarPos('B','image')
s = cv.getTrackbarPos(switch,'image')
if s == 0:
img[:] = 0
else:
img[:] = [b,g,r]
cv.destroyAllWindows()

📢📢📢最后的福利
??????最后一點小福利帶給大家:如果想快速上手python的小伙伴們,這個詳細整理PPT可以迅速幫助大家打牢python基礎,需要的小伙伴們可以下載一下 Python入門基礎教程全套+小白速成+學不會來找我! 🍻🍻🍻
還有自制表白神器,需要自取:
Python表白神器,原始碼+決議+各種完美配置+浪漫新穎 🍻🍻🍻

🌲🌲🌲 好啦,這就是今天要分享給大家的全部內容了
??????如果你喜歡的話,就不要吝惜你的一鍵三連了~


轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/299688.html
標籤:python
