2016年10月27日 星期四

OPENCV(5)--Drawing



    這篇介紹OPENCV提供的的基本畫圖工具.主要是可以應用在影像辨識出輪廓或特徵時
圈選或標註之用.

<圖1>

    首先使用Numpy 產生一黑底圖矩陣img , 512x512 像素當畫布
       程式如下,3為channel (B,G,R) =(0,0,0)
       img = np.zeros((512,512,3), np.uint8)

1.畫直線:
       OENCV 函式:  cv2.line(img,(20,20),(500,500),(255,0,0),5)
        *1. 畫在img 圖像
        *2. 給定對角兩點(20,20),(500,500) 
        *3. 給定線條顏色(255,0,0) 為(B,G,R) 所以為一藍色線
        *4. 5:為設定的線寬,預設為1 ,值越大線條越粗

2.畫矩形:
        OENCV 函式:  cv2.rectangle(img,(25,25),(400,400),(0,255,0),4)
        *1. 畫在img 圖像
        *2. 給定對角兩點(25,25),(400,400) 
        *3. 給定線條顏色(0,255,0)為(B,G,R) 所以為一綠色線
        *4. 4:為設定的線寬,預設為1 ,值越大線條越粗



3.畫圓形:
        OENCV 函式: cv2.circle(img,(150,150), 60, (0,150,255), 5)
        *1. 畫在img 圖像
        *2. 給定中心點(150,150) 
        *3. 給定半徑60 pixel
        *4. 給定線條顏色(0,150,255)為(B,G,R) 所以為一橘色線
        *5. 5:為設定的線寬,預設為1 ,值越大線條越粗
4.畫橢圓形:
        OENCV 函式: cv2.ellipse(img,(400,425),(100,25),180,0,270,(255,0,255),-1)
        *1. 畫在img 圖像
        *2. 給定中心點(400,425) 
        *3. 給定兩個軸大小(100,25)
        *4. 180:將整個橢圓旋轉180度
        *5. 0,270 :從開始角度0-270結束
        *6. 給定線條顏色(255,0,255)為(B,G,R) 所以為一紫色
        *7. -1:為填滿之意,預設0,為線條不填滿

5.畫破折線:
        OENCV 函式: cv2.polylines(img,[pts],False,(0,0,255),3)
        *1. 畫在img 圖像
        *2. 給定各點[pts]
        *3. False:不接合到起點,True :接合到起點,故為封閉區域
        *4. 180:將整個橢圓旋轉180度
        *5. 給定顏色(0,0,255)為(B,G,R) 所以為一紅色
        *7. 3:為設定的線寬,預設為1 ,值越大線條越粗


6.畫文字:
        OENCV 函式: cv2.putText(img,'OpenCV',(10,500), font, 2,(255,255,255),3,cv2.LINE_AA))

        *1. 畫在img 圖像
        *2. 欲顯示字串:'OpenCV'
        *3. 顯示位置(10,500)
        *4. font = cv2.FONT_HERSHEY_SIMPLEX,字型樣式
        *5. 2:給定字型大小
        *6. 給定顏色(255,255,255)為(B,G,R) 所以為一白色
        *7. 3:為設定的字型線寬,預設為1 ,值越大線條越粗
        *8. cv2.LINE_AA:畫出字型的線型樣式

**.更詳細的參數設定可以參考OPENCV 官網
http://docs.opencv.org/3.1.0/index.html


<Python 完整範例程式>

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,(20,20),(500,500),(255,0,0),5)

cv2.rectangle(img,(25,25),(400,400),(0,255,0),4)

cv2.circle(img,(150,150), 60, (0,150,255), 5)
cv2.ellipse(img,(400,425),(100,25),180,0,270,(255,0,255),-1)

pts = np.array([[123,35],[45,55],[20,30],[50,100],[120,56],[430,150]], np.int32)
print("pts.shape=",pts.shape)
print("pts=",pts)
print("pts[0]=",pts[0])
##reshape to 3-D
pts = pts.reshape((-1,1,2))
print("pts.shape=",pts.shape)
print("pts=",pts)
print("pts[0,0]=",pts[0,0])
cv2.polylines(img,[pts],False,(0,0,255),3)

font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img,'OpenCV',(10,500), font, 2,(255,255,255),3,cv2.LINE_AA)

cv2.namedWindow('Drawing', cv2.WINDOW_NORMAL) #WINDOW_AUTOSIZE 
cv2.imshow('Drawing',img)

k = cv2.waitKey(0)
if k == 27:         # wait for ESC key to exit
 cv2.destroyAllWindows()



加入阿布拉機的3D列印與機器人的FB專頁
https://www.facebook.com/arbu00/