opencv 画矩形_图像处理之OpenCV的基础使用补充
基礎(chǔ)到進(jìn)階,跨度有點(diǎn)大,我們還是先踏實(shí)基礎(chǔ)吧。對(duì)圖像的處理實(shí)際上還是對(duì)圖像像素矩陣的處理,當(dāng)然還需要點(diǎn)想象空間。上一篇文章我們介紹了opencv的最基本用法,能夠?qū)崿F(xiàn)圖片的加載、生成、讀取像素矩陣、三通道分解等,詳見(jiàn):
peter.cao:圖像處理之OpenCV的基礎(chǔ)使用?zhuanlan.zhihu.com下面繼續(xù)基礎(chǔ)知識(shí)的應(yīng)用實(shí)踐。需要說(shuō)明一下的是,在寫(xiě)下這些文字的過(guò)程中主要參考的是opencv的官方文檔,如下為其鏈接:
OpenCV-Python Tutorials?docs.opencv.org這里添加簡(jiǎn)單元素不是改變某一個(gè)范圍的像素值,而是在已有圖形上來(lái)添加線、矩形、園等元素。在添加的時(shí)候應(yīng)該就是改變?cè)剀壽E上的原有點(diǎn)像素值。
案例1:添加一條直線,使用cv2.line()函數(shù)
cv2.line(img,sp,ep,color,thickness,linetype): img就是目標(biāo)圖,sp為起始坐標(biāo),ep為終點(diǎn)坐標(biāo),color為顏色,thickness為線的粗細(xì),linetype為線型。
import numpy as np import cv2 img0= np.array(np.ones((300,300,3),dtype=np.uint8)) #構(gòu)建一個(gè)三通道都是1的像素矩陣 cv2.line(img0,pt1=(10,10),pt2=(200,200),color=(255,0,0)) #在img0上繪制一條直線 cv2.imshow('line',img0) cv2.waitKey(0)執(zhí)行效果為:
案例2:添加一個(gè)矩形,使用cv2.rectangle函數(shù)
cv2.rectangle(img,sp,ep,color,thickness,linetype): img就是目標(biāo)圖,sp為起始坐標(biāo),ep為終點(diǎn)坐標(biāo),color為顏色,thickness為線的粗細(xì),linetype為線型。參數(shù)與line函數(shù)一樣。
import numpy as np import cv2 img0= np.array(np.ones((300,300,3),dtype=np.uint8)) cv2.line(img0,pt1=(10,10),pt2=(200,200),color=(255,0,0)) cv2.rectangle(img0,pt1=(40,40),pt2=(200,200),color=(0,255,0)) #繪制一個(gè)矩形框 cv2.imshow('line',img0) cv2.waitKey(0)執(zhí)行效果為:
案例3:添加一個(gè)園,使用cv2.circle函數(shù)
cv2.circle(img,center,radius,color,thickness,linetype): img就是目標(biāo)圖,center為園中心坐標(biāo),radius為園半徑,color為邊界顏色,thickn為邊界粗細(xì),linetype為邊界線型。
import numpy as np import cv2 img0= np.array(np.ones((300,300,3),dtype=np.uint8)) cv2.line(img0,pt1=(10,10),pt2=(200,200),color=(255,0,0)) cv2.rectangle(img0,pt1=(40,40),pt2=(200,200),color=(0,255,0)) cv2.circle(img0,center=(50,50),radius=20,color=(0,0,255)) #繪制一個(gè)圓形 cv2.imshow('line',img0) cv2.waitKey(0)執(zhí)行效果如下:
從上述執(zhí)行效果看到,對(duì)于cv2的顏色模型,三通道順序?yàn)锽GR,而不是RGB,這一點(diǎn)需要注意一下。
案例4:添加標(biāo)注,可以使用putText函數(shù)
putText(img,text,org,fontFace,fontScale,color,thickness,lineType): text為標(biāo)注的文字內(nèi)容,org為起始的坐標(biāo),fontFace為字體類型,fontScale為字體比例倍數(shù),color為顏色,thickness為字體線型寬度,lineType為線型。
import numpy as np import cv2 img0= np.array(np.ones((300,300,3),dtype=np.uint8)) cv2.line(img0,pt1=(10,10),pt2=(200,200),color=(255,0,0)) cv2.rectangle(img0,pt1=(40,40),pt2=(200,200),color=(0,255,0)) cv2.circle(img0,center=(50,50),radius=20,color=(0,0,255)) cv2.putText(img0,text='topher',org=(50,100),fontFace=cv2.FONT_HERSHEY_COMPLEX,fontScale=2,color=(255,0,0),thickness=2,lineType=cv2.LINE_AA) cv2.imshow('line',img0) cv2.waitKey(0)執(zhí)行效果如下:
2. 給鼠標(biāo)添加事件
鼠標(biāo)主要是點(diǎn)擊事件和滑動(dòng),比如左鍵點(diǎn)擊、左鍵雙擊、右鍵點(diǎn)擊、中鍵滑動(dòng)等,可以在代碼里輸入cv2.EVENT,根據(jù)pycharm的代碼補(bǔ)全功能,就會(huì)將后續(xù)的函數(shù)全稱顯示出來(lái),如下:
如圖大概有十幾個(gè)鼠標(biāo)事件,包括了左鍵、中鍵和右鍵三個(gè)部分。
可以寫(xiě)一個(gè)專門(mén)用于鼠標(biāo)測(cè)試的函數(shù),對(duì)各個(gè)點(diǎn)擊事件進(jìn)行測(cè)試說(shuō)明:
# mouse callback function def mouse_event(event, x, y, flags, param):''':param event: 點(diǎn)擊事件標(biāo)識(shí):param x: 坐標(biāo)x:param y: 坐標(biāo)y:param flags:按鍵事件標(biāo)識(shí):param param: 攜帶參數(shù):return:'''if flags == cv2.EVENT_FLAG_ALTKEY:print('摁住Alt')if flags == cv2.EVENT_FLAG_CTRLKEY:print('摁住Ctrl')if flags == cv2.EVENT_FLAG_SHIFTKEY:print('摁住Shift')if flags == cv2.EVENT_FLAG_LBUTTON:print('摁住左鍵')if flags == cv2.EVENT_FLAG_MBUTTON:print('摁住中鍵')if flags == cv2.EVENT_FLAG_RBUTTON:print('摁住右鍵')if event == cv2.EVENT_LBUTTONDBLCLK:print('左鍵雙擊')if event == cv2.EVENT_MBUTTONDBLCLK:print('中鍵雙擊')if event == cv2.EVENT_RBUTTONDBLCLK:print('右鍵雙擊')if event == cv2.EVENT_LBUTTONDOWN:print('左鍵擊下')if event == cv2.EVENT_LBUTTONUP:print('左鍵彈起')if event == cv2.EVENT_MBUTTONDOWN:print('中鍵擊下')if event == cv2.EVENT_MBUTTONUP:print('中鍵彈起')if event == cv2.EVENT_RBUTTONDOWN:print('右鍵擊下')if event == cv2.EVENT_RBUTTONUP:print('右鍵彈起')if event == cv2.EVENT_MOUSEWHEEL:if flags > 0:print('向前滾動(dòng)')else:print('向后滾動(dòng)')if event == cv2.EVENT_MOUSEHWHEEL:if flags > 0:print('向左滾動(dòng)') # 按住Altelse:print('向右滾動(dòng)')if __name__ == '__main__':img = np.mat(np.zeros((300, 300, 3), np.uint8)) # 構(gòu)造一個(gè)像素值全為1的圖形cv2.namedWindow('mouse') #命名窗口為mousecv2.setMouseCallback('mouse', mouse_event) # 窗口與回調(diào)函數(shù)綁定while True:cv2.imshow('mouse', img)if cv2.waitKey(1) & 0xFF == ord('q'): # 摁下q退出breakcv2.destroyAllWindows() #銷(xiāo)毀所有窗口執(zhí)行程序后,就可以在彈出的黑色窗口里對(duì)鼠標(biāo)事件進(jìn)行測(cè)試,測(cè)試時(shí)會(huì)在終端打印鼠標(biāo)事件名稱。下面結(jié)合添加簡(jiǎn)單元素效果進(jìn)行示例。
案例1:鼠標(biāo)左鍵雙擊時(shí)繪制一個(gè)圓形
使用函數(shù)cv2.EVENT_LBUTTONDBLCLK觸發(fā),我們可以直接將上述代碼修改一下:
def draw_circle(event,x,y,flags,param):if event == cv2.EVENT_LBUTTONDBLCLK: #鼠標(biāo)為左鍵雙擊時(shí)cv2.circle(img,(x,y),100,(255,0,0)) #畫(huà)一個(gè)半徑為100,邊界顏色為藍(lán)色的園,后面如果增加-1參數(shù),表示填充if __name__ == '__main__':img = np.zeros((300, 300, 3), np.uint8) # 構(gòu)建一個(gè)300x300黑色背景圖cv2.namedWindow('test')cv2.setMouseCallback('test', draw_circle) # 窗口與回調(diào)函數(shù)綁定while(1):cv2.imshow('test', img)if cv2.waitKey(10)& 0xFF == 27: #按ESC鍵退出 breakcv2.destroyAllWindows()這段代碼中,draw_circle函數(shù)參數(shù)里x和y默認(rèn)取得鼠標(biāo)當(dāng)前所在的位置,
cv2.waitKey(10)& 0xFF == 27: 其中waitKey前面介紹過(guò),等待按鍵,參數(shù)10表示讀幀間隔時(shí)間,當(dāng)為10時(shí)表示每隔10s讀一下圖,因?yàn)檫@里只有一張圖,實(shí)際上這個(gè)取值變化影響不大,而本身waiKey是一個(gè)動(dòng)作,等待按鍵期間如果沒(méi)有按鍵,返回-1,如果有按鍵,返回按鍵的ASCII碼;0xFF是十六進(jìn)制表示,cv2.waitKey(10)& 0xFF是一個(gè)邏輯與運(yùn)算,waitKey()是有返回值的,當(dāng)這個(gè)返回值與0xFF進(jìn)行邏輯與操作時(shí),得到的值如果為27,對(duì)應(yīng)的按鍵就是ESC。
執(zhí)行代碼后,當(dāng)鼠標(biāo)在任意位置雙擊時(shí)就可以繪制出圓形來(lái)。這里點(diǎn)擊了4次,效果如下:
案例2:在案例1基礎(chǔ)上增加一個(gè)右鍵點(diǎn)擊按鈕事件,繪制一個(gè)矩形
增加右鍵單擊函數(shù)cv2.EVENT_RBUTTONDOWN,如下:
def draw_circle(event,x,y,flags,param):if event == cv2.EVENT_LBUTTONDBLCLK:cv2.circle(img,(x,y),100,(255,0,0))elif event == cv2.EVENT_RBUTTONDOWN:cv2.rectangle(img,(x,y),(x+100,y+50),color=(0, 255, 0))if __name__ == '__main__':img = np.zeros((500, 500, 3), np.uint8) # 500x500黑色背景cv2.namedWindow('test')cv2.setMouseCallback('test', draw_circle) while(1):cv2.imshow('test', img)if cv2.waitKey(10)& 0xFF == 27: #按ESC鍵退出 breakcv2.destroyAllWindows()執(zhí)行后效果如下:
總結(jié)
以上是生活随笔為你收集整理的opencv 画矩形_图像处理之OpenCV的基础使用补充的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: android udp 收发例子_网络协
- 下一篇: python2定点找色_Python实现