1. 程式人生 > >python-opencv繪圖函式(cv2.line(), cv2.circle(), cv2.rectangle(),cv2.ellipse() cv2. cv2.putText() )

python-opencv繪圖函式(cv2.line(), cv2.circle(), cv2.rectangle(),cv2.ellipse() cv2. cv2.putText() )

  • 主要有cv2.line()//畫線, cv2.circle()//畫圓, cv2.rectangle()//長方形,cv2.ellipse()//橢圓, cv2.putText()//文字繪製

  • 主要引數

  • img:源影象

  • color:需要傳入的顏色

  • thickness:線條的粗細,預設值是1

  • linetype:線條的型別,8 連線,抗鋸齒等。預設情況是 8 連線。cv2.LINE_AA 為抗鋸齒,這樣看起來會非常平滑。

    1、畫線

    • 畫線——設定起點和終點,顏色,線條寬度

      #建立一個影象,300×400大小,資料型別無符號8位
      img=np.zeros((300,400,3),np.uint8)
      cv2.line(
      img,(10,10),(200,200),(0,255,0),3)#綠色,3個畫素寬度

      在這裡插入圖片描述

    2、畫矩形

    • 矩形——設定左上頂點和右下頂點,顏色,線條寬度
    cv2.rectangle(img,(10,10),(30,40),(134,2,34),1)
    

    3、畫圓

    • 圓——指定圓心和半徑
    cv2.circle(img,(60,60),30,(0,0,213),-1)
    

    4、橢圓

    • 畫橢圓——需要輸入中心點位置,長軸和短軸的長度,橢圓沿逆時針選擇角度,橢圓沿順時針方向起始角度和結束角度
    cv2.ellipse(img,(256,256),(100,50),0,0,180,(20,213,79),-1) #線型-1表示填充
    

    5、多邊形

    • 畫多邊形——需要指定每個頂點的座標

      import numpy as np
      pts=np.array([[10,3],[48,19],[60,3],[98,19]],np.int32) #資料型別必須是int32
      pts=pts.reshape((-1,1,2)) 
      '''這裡 reshape 的第一個引數為-1, 表明這一維的長度是根據後面的維度的計算出來的。
         如果第三個引數是 False,我們得到的多邊形是不閉合的(首尾不相連)。
      '''
      cv2.polylines(img,[pts],True,(0,0,255),1) # 影象,點集,是否閉合,顏色,線條粗細
      

      在這裡插入圖片描述

    6、新增文字

    • 設定引數——繪製的文字,位置,字型,字型大小,文字顏色,線型

      font=cv2.FONT_HERSHEY_SIMPLEX
      cv2.putText(img,’OpenCV’,(80,90), font, 2,(255,255,255),3)
      

      在這裡插入圖片描述

    7、用滑鼠繪製圖形

    • opencv滑鼠處理事件

    • cv2.setMouseCallback()函式

    • 滑鼠事件如下:

      標誌 數值 含義
      cv2.EVENT_MOUSEMOVE 0 滑鼠移動
      cv2.EVENT_LBUTTONDOWN 1 左鍵單擊
      cv2.EVENT_RBUTTONDOWN 2 右鍵單擊
      cv2.EVENT_MBUTTONDOWN 3 中鍵單擊
      cv2.EVENT_LBUTTONUP 4 左鍵釋放
      cv2.EVENT_RBUTTONUP 5 右鍵釋放
      cv2.EVENT_MBUTTONUP 6 中鍵釋放
      cv2.EVENT_LBUTTONDBLCLK 7 左鍵雙擊
      cv2.EVENT_RBUTTONDBLCLK 8 右鍵雙擊
      cv2.EVENT_MBUTTONDBLCLK 9 中鍵雙擊
    • 滑鼠事件標誌:

      標誌 數值 含義
      cv2.EVENT_FLAG_LBUTTON 1 滑鼠左鍵按下狀態
      cv2.EVENT_FLAG_RBUTTON 2 滑鼠右鍵按下狀態
      cv2.EVENT_FlAG_MBUTTON 4 滑鼠中鍵按下狀態
      cv2.EVENT_FLAG_CTRLKEY 8 指示CTRL鍵按下狀態
      cv2.EVENT_FLAG_SHIFTKEY 16 指示SHIFT鍵按下狀態
      cv2.EVENT_FLAG_ALTKEY 32 指示ALT鍵按下狀態
    • 定義滑鼠回撥函式

      • 格式都是統一的,不同的是呼叫後的功能

        def your_mouse_callback(event,x,y,flags,param):

      • 定義完成後需要註冊該回調函式

        cv2.setMouseCallback(windowName,your_mouse_callback)

    • 示例——滑鼠雙擊畫圓

      import cv2
      import numpy as np
      def 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('empire.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'):
              break
      cv2.destroyAllWindows()
      

      效果如下:
      在這裡插入圖片描述

    • 拖動畫矩形或者滑鼠移動軌跡

      • 檢測滑鼠是否按下,按下後確定初始點(ix,iy),滑鼠按下狀態繪製滑鼠軌跡,鬆開後繪製矩形
    • import cv2
      import numpy as np
      
      
      drawing = False  # 滑鼠未按下時不繪製
      mode = True  # true時繪製矩形,按'm'變成繪製曲線
      ix, iy = -1, -1
      
      # 定義滑鼠回撥函式
      
      
      def MouseCallback(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 and flags == cv2.EVENT_FLAG_LBUTTON:
              if drawing is True:
                  if mode is False:
                      pass
                      # cv2.rectangle(img, (ix, iy), (x, y), (0, 255, 0), -1)
                  else:
                      # 預設開啟繪製滑鼠軌跡,按m取消
                      cv2.circle(img, (x, y), 1, (255, 0, 0), -1)
      
          elif event == cv2.EVENT_LBUTTONUP:
              if drawing is True:
                  if mode is True:
                      cv2.rectangle(img, (ix, iy), (x, y), (0, 255, 0), 1)
              drawing = False
      
      
      img = cv2.imread('empire.jpg', 1)
      cv2.namedWindow('rectangle')
      cv2.setMouseCallback('rectangle', MouseCallback)
      while(True):
          cv2.imshow('rectangle', img)
          k = cv2.waitKey(20) & 0xFF
          if k == ord('m'):
              mode = not mode
          elif k == ord('q'):
              break