OpenCV绘图函数:cv2.line、cv2.circle、cv2.rectangle、cv2.ellipse、 cv2.putText()、cv2.setMouseCallback
?OpenCV是一個用于圖像處理、分析、機器視覺方面的開源函數庫。?不管你是做科學研究,還是商業應用,opencv都能夠作為你理想的工具,它可以運行在Linux、Windows、Android和Mac OS操作系統上。OpenCV輕量級而且高效,它是由一系列 C 函數和少量 C++ 類構成,同時提供了Python、Ruby、MATLAB等語言的接口,實現了圖像處理和計算機視覺方面的很多通用算法。
opencv繪圖函數主要有cv2.line()畫線函數,cv2.circle()畫圓函數, cv2.rectangle()長方形函數,cv2.ellipse()橢圓函數, cv2.putText()文字繪制函數及鼠標交互圖像繪制。
本文中編程語言使用python,用到的包為opencv-python,在終端安裝命令為:
?
pip install opencv-python 或者 pip install opencv-contrib-python?
1、畫直線
畫線函數是cv2.line(),需傳入的參數是背景(圖像),起點坐標,終點坐標,線條顏色和線條寬度五個參數。
#導入包import cv2import numpy as np#創建一個圖像,300×400大小,數據類型無符號8位img=np.zeros((500,500,3),np.uint8)cv2.line(img,(50,50),(100,400),(0,255,0),3)#綠色,3個像素寬度?#創建窗口,顯示結果cv2.namedWindow("image")cv2.imshow('image', img)cv2.waitKey?(2000)?#?顯示?20000?ms?即?2s?后消失,改為0即手動關閉cv2.destroyAllWindows()效果圖如下所示:
圖1
2、畫圓
?
cv2.circle(img,center = (width // 2, height // 2) , radius = int(min(height, width) / 3) , color = 0, thickness = -1)畫圓函需要傳入5個參數分別為背景圖像,圓心,半徑,圓的顏色和線寬,當thickness=-1時,將圓填滿。
#導入包 import cv2 import numpy as np #創建一個圖像,300×400大小,數據類型無符號8位 img = cv2.imread(r'D:/test.jpg',cv2.IMREAD_UNCHANGED) height, width = img.shape[:2] height = int(height) width = int(width) circleIn = cv2.circle(img,center = (width // 2, height // 2) , radius = int(min(height, width) / 3) , color = 0, thickness = 2) cv2.imwrite(r'D:/test_out2.jpg',circleIn) #創建窗口,顯示結果 cv2.namedWindow("image") cv2.imshow('image', img) cv2.waitKey (0) cv2.destroyAllWindows()當函數的參數thickness=-1thickness=正數時,
效果圖分別如下圖2和圖3:
? ??
圖2
圖3
3、畫矩形
矩形函數為cv2.rectangle(),需要傳入四個參數,分別為左上頂點和右下頂點,顏色,線條寬度。
#導入包import cv2import numpy as np#創建一個圖像,300×400大小,數據類型無符號8位img = cv2.imread(r'D:/test.jpg',cv2.IMREAD_UNCHANGED)height, width = img.shape[:2]height = int(height)width = int(width)img2 = cv2.rectangle(img,(100,100),(300,180),(134,2,34),-1)#cv2.imwrite函數是保存圖像到指定路徑cv2.imwrite(r'D:/test_out2.jpg',img2)#創建窗口,顯示結果cv2.namedWindow("image")cv2.imshow('image', img2)cv2.waitKey (0) cv2.destroyAllWindows()圖4、圖5分別為cv2.rectangle()函數中,最后一個參數為10和-1時的效果。
? ? ? 圖4
??
圖5
4、橢圓
橢圓函數是cv2.ellipse(img, center, axes, angle, startAngle, endAngle, color, thickness, lineType, shift)
其中參數的含義如下:
??????? img:需要繪圖的圖像
??????? center:橢圓中心點坐標
??????? axes:橢圓尺寸(即長短軸)
??????? angle:旋轉角度(順時針方向)
??????? startAngle:繪制的起始角度(順時針方向)
??????? endAngle:繪制的終止角度(例如,繪制整個橢圓是0,360,繪制下半橢圓就是0,180)
??????? color:線條顏色(BGR)
??????? thickness:線條粗細(默認值=1)
??????? lineType:線條類型(默認值=8)
??????? shift:圓心坐標點和數軸的精度(默認值=0)
#導入包import cv2import numpy as np#創建一個圖像,300×400大小,數據類型無符號8位img=np.zeros((500,500,3),np.uint8)cv2.ellipse(img,(256,256),(100,50),0,0,180,(20,213,79),-1) #創建窗口,顯示結果cv2.namedWindow("image")cv2.imshow('image', img)cv2.waitKey (0) cv2.destroyAllWindows()圖6、圖7分別為旋轉角為180°和360°時的效果圖
??
圖6
?圖7
5、多邊形
多邊形使用cv2.polylines(img,[pts],iscolse,color,thickness)函數,其中第二個參數是多邊形頂點的集合,第三個參數是首尾點是否連接。需要注意的是,多邊形的連接是與集點的順序保持一致的。如我修改下第五行集點的順序,會得到不一樣的圖。
import numpy as npimport?cv2img=np.zeros((512,512,3), np.uint8)#使用numpy生成一組點pts1=np.array([[20,20],[350,40],[420,400],[60,420]], np.int32)pts=pts1.reshape((-1,1,2))?cv2.polylines(img,[pts],True,(0,255,0),2)cv2.imshow('opencv',img)cv2.waitKey(0)cv2.destroyAllWindows()圖8、圖9分別是pts1和pts2順序鏈接對應的多邊形效果圖:
? ?? ? ?
圖8
?圖9
6、添加文字
使用cv2.putText(img,word,position,font,size,color,thickness)函數中,第二個參數是輸入的文字,第三個參數是文字的位置,第四個參數是字體類型,第五個參數是字體大小。
import numpy as npimport cv2?img=np.zeros((512,512,3), np.uint8)#使用numpy生成一組點pts1=np.array([[20,20],[350,40],[420,400],[60,420]],?np.int32)pts=pts1.reshape((-1,1,2))#使用特定字體,添加文字font=cv2.FONT_HERSHEY_SIMPLEXcv2.putText(img,'opencv',(80,90),?font,?2,(255,255,255),3)cv2.polylines(img,[pts],True,(0,255,0),2)效果圖如下:
圖10
7、用鼠標繪制圖形
繪制圖形使用的是cv2.setMouseCallback()函數,
使用時首先定義鼠標操作函數
def your_mouse_callback(event,x,y,flags,param):定義完成后需要調用該函數
cv2.setMouseCallback(windowName,your_mouse_callback)?如下文所示代碼為在背景圖中通過雙擊鼠標左鍵畫圓:
import cv2import numpy as npdef CircleCallback(event,x,y,flags,param): if event==cv2.EVENT_LBUTTONDBLCLK: cv2.circle(img,(x,y),50,(76,201,255),1) print('圓心坐標x=:{0},y=:{1}'.format(x,y))img=cv2.imread('D:/tower.jpg',1)print(img.dtype)cv2.namedWindow('mouse_callback')cv2.setMouseCallback('mouse_callback',CircleCallback)while(True): cv2.imshow('mouse_callback',img) #這里注意cv2.waitKey()里面等待時間不要寫0,否則畫面不刷新。切記!!! if cv2.waitKey(10)&0xFF==ord('q'): breakcv2.destroyAllWindows()效果圖如下所示:
圖11
?
?
?
關注我們
我們的微信公眾號是: Python機器學習和圖像處理
?
?
?
?
總結
以上是生活随笔為你收集整理的OpenCV绘图函数:cv2.line、cv2.circle、cv2.rectangle、cv2.ellipse、 cv2.putText()、cv2.setMouseCallback的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MyEclipse的使用小技巧,您get
- 下一篇: cadencesxstrace.exe修