訂閱
糾錯(cuò)
加入自媒體

使用 OPENCV Python 進(jìn)行顏色檢測(cè)和選擇

在今天的文章中,我們將討論如何使用 OpenCV-python 從圖像或視頻內(nèi)容中檢測(cè)和選擇顏色。

在開始之前,想指出你需要與本文一起完成的先決條件。首先,考慮到你已經(jīng)了解編程,你需要知道如何在 OpenCV-python 中讀取和顯示圖像。

讀取和顯示圖像

這里的第一步是使用 opencv 從圖像文件中讀取和顯示圖像。為此,我們將使用下面的代碼片段:

import cv2

# read the image into memory

img = cv2.imread("./images/image1.jpg")

# resise the image

img = cv2.resize(img, (640, 480))

# create a window named image and display the image inside of it.

cv2.imshow("Image", img)

# wait untill a any key is pressed to quite the program

cv2.waitKey(0)

創(chuàng)建 Trackbar 滑動(dòng)條

為了檢測(cè)圖像中的顏色,我們需要將圖像轉(zhuǎn)換為 HSV(Hue Saturation Value)圖像。此圖像比例將允許用于在給定的 UPPER 和 LOWER 范圍內(nèi)選擇顏色。

在本節(jié)中,讓我們繼續(xù)編寫代碼來(lái)創(chuàng)建滑動(dòng)條,并從滑塊中提取值作為用戶輸入。

為此,我們的代碼需要進(jìn)行更多更改。它現(xiàn)在應(yīng)該是這樣的。

import cv2

import numpy as np

def do_nothing():

   pass

# create slider here

cv2.namedWindow("Slider")

cv2.resizeWindow("Slider", 640, 480)

cv2.createTrackbar("Hue Min", "Slider", 0, 255, do_nothing)

cv2.createTrackbar("Hue Max", "Slider", 0, 255, do_nothing)

cv2.createTrackbar("Saturation Min", "Slider", 0, 255, do_nothing)

cv2.createTrackbar("Saturation Max", "Slider", 0, 255, do_nothing)

cv2.createTrackbar("Value Min", "Slider", 0, 255, do_nothing)

cv2.createTrackbar("Value Max", "Slider", 0, 255, do_nothing)

img = cv2.imread("./images/image1.jpg")

img = cv2.resize(img, (640, 480))

while True:
 

   # extract the values from the trackbar

   hue_min = cv2.getTrackbarPos("Hue Min", "Slider")

   hue_max = cv2.getTrackbarPos("Hue Max", "Slider")

   sat_min = cv2.getTrackbarPos("Saturation Min", "Slider")

   sat_max = cv2.getTrackbarPos("Saturation Max", "Slider")

   val_min = cv2.getTrackbarPos("Value Min", "Slider")

   val_max = cv2.getTrackbarPos("Value Max", "Slider")
   

   print(hue_min, hue_max, sat_min, sat_max, val_min, val_max)
   


   if cv2.waitKey(1) & 0xFF == ord("q"):

       break

cv2.destroyAllWindows()

將圖像轉(zhuǎn)換為 HSV 比例

現(xiàn)在我們能夠讓滑塊和滑動(dòng)條正常工作,讓我們繼續(xù)將我們的圖像轉(zhuǎn)換為 HSV 比例,然后能夠在特定顏色范圍內(nèi)選擇顏色。

我們可以用第35行的代碼做到這一點(diǎn)

import cv2

import numpy as np

def do_nothing():

   pass

# create slider here

cv2.namedWindow("Slider")

cv2.resizeWindow("Slider", 640, 480)

cv2.createTrackbar("Hue Min", "Slider", 0, 255, do_nothing)

cv2.createTrackbar("Hue Max", "Slider", 0, 255, do_nothing)

cv2.createTrackbar("Saturation Min", "Slider", 0, 255, do_nothing)

cv2.createTrackbar("Saturation Max", "Slider", 0, 255, do_nothing)

cv2.createTrackbar("Value Min", "Slider", 0, 255, do_nothing)

cv2.createTrackbar("Value Max", "Slider", 0, 255, do_nothing)


img = cv2.imread("./images/image1.jpg")

img = cv2.resize(img, (640, 480))

while True:
 

   # extract the values from the trackbar

   hue_min = cv2.getTrackbarPos("Hue Min", "Slider")

   hue_max = cv2.getTrackbarPos("Hue Max", "Slider")

   sat_min = cv2.getTrackbarPos("Saturation Min", "Slider")

   sat_max = cv2.getTrackbarPos("Saturation Max", "Slider")

   val_min = cv2.getTrackbarPos("Value Min", "Slider")

   val_max = cv2.getTrackbarPos("Value Max", "Slider")
   

