1. 程式人生 > 程式設計 >Python Opencv 通過軌跡(跟蹤)欄實現更改整張影象的背景顏色

Python Opencv 通過軌跡(跟蹤)欄實現更改整張影象的背景顏色

!!!本部落格,是對影象的背景顏色的修改的基礎講解~!!!
還包括一個練習——是對背景色修改的一點應用嘗試!!!——始終相信學習多一點探索,腳步會更堅定一些~

願所有正在努力的人都可以堅持自己的路一直走下去!

實現軌跡(跟蹤)欄功能的函式

函式主要引數講解

cv.createTrackbar()——建立一個軌跡(跟蹤)欄
cv.getTrackbarPos()——獲取一個軌跡(跟蹤)欄的值

cv.createTrackbar()引數如下:

  • 引數一:trackbarname——軌跡(跟蹤)欄名稱
  • 引數二:winname——需要掛載軌跡(跟蹤)欄的窗體名
  • 引數三:value——預設值
  • 引數四:count——上限值
  • 引數五:onChange ——軌跡(跟蹤)欄的回撥執行函式
  • (一般僅僅是通過軌跡欄修改值,然後讀取的話,這個引數可以不用管)引數六:userdata ——作為回撥傳遞的使用者資料。它可以在不使用全域性變數的情況下處理trackbar事件。

cv.getTrackbarPos()引數如下:

  • 引數一:trackbarname——需要讀取的軌跡(跟蹤)欄名稱
  • 引數二:winname——對應的窗體名

程式碼實現

我們先建立一個窗體,為軌跡(跟蹤)欄的掛載做準備
~照片就預設建立一張黑色圖片

import cv2 as cv
import numpy as np

img = np.zeros((512,512,3),np.uint8)
cv.namedWindow('imag',cv.WINDOW_NORMAL)
cv.resizeWindow('imag',510,510)

接著我們把需要的軌跡(跟蹤)欄新增到這個窗體中(記得必須要建立軌跡(跟蹤)欄回撥函式的!!!)
回撥函式可以為pass空函式——但是必須要有!!!

這次要實現背景色的控制,那麼我們設定三個軌跡(跟蹤)欄,每一個軌跡欄對應一個0~255的值——對應BGR中的三色值!!!

def nothing(x):
 pass

# 引數依次為:設定軌跡(跟蹤)欄名字,掛載的窗體, 預設值, 最大值,回撥函式
cv.createTrackbar('R','imag',255,nothing) # R的值——nothing傳入一個空函式體,不執行任何回撥函式
cv.createTrackbar('G',nothing) # G的值
cv.createTrackbar('B',nothing) # B的值

switch = '1:ON\n0:OFF'
cv.createTrackbar(switch,1,nothing) 
 # 設定一個開關——當為1時,圖片背景可以改變——否則為黑色

顯示主體部分的程式碼

 while True:
  cv.imshow('imag',img)
  k = cv.waitKey(1) & 0xFF
  if k == 27: # ESC退出
   break
  if cv.getTrackbarPos(switch,'imag') == 1: # 當swtch軌跡(跟蹤)欄的值為1時,允許改變背景色
   img[:] = [cv.getTrackbarPos('B','imag'),cv.getTrackbarPos('G',cv.getTrackbarPos('R','imag')]
   # getTrackbarPos的引數為:讀取值的軌跡(跟蹤)欄名,所在的窗體名
   # opencv的顏色為BGR——依次獲取軌跡(跟蹤)欄的值就可以了~
  else: # 否則為預設黑色
   img[:] = 0
 cv.destroyAllWindows()

效果

完整程式碼

import cv2 as cv
import numpy as np
def nothing(x):
 pass

if __name__ == "__main__":
 img = np.zeros((512,np.uint8)
 cv.namedWindow('imag',cv.WINDOW_NORMAL)
 cv.resizeWindow('imag',510)

 cv.createTrackbar('R',nothing)
 cv.createTrackbar('G',nothing)
 cv.createTrackbar('B',nothing)
 
 switch = '1:ON\n0:OFF'
 cv.createTrackbar(switch,nothing)
 while True:
  cv.imshow('imag',img)
  k = cv.waitKey(1) & 0xFF
  if k == 27:
   break
  if cv.getTrackbarPos(switch,'imag') == 1:
   img[:] = [cv.getTrackbarPos('B','imag')]
  else:
   img[:] = 0
 cv.destroyAllWindows()

效果

預設開啟的樣子~

在這裡插入圖片描述

此時調節背景色是不改變的~

在這裡插入圖片描述

當開啟時,背景色就會發生改變了~

在這裡插入圖片描述

小訓

訓練要求

我們通過滑鼠繪製一些東西,然後將背景顏色的修改,作為圖片重新整理(清空內容)~

程式碼結構

滑鼠回撥函式(包含包的引用)

import cv2 as cv
import numpy as np
drawing = False
line_size = 2


def mouse_function(event,x,y,flags,param): # 滑鼠回撥函式——執行滑鼠左鍵按下後移動繪圖
 global drawing,line_size
 if event == cv.EVENT_LBUTTONDOWN:
  drawing = True
 elif event == cv.EVENT_MOUSEMOVE:
  if drawing is True:
   cv.circle(img,(x,y),line_size,(0,125,255),-1,cv.LINE_AA)
 elif event == cv.EVENT_LBUTTONUP:
  drawing = False
  cv.circle(img,cv.LINE_AA)

軌跡(跟蹤)欄回撥函式

# 這裡不需要任何操作~所以用pass空函式體即可
def nothing(x):
 pass

__main__主體程式碼
if __name__ == "__main__":
 img = np.zeros((512,510)
 cv.setMouseCallback('imag',mouse_function) # 實現滑鼠回撥函式

 cv.createTrackbar('R',nothing) # 設定R軌跡(跟蹤)欄
 cv.createTrackbar('G',nothing) # 設定開關控制軌跡(跟蹤)欄

 while True:
  cv.imshow('imag','imag') == 1: # 為1是,重新整理畫面
   img[:] = [cv.getTrackbarPos('B','imag')]
   cv.setTrackbarPos(switch,0) # 通過set軌跡(跟蹤)欄位置,實現為1重新整理後,及時回到0位置
 cv.destroyAllWindows()

效果:(小訓練的程式碼連起來就可以直接執行的,這裡就不單獨再寫一遍了)
先隨意用滑鼠寫“開心”兩個字~

在這裡插入圖片描述

接著點選這裡(可能需要點一次選中軌跡(跟蹤)欄,再點選才能執行變化)

在這裡插入圖片描述

然後就實現重新整理了~

在這裡插入圖片描述

我們再寫點其它的——

在這裡插入圖片描述

到這裡小練習也就結束了——既練習了滑鼠事件當作畫筆,也實現了軌跡(跟蹤)欄的設定和讀取——當作畫板重新整理的功能(●'◡'●)

總結

到此這篇關於Python Opencv 通過軌跡(跟蹤)欄實現更改整張影象的背景顏色的文章就介紹到這了,更多相關Python Opencv更改影象的背景顏色內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!