python-openCV學習1
目錄
OpenCV的Gui特性
圖片載入
圖片載入:cv2.imread(filename: Any,flags: Any = None) -> None
Filename:讀取檔案地址:
就算影象的路徑是錯的,OpenCV 也不會提醒你的,但是當你使用命 令print img時得到的結果是None。
Flags:以什麼格式讀取檔案:
cv2.IMREAD_GRAYSCALE:灰度讀取
cv2.IMREAD_COLOR:彩色讀取
……
圖片顯示:cv2.imshow(winname: Any,mat: Any) -> None
(mp.imshow(mat))
Winname:視窗名稱,不可省略。
Mat:圖片矩陣
顯示圖片的時候必須以下面格式:
cv2.imshow(‘image’,img)
cv2.waitKey(0) :
一個鍵盤繫結函式。需要指出的是它的時間尺度是毫秒級。函式等待特定的幾毫秒,看是否有鍵盤輸入。特定的幾毫秒之內,如果按下任意鍵,這個函式會返回按鍵的 ASCII 碼值,程式將會繼續執行。如果沒有鍵盤輸入,返回值為 -1,如果我們設定這個函式的引數為 0,那它將會無限期的等待鍵盤輸入。它也可以被用來檢測特定鍵是否被按下,例如按鍵a是否 被按下,這個後面我們會接著討論。
cv2.destroyAllWindows()可以輕易刪除任何我們建立的視窗。
如果你想刪除特定的視窗可以使用 cv2.destroyWindow(視窗名)
建議:一種特殊的情況是,你也可以先建立一個視窗,之後再載入影象。這種情況下,你可以決定視窗是否可以調整大小。使用到的函式是cv2.namedWindow()。初始設定函式標籤是cv2.WINDOW_AUTOSIZE。但是如果你把標籤改成cv2.WINDOW_NORMAL,你就可以調整視窗
WINDOW_後面是可以時候用的引數
程式碼:
import numpy as np
import cv2
cv2.namedWindow('image', cv2.WINDOW_NORMAL)
cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
圖片儲存:cv2.imwrite(filename,mat)
視訊讀取
攝像頭捕獲視訊:
建立一個VideoCapture物件:
引數可以是裝置的索引號,或者是一個視訊檔案。
裝置索引號就是在指定要使用的攝像頭。一般的膝上型電腦都有內建攝像頭。所以引數就是0。你可以通過設定成1或者其他的來選擇別的攝像頭。之後,你就可以一幀一幀的捕獲視訊了。但是最後,別忘了停止捕獲視訊。
import numpy as np
import cv2
# 獲取控制元件
cap=cv2.VideoCapture(0)
while True:
# ret為反饋函式,反饋True or False
ret,frame=cap.read()
# cv2.cvtColor 一個單純的顏色轉換。
gray=cv2.cvtColor(frame,cv2.COLOR_BGR2BGRA)
cv2.imshow('frame',gray)
if cv2.waitKey(1)==ord('q'):
break
cap.release()
cv2.destroyAllWindows()
cap.read() 返回一個布林值(True/False)。如果幀讀取的是正確的, 就是 True。所以最後你可以通過檢查他的返回值來檢視視訊檔案是否已經到結尾。
有時cap可能不能成功的初始化攝像頭裝置。這種情況下上面的程式碼會報錯。
你可以使用 cap.isOpened(),來檢查是否成功初始化了。
如果返回值是 True,那就沒有問題。否則就要使用函式 cap.open()。
引數資訊獲取: cap.get(propId)。
這裡 propId 可以是 0 到 18 之間的任何整數。每一個數代表視訊的一個屬性。
修改視訊引數: cap.set(propId,value)
例如,我可以使用 cap.get(3) 和 cap.get(4) 來檢視每一幀的寬和高。 預設情況下得到的值是 640X480。但是我可以使用 ret=cap.set(3,320) 和 ret=cap.set(4,240) 來把寬和高改成 320X240。
propid | Value |
---|---|
cv2.CAP_PROP_POS_MSEC | 當前視訊檔案的位置(以毫秒為單位)。 |
cv2.CAP_PROP_POS_FRAMES | 基於CAP_PROP_POS_FRAMES |
cv2.CAP_PROP_POS_AVI_RATIO | 視訊檔案的相對位置:0 |
CV2.CAP_PROP_FRAME_WIDTH | 視訊流中幀的寬度。 |
CV2.CAP_PROP_FRAME_HEIGHT | 視訊流中幀的高度。 |
CV2.CAP_PROP_FPS | 幀速率。 |
CV2.CAP_PROP_FOURCC | 編解碼器的CAP_PROP_FOURCC |
CV2.CAP_PROP_FRAME_COUNT | 視訊檔案中的幀數。 |
CV2.CAP_PROP_FORMAT | 通過retrieve()返回的Mat物件的格式。 |
CV2.CAP_PROP_MODE | 特定於後端的值,指示當前捕獲模式。 |
CV2.CAP_PROP_BRIGHTNESS | 亮度影象的亮度(僅適用於相機)。 |
CV2.CAP_PROP_CONTRAST | 對比度影象的對比度(僅適用於相機)。 |
CV2.CAP_PROP_SATURATION | 圖片的飽和度(僅適用於相機)。 |
CV2.CAP_PROP_HUE | 影象的顏色(僅適用於照相機)。 |
CV2.CAP_PROP_GAIN | 影象的增益(僅適用於相機)。 |
CV2.CAP_PROP_EXPOSURE | 曝光(僅適用於相機)。 |
CV2.CAP_PROP_CONVERT_RGB | 布林標誌,指示是否應該將影象轉換為RGB。 |
CV2.CAP_PROP_WHITE_BALANCE | CAP_PROP_WHITE_BALANCE目前不支援的 |
CV2.CAP_PROP_RECTIFICATION | 立體聲攝像機的校正標誌 |
從檔案中播放視訊
與從攝像頭中捕獲一樣,你只需要把裝置索引號改成視訊檔案的名字。在 播放每一幀時,使用 cv2.waiKey() 設定適當的持續時間。如果設定的太低視 頻就會播放的非常快,如果設定的太高就會播放的很慢(你可以使用這種方法 控制視訊的播放速度)。通常情況下通過獲取視訊幀率就ok
cap=cv2.VideoCapture(r'C:\Users\Cs\Desktop\機器學習\測試avi\1.avi')
t=cap.get(cv2.CAP_PROP_FPS)
while True:
ret,frame=cap.read()
print(ret)
if ret is False:
break
gray=cv2.cvtColor(frame,cv2.COLOR_RGB2GRAY)
cv2.imshow('frame',frame)
if cv2.waitKey(int(t))==ord('q'):
break
cap.release()
cv2.destroyAllWindows()
圖片、視訊儲存
在我們捕獲視訊,並對每一幀都進行加工之後我們想要儲存這個視訊。
圖片儲存只需使用 cv2.imwrite()。
視訊儲存: 建立一個 VideoWriter 的物件。我們應該確定一個輸出檔案 的名字。
指定 FourCC 編碼(下面會介紹)。播放頻率和幀的大小也都需要確定。
制定視訊色彩: isColor 標籤。如果是 True,每一幀就是彩色圖,否則就是灰度圖。
FourCC 就是一個 4 位元組碼,用來確定視訊的編碼格式。可用的編碼列表 可以從fourcc.org查到。這是平臺依賴的。
常用編碼格式:In Fedora: DIVX, XVID, MJPG, X264, WMV1, WMV2. 常用XVID。MJPG存在大視訊。X264存小視訊
In Windows: DIVX (More to be tested and added)
FourCC 碼以下面的格式傳給程式,以 MJPG 為例: cv2.cv.FOURCC('M','J','P','G')或者cv2.cv.FOURCC(*'MJPG')。
cv2.flip(翻轉陣列,翻轉引數)
引數src
。在垂直、水平或兩個軸上翻轉二維陣列。
。函式cv::flip以三種不同的方式(行)翻轉陣列
。使用該功能的示例場景如下:
。*垂直翻轉影象(flipCode == 0)進行切換
。*影象的水平翻轉與隨後的水平翻轉
。垂直軸對稱(flipCode \> 0)。
。*同時水平和垂直翻轉影象
。對於中心對稱(flipCode \< 0)。
import cv2
cap=cv2.VideoCapture(0)
# 設定編碼格式
fourcc=cv2.VideoWriter_fourcc(*'MJPG')
# 20.0幀率,可以通過:cap.get(cv2.CAP_PROP_FPS)得到幀率
out=cv2.VideoWriter('out.avi',fourcc,20.0,(640,480))
while cap.isOpened():
ret,frame=cap.read()
if ret is False:
break
frame=cv2.flip(frame,0)
out.write(frame)
cv2.imshow('frame',frame)
if cv2.waitKey(1) ==ord('q'):
break
cap.release()
out.release()
cv2.destroyAllWindows()
繪圖
cv2.line(),cv2.circle(),cv2.rectangle(), cv2.ellipse(),cv2.putText()
上面這些函式需要設定引數:
引數 | 含義 |
---|---|
img | 你想要繪製圖形的那幅影象。 |
color | 形狀的顏色。以RGB為例,需要傳入一個元組,例如: (255,0,0) 代表藍色。對於灰度圖只需要傳入灰度值。 |
thickness | 線條的粗細。如果給一個閉合圖形設定為 -1,那麼這個圖形 就會被填充。預設值是 1. |
linetype | 線條的型別, 8連線,抗鋸齒等。預設情況是8連線。cv2.LINE_AA 為抗鋸齒,這樣看起來會非常平滑。 |
畫線
要畫一條線,你只需要告訴函式這條線的起點和終點。我們下面會畫一條 從左上方到右下角的藍色線段。
cv2.line(圖片矩陣,起點座標,終點座標,顏色,寬度)
import numpy as np
import cv2
# Create a black image
img=np.zeros((512,512,3), np.uint8)
# Draw a diagonal blue line with thickness of 5 px
cv2.line(img,(0,0),(51,51),(255,0,0),5)
cv2.imshow('line',img)
cv2.waitKey(0)
矩形
要畫一個矩形,你需要告訴函式的左上角頂點和右下角頂點的座標。這次 我們會在影象的右上角話一個綠色的矩形。
cv2.rectangle(img,(384,0),(510,128),(0,255,0),3)
畫圓
要畫圓的話,只需要指定圓形的中心點座標和半徑大小。我們在上面的矩 形中畫一個圓。如果要畫實心圓,設定寬度為-1
cv2.circle(img,(447,63), 63, (0,0,255), -1)
橢圓
畫橢圓比較複雜,我們要多輸入幾個引數。一個引數是中心點的位置座標。 下一個引數是長軸和短軸的長度。橢圓沿逆時針方向旋轉的角度。橢圓弧沿順時針方向起始的角度和結束角度,如果是 0 或 360,就是整個橢圓。檢視 cv2.ellipse() 可以得到更多資訊。下面的例子是在圖片的中心繪製半個橢圓。
cv2.ellipse(img,(256,256),(100,50),0,0,180,255,-1)
cv2.ellipse(img,(256,256),(100,50),30,60,180,(100,100,100),-1)
多邊形
畫多邊形,需要指點每個頂點的座標。用這些點的座標構建一個大小等於 行數 X1X2 的陣列,行數就是點的數目。
cv2.polylines(img,pts,True,(200,200,200),5,)
import cv2
import numpy as np
newImageInfo = (500,500,3)
#多線條的繪製
#先確定連線的點
#在矩陣變換
#最後繪製
dst=np.zeros((500,500,3))
points = np.array([[150,50],[140,140],[200,170],[250,250],[150,50]],np.int32)
points = points.reshape(-1,1,2)
cv2.polylines(dst,[points],True,(0,255,255))
cv2.imshow("dst",dst)
cv2.waitKey(0)
圖片新增文字
要在圖片上繪製文字,你需要設定下列引數:
- 你要繪製的文字
- 你要繪製的位置
- 字型型別(通過檢視 cv2.putText() 的文件找到支援的字型)
- 字型的大小
- 文字的一般屬性如顏色,粗細,線條的型別等。為了更好看一點推薦使用 linetype=cv2.LINE_AA。
例:
font=cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img,'OpenCV',(10,500), font, 4,(255,255,255),2)
滑鼠當畫筆
把滑鼠當畫筆:使用 OpenCV 處理滑鼠事件, 你將要學習的函式是:cv2.setMouseCallback()。
簡單演示
這裡我們來建立一個簡單的程式,他會在圖片上你雙擊過的位置繪製一個 圓圈。 首先我們來建立一個滑鼠事件回撥函式,但滑鼠事件發生是他就會被執行。 滑鼠事件可以是滑鼠上的任何動作,比如左鍵按下,左鍵鬆開,左鍵雙擊等。 我們可以通過滑鼠事件獲得與滑鼠對應的圖片上的座標。
獲取滑鼠事件:
>>> import cv2
>>> e=[i for i in dir(cv2) if 'EVENT' in i]
>>> print(e)
['EVENT_FLAG_ALTKEY', 'EVENT_FLAG_CTRLKEY', 'EVENT_FLAG_LBUTTON', 'EVENT_FLAG_MBUTTON', 'EVENT_FLAG_RBUTTON', 'EVENT_FLAG_SHIFTKEY', 'EVENT_LBUTTONDBLCLK', 'EVENT_LBUTTONDOWN', 'EVENT_LBUTTONUP', 'EVENT_MBUTTONDBLCLK', 'EVENT_MBUTTONDOWN', 'EVENT_MBUTTONUP', 'EVENT_MOUSEHWHEEL', 'EVENT_MOUSEMOVE', 'EVENT_MOUSEWHEEL', 'EVENT_RBUTTONDBLCLK', 'EVENT_RBUTTONDOWN', 'EVENT_RBUTTONUP']
在雙擊過的地方繪 制一個圓圈。
import cv2
import numpy as np
#滑鼠回撥函式:引數:事件,座標x,y,param其他引數
def draw_circle(event,x,y,flags,param):
if event==cv2.EVENT_LBUTTONDBLCLK:
cv2.circle(img,(x,y),100,(255,0,0),-1)
#建立影象與視窗並將視窗與回撥函式繫結
img=np.zeros((512,512,3),np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image',draw_circle)
while(1):
cv2.imshow('image',img)
if cv2.waitKey(20)==27:
break
cv2.destroyAllWindows()
我們對Markdown編輯器進行了一些功能拓展與語法支援,除了標準的Markdown編輯器功能,我們增加了如下幾點新功能,幫助你用它寫部落格:
- 全新的介面設計 ,將會帶來全新的寫作體驗;
- 在創作中心設定你喜愛的程式碼高亮樣式,Markdown 將程式碼片顯示選擇的高亮樣式 進行展示;
- 增加了 圖片拖拽 功能,你可以將本地的圖片直接拖拽到編輯區域直接展示;
- 全新的 KaTeX數學公式 語法;
- 增加了支援甘特圖的mermaid語法1 功能;
- 增加了 多螢幕編輯 Markdown文章功能;
- 增加了 焦點寫作模式、預覽模式、簡潔寫作模式、左右區域同步滾輪設定 等功能,功能按鈕位於編輯區域與預覽區域中間;
- 增加了 檢查列表 功能。
功能快捷鍵
撤銷:Ctrl/Command + Z
重做:Ctrl/Command + Y
加粗:Ctrl/Command + B
斜體:Ctrl/Command + I
標題:Ctrl/Command + Shift + H
無序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
檢查列表:Ctrl/Command + Shift + C
插入程式碼:Ctrl/Command + Shift + K
插入連結:Ctrl/Command + Shift + L
插入圖片:Ctrl/Command + Shift + G
合理的建立標題,有助於目錄的生成
直接輸入1次#,並按下space後,將生成1級標題。
輸入2次#,並按下space後,將生成2級標題。
以此類推,我們支援6級標題。有助於使用TOC
語法後生成一個完美的目錄。
如何改變文字的樣式
強調文字 強調文字
加粗文字 加粗文字
標記文字
刪除文字
引用文字
H2O is是液體。
210 運算結果是 1024.
插入連結與圖片
連結: link.
圖片:
帶尺寸的圖片:
當然,我們為了讓使用者更加便捷,我們增加了圖片拖拽功能。
如何插入一段漂亮的程式碼片
去部落格設定頁面,選擇一款你喜歡的程式碼片高亮樣式,下面展示同樣高亮的 程式碼片
.
// An highlighted block
var foo = 'bar';
生成一個適合你的列表
- 專案
- 專案
- 專案
- 專案
- 專案1
- 專案2
- 專案3
- 計劃任務
- 完成任務
建立一個表格
一個簡單的表格是這麼建立的:
專案 | Value |
---|---|
電腦 | $1600 |
手機 | $12 |
導管 | $1 |
設定內容居中、居左、居右
使用:---------:
居中
使用:----------
居左
使用----------:
居右
第一列 | 第二列 | 第三列 |
---|---|---|
第一列文字居中 | 第二列文字居右 | 第三列文字居左 |
SmartyPants
SmartyPants將ASCII標點字元轉換為“智慧”印刷標點HTML實體。例如:
TYPE | ASCII | HTML |
---|---|---|
Single backticks | 'Isn't this fun?' |
‘Isn’t this fun?’ |
Quotes | "Isn't this fun?" |
“Isn’t this fun?” |
Dashes | -- is en-dash, --- is em-dash |
– is en-dash, — is em-dash |
建立一個自定義列表
- Markdown
- Text-to- HTML conversion tool
- Authors
- John
- Luke
如何建立一個註腳
一個具有註腳的文字。2
註釋也是必不可少的
Markdown將文字轉換為 HTML。
KaTeX數學公式
您可以使用渲染LaTeX數學表示式 KaTeX:
Gamma公式展示 是通過尤拉積分
你可以找到更多關於的資訊 LaTeX 數學表示式here.
新的甘特圖功能,豐富你的文章
- 關於 甘特圖 語法,參考 這兒,
UML 圖表
可以使用UML圖表進行渲染。 Mermaid. 例如下面產生的一個序列圖::
這將產生一個流程圖。:
- 關於 Mermaid 語法,參考 這兒,
FLowchart流程圖
我們依舊會支援flowchart的流程圖:
- 關於 Flowchart流程圖 語法,參考 這兒.
匯出與匯入
匯出
如果你想嘗試使用此編輯器, 你可以在此篇文章任意編輯。當你完成了一篇文章的寫作, 在上方工具欄找到 文章匯出 ,生成一個.md檔案或者.html檔案進行本地儲存。
匯入
如果你想載入一篇你寫過的.md檔案或者.html檔案,在上方工具欄可以選擇匯入功能進行對應副檔名的檔案匯入,
繼續你的創作。
註腳的解釋 ↩︎