#     print(hue_min, hue_max, sat_min, sat_max, val_min, val_max)
   

   # convert to HSV image

   hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
   

   if cv2.waitKey(1) & 0xFF == ord("q"):

       break

cv2.destroyAllWindows()

得到我們想要的顏色的上下界

現(xiàn)在我們已經(jīng)將圖像轉(zhuǎn)換為 HSV 比例,我們將更多地了解我們想要檢測(cè)和選擇的顏色的上限和下限。我們分別使用第35行和第36行的代碼來(lái)執(zhí)行此操作。

注意:確保此時(shí)已導(dǎo)入 numpy,否則會(huì)出現(xiàn)一些錯(cuò)誤,numpy 預(yù)裝了 OpenCV-Python。

import cv2

import numpy as np

def do_nothing():

   pass

# create slider here

cv2.namedWindow("Slider")

cv2.resizeWindow("Slider", 640, 480)

cv2.createTrackbar("Hue Min", "Slider", 0, 255, do_nothing)

cv2.createTrackbar("Hue Max", "Slider", 0, 255, do_nothing)

cv2.createTrackbar("Saturation Min", "Slider", 0, 255, do_nothing)

cv2.createTrackbar("Saturation Max", "Slider", 0, 255, do_nothing)

cv2.createTrackbar("Value Min", "Slider", 0, 255, do_nothing)

cv2.createTrackbar("Value Max", "Slider", 0, 255, do_nothing)

img = cv2.imread("./images/image1.jpg")

img = cv2.resize(img, (640, 480))

while True:
 

   # extract the values from the trackbar

   hue_min = cv2.getTrackbarPos("Hue Min", "Slider")

   hue_max = cv2.getTrackbarPos("Hue Max", "Slider")

   sat_min = cv2.getTrackbarPos("Saturation Min", "Slider")

   sat_max = cv2.getTrackbarPos("Saturation Max", "Slider")

   val_min = cv2.getTrackbarPos("Value Min", "Slider")

   val_max = cv2.getTrackbarPos("Value Max", "Slider")
   

#     print(hue_min, hue_max, sat_min, sat_max, val_min, val_max)

   # set bounds

   lower_bound = np.a(chǎn)rray([hue_min, sat_min, val_min])

   upper_bound = np.a(chǎn)rray([hue_max, sat_max, val_max])
   

   # convert to HSV image

   hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
   

   if cv2.waitKey(1) & 0xFF == ord("q"):

       break

cv2.destroyAllWindows()

創(chuàng)建一個(gè)掩碼并將其用于 Bitwise_and 操作

現(xiàn)在,我們需要?jiǎng)?chuàng)建一個(gè)圖像掩碼,并使用它來(lái)執(zhí)行按位操作,使用用戶使用滑動(dòng)條設(shè)置的 UPPER 邊界和 LOWER 邊界。

這將使我們能夠選擇該顏色范圍內(nèi)的顏色。我們的代碼現(xiàn)在應(yīng)該如下所示,分別在第43行和第46行進(jìn)行了更改。

在第50行,我們簡(jiǎn)單地顯示圖像,F(xiàn)在你可以調(diào)整滑塊并選擇你選擇的不同顏色。

import cv2

import numpy as np

def do_nothing():

   pass

# create slider here

cv2.namedWindow("Slider")

cv2.resizeWindow("Slider", 640, 480)

cv2.createTrackbar("Hue Min", "Slider", 0, 255, do_nothing)

cv2.createTrackbar("Hue Max", "Slider", 0, 255, do_nothing)

cv2.createTrackbar("Saturation Min", "Slider", 0, 255, do_nothing)

cv2.createTrackbar("Saturation Max", "Slider", 0, 255, do_nothing)

cv2.createTrackbar("Value Min", "Slider", 0, 255, do_nothing)

cv2.createTrackbar("Value Max", "Slider", 0, 255, do_nothing)

img = cv2.imread("./images/image1.jpg")

img = cv2.resize(img, (640, 480))


while True:
 

   # extract the values from the trackbar

   hue_min = cv2.getTrackbarPos("Hue Min", "Slider")

   hue_max = cv2.getTrackbarPos("Hue Max", "Slider")

   sat_min = cv2.getTrackbarPos("Saturation Min", "Slider")

   sat_max = cv2.getTrackbarPos("Saturation Max", "Slider")

   val_min = cv2.getTrackbarPos("Value Min", "Slider")

   val_max = cv2.getTrackbarPos("Value Max", "Slider")
   

#     print(hue_min, hue_max, sat_min, sat_max, val_min, val_max)

   # set bounds

   lower_bound = np.a(chǎn)rray([hue_min, sat_min, val_min])

   upper_bound = np.a(chǎn)rray([hue_max, sat_max, val_max])
   

   # convert to HSV image

   hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
   

   # create mask

   mask = cv2.inRange(hsv_img, lower_bound, upper_bound)
 

   #  we perform bitwise and operation here

   resulting_img = cv2.bitwise_and(img, img, mask=mask)
   
   

   # display the image here

   cv2.imshow("Image", resulting_img)
   

   if cv2.waitKey(1) & 0xFF == ord("q"):

       break


cv2.destroyAllWindows()

最后的潤(rùn)色

現(xiàn)在我們已經(jīng)做到了這一點(diǎn),讓我們堆疊圖像以獲得更好的演示?梢栽诖舜a段中找到此代碼。

在第46行,我們創(chuàng)建了一個(gè)堆疊圖像并將其顯示在第49行。

import cv2

import numpy as np

def do_nothing():

   pass

# create slider here

cv2.namedWindow("Slider")

cv2.resizeWindow("Slider", 640, 480)

cv2.createTrackbar("Hue Min", "Slider", 0, 255, do_nothing)

cv2.createTrackbar("Hue Max", "Slider", 0, 255, do_nothing)

cv2.createTrackbar("Saturation Min", "Slider", 0, 255, do_nothing)

cv2.createTrackbar("Saturation Max", "Slider", 0, 255, do_nothing)

cv2.createTrackbar("Value Min", "Slider", 0, 255, do_nothing)

cv2.createTrackbar("Value Max", "Slider", 0, 255, do_nothing)

img = cv2.imread("./images/image1.jpg")

img = cv2.resize(img, (640, 480))

while True:

   hue_min = cv2.getTrackbarPos("Hue Min", "Slider")

   hue_max = cv2.getTrackbarPos("Hue Max", "Slider")

   sat_min = cv2.getTrackbarPos("Saturation Min", "Slider")

   sat_max = cv2.getTrackbarPos("Saturation Max", "Slider")

   val_min = cv2.getTrackbarPos("Value Min", "Slider")

   val_max = cv2.getTrackbarPos("Value Max", "Slider")

   # set bounds

   lower_bound = np.a(chǎn)rray([hue_min, sat_min, val_min])

   upper_bound = np.a(chǎn)rray([hue_max, sat_max, val_max])

   # convert to HSV image

   hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

   # create mask

   mask = cv2.inRange(hsv_img, lower_bound, upper_bound)


   resulting_img = cv2.bitwise_and(img, img, mask=mask)


   stacked_imgs = np.hstack([img, resulting_img])

#     create a stacked image of the original and the HSV one.

   cv2.imshow("Image", stacked_imgs)

   if cv2.waitKey(1) & 0xFF == ord("q"):

       break

cv2.destroyAllWindows()

結(jié)論

有關(guān)該項(xiàng)目的視頻說(shuō)明,請(qǐng)查看:

image.png

       原文標(biāo)題 : 使用 OPENCV Python 進(jìn)行顏色檢測(cè)和選擇

聲明: 本文由入駐維科號(hào)的作者撰寫,觀點(diǎn)僅代表作者本人,不代表OFweek立場(chǎng)。如有侵權(quán)或其他問(wèn)題,請(qǐng)聯(lián)系舉報(bào)。

發(fā)表評(píng)論

0條評(píng)論,0人參與

請(qǐng)輸入評(píng)論內(nèi)容...

請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字

您提交的評(píng)論過(guò)于頻繁,請(qǐng)輸入驗(yàn)證碼繼續(xù)

  • 看不清,點(diǎn)擊換一張  刷新

暫無(wú)評(píng)論

暫無(wú)評(píng)論

    人工智能 獵頭職位 更多
    掃碼關(guān)注公眾號(hào)
    OFweek人工智能網(wǎng)
    獲取更多精彩內(nèi)容
    文章糾錯(cuò)
    x
    *文字標(biāo)題:
    *糾錯(cuò)內(nèi)容:
    聯(lián)系郵箱:
    *驗(yàn) 證 碼:

    粵公網(wǎng)安備 44030502002758號(hào)