欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python?OpenCV實(shí)現(xiàn)簡(jiǎn)單的顏色識(shí)別功能(對(duì)紅色和藍(lán)色識(shí)別并輸出)

 更新時(shí)間:2023年12月23日 09:03:45   作者:我太難啦555  
Python?OpenCV可以用來(lái)進(jìn)行顏色識(shí)別,可以通過(guò)讀取圖像的像素值,來(lái)判斷像素點(diǎn)的顏色,從而實(shí)現(xiàn)顏色識(shí)別,這篇文章主要給大家介紹了關(guān)于Python?OpenCV實(shí)現(xiàn)簡(jiǎn)單的顏色識(shí)別功能(對(duì)紅色和藍(lán)色識(shí)別并輸出)的相關(guān)資料,需要的朋友可以參考下

攝像頭識(shí)別紅色和藍(lán)色并框選,當(dāng)該顏色為攝像頭屏幕上大多數(shù)顏色時(shí)打印出該顏色的名稱

1.調(diào)包

import cv2
import numpy as np
from matplotlib import pyplot as plt

2.初始設(shè)置 

lower_red = np.array([0, 50, 100])        #為紅色和藍(lán)色設(shè)置閾值用來(lái)為之后處理圖像準(zhǔn)備
upper_red = np.array([10, 255, 255])      #該閾值是在HSV顏色空間下
lower_blue = np.array([100,50,100])
upper_blue = np.array([124, 255, 255])

red = (0,0,225)                           #設(shè)置紅色和藍(lán)色在BGR顏色空間下的數(shù)值元組
blue = (225,0,0)

cv2.namedWindow('video', cv2.WINDOW_AUTOSIZE)#設(shè)置窗口'video',大小為自適應(yīng)模式
cv2.resizeWindow('video',640,480)            #為窗口設(shè)置寬度(640)和高度(480)

3.圖像處理,提取顏色

def img_process(img,lower,upper):
    """根據(jù)閾值處理圖像,提取閾值內(nèi)的顏色。返回處理后只留下指定顏色的圖像(其余為黑色)
        img:原圖像;lower:最低閾值;upper:最高閾值"""
    kernel = np.ones((35, 35), np.uint8)                #創(chuàng)建一個(gè)35x35卷積核,卷積核內(nèi)元素全為1
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)          #將BGR圖像轉(zhuǎn)化為HSV圖像,方便顏色提取
    Open = cv2.morphologyEx(hsv,cv2.MORPH_OPEN,kernel)  #用卷積核對(duì)圖像進(jìn)行形態(tài)學(xué)開(kāi)運(yùn)算操作,去除噪聲
    mask = cv2.inRange(Open, lower, upper)              #開(kāi)運(yùn)算得到的圖像用閾值進(jìn)行二值化處理(處理后的結(jié)果為在閾值內(nèi)的部分變?yōu)榘咨?,不在閾值?nèi)的部分為黑色)
    res = cv2.bitwise_and(img, img, mask = mask)        #二值化處理后的圖像與原圖進(jìn)行位與運(yùn)算(處理后在閾值內(nèi)的顏色變?yōu)樵伾?,不在閾值?nèi)的部分仍為黑色)
    return res                                          #該函數(shù)的返回值為位與運(yùn)算之后的圖像,此圖像只保留了在閾值內(nèi)的圖像,其余部分為黑色

4.輪廓繪制

def cnts_draw(img,res,color):
    """在原圖像上繪出指定顏色的輪廓。無(wú)返回值
        img:原圖像;res:只剩某顏色的位與運(yùn)算后的圖像;color:輪廓的顏色"""
    canny = cv2.Canny(res,100,200)#Canny邊緣檢測(cè)算法,用來(lái)描繪圖像中物體的邊緣,(100,200為此函數(shù)的兩個(gè)閾值,該閾值越小輪廓的細(xì)節(jié)越豐富)
    contours, hierarchy=cv2.findContours(canny,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)#尋找圖像輪廓的函數(shù),這里先用Canny算法得到只保留輪廓的圖像方便輪廓的找尋
    if len(contours) == 0:#傳遞到max函數(shù)中的輪廓不能為空
        cv2.imshow('video',img)
        return
    else:
        max_cnt = max(contours , key = cv2.contourArea)#找到輪廓中最大的一個(gè)
        cv2.drawContours(img, max_cnt,-1,color,2)#在原圖上繪制這個(gè)最大輪廓
        (x,y,w,h) = cv2.boundingRect(max_cnt)#找到這個(gè)最大輪廓的最大外接矩形,返回的(x,y)為這個(gè)矩形右下角的頂點(diǎn),w為寬度,h為高度
        cv2.rectangle(img,(x,y),(x+w,y+h),color,3)#在原圖上繪制這個(gè)矩形
        cv2.imshow('video', img)#展示原圖

5.顏色識(shí)別

def colorfind(img):
    """找到原圖像最多的顏色,當(dāng)該顏色為紅色或藍(lán)色時(shí)打印出來(lái)該顏色的名稱,無(wú)返回值
        img:原圖像"""
    kernel = np.ones((35, 35), np.uint8)
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    Open = cv2.morphologyEx(hsv,cv2.MORPH_OPEN,kernel)#以上為圖像處理
    hist = cv2.calcHist([Open],[0],None,[180],[0,180])#對(duì)Open圖像的H通道進(jìn)行直方圖統(tǒng)計(jì)
    hist_max = np.where(hist == np.max(hist))#找到直方圖hist中列方向最大的點(diǎn)hist_max
    if 0 < hist_max[0] < 10:#hist_max[0]為hist_max的行方向的值,即H的值,H在0~10為紅色
        print('red')        
    elif 100 < hist_max[0] < 124:#H在100~124為藍(lán)色
        print('blue')
    else :                       #H不在前兩者之間跳出函數(shù)
        return
#可以添加對(duì)H的判斷來(lái)識(shí)別更多的顏色

 下面是OpenCV中HSV空間顏色對(duì)照表

6.程序主體

if __name__ == "__main__":
    cap = cv2.VideoCapture(0)#打開(kāi)攝像頭(0代表打開(kāi)默認(rèn)攝像頭,若有兩個(gè)攝像頭可用1表示打開(kāi)另一個(gè)攝像頭)
    while cap.isOpened():#判斷攝像頭是否正常打開(kāi)
        flag, frame = cap.read()#讀取攝像頭返回兩個(gè)參數(shù),flag是布爾類型代表攝像頭是否正常讀取,frame是從攝像頭讀取的圖像
        if not flag:            #若無(wú)法讀取則跳出循環(huán)
            print("無(wú)法讀取攝像頭!")
            break
        else:
            if frame is not None: #判斷攝像頭有無(wú)畫(huà)面
                res_blue = img_process(frame,lower_blue,upper_blue)
                res_red = img_process(frame,lower_red,upper_red)
                cnts_draw(frame,res_blue,blue)
                cnts_draw(frame,res_red,red)
                colorfind(frame)
                key = cv2.waitKey(10)
                if key == 27:
                    break
            else:
                print("無(wú)畫(huà)面")
                break


    cap.release()#釋放資源,停止讀取攝像頭
    cv2.destroyAllWindows()#關(guān)閉所有窗口

完整源代碼

import cv2
import numpy as np
from matplotlib import pyplot as plt

lower_red = np.array([0, 50, 100])
upper_red = np.array([10, 255, 255])
lower_blue = np.array([100,50,100])
upper_blue = np.array([124, 255, 255])     #若繪制輪廓與自己期望的識(shí)別結(jié)果相差較大,可通過(guò)調(diào)整閾值來(lái)改變識(shí)別結(jié)果
red = (0,0,225)
blue = (225,0,0)


cv2.namedWindow('video', cv2.WINDOW_AUTOSIZE)
cv2.resizeWindow('video',640,480)

def img_process(img,lower,upper):
    """根據(jù)閾值處理圖像,提取閾值內(nèi)的顏色。返回處理后只留下指定顏色的圖像(其余為黑色)
        img:原圖像;lower:最低閾值;upper:最高閾值"""
    kernel = np.ones((35, 35), np.uint8)
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    Open = cv2.morphologyEx(hsv,cv2.MORPH_OPEN,kernel)
    mask = cv2.inRange(Open, lower, upper)
    res = cv2.bitwise_and(img, img, mask = mask)
    return res

def cnts_draw(img,res,color):
    """在原圖像上繪出指定顏色的輪廓。無(wú)返回值
        img:原圖像;res:只剩某顏色的位與運(yùn)算后的圖像;color:輪廓的顏色"""
    canny = cv2.Canny(res,100,200)
    contours, hierarchy=cv2.findContours(canny,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
    if len(contours) == 0:
        cv2.imshow('video',img)
        return
    else:
        max_cnt = max(contours , key = cv2.contourArea)
        cv2.drawContours(img, max_cnt,-1,color,2)
        (x,y,w,h) = cv2.boundingRect(max_cnt)
        cv2.rectangle(img,(x,y),(x+w,y+h),color,3)
        cv2.imshow('video', img)

        
def colorfind(img):
    """找到原圖像最多的顏色,當(dāng)該顏色為紅色或藍(lán)色時(shí)打印出來(lái)該顏色的名稱,無(wú)返回值
        img:原圖像"""
    kernel = np.ones((35, 35), np.uint8)
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    Open = cv2.morphologyEx(hsv,cv2.MORPH_OPEN,kernel)
    hist = cv2.calcHist([Open],[0],None,[180],[0,180])
    hist_max = np.where(hist == np.max(hist))
    if 0 < hist_max[0] < 10:
        print('red')
    elif 100 < hist_max[0] < 124:
        print('blue')
    else :
        return

if __name__ == "__main__":
    cap = cv2.VideoCapture(0)
    while cap.isOpened():
        flag, frame = cap.read()
        if not flag:
            print("無(wú)法讀取攝像頭!")
            break
        else:
            if frame is not None: 
                res_blue = img_process(frame,lower_blue,upper_blue)
                res_red = img_process(frame,lower_red,upper_red)
                cnts_draw(frame,res_blue,blue)
                cnts_draw(frame,res_red,red)
                colorfind(frame)
                key = cv2.waitKey(10)
                if key == 27:
                    break
            else:
                print("無(wú)畫(huà)面")
                break

    cap.release()
    cv2.destroyAllWindows()

下面是程序運(yùn)行的實(shí)例

總結(jié) 

到此這篇關(guān)于Python OpenCV實(shí)現(xiàn)簡(jiǎn)單的顏色識(shí)別功能的文章就介紹到這了,更多相關(guān)Python OpenCV實(shí)現(xiàn)顏色識(shí)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 如何用python給朋友做生日快樂(lè)祝福

    如何用python給朋友做生日快樂(lè)祝福

    生活中除了給男神女神表白,還會(huì)遇到朋友過(guò)生日,所以小編今天就給大家?guī)?lái)了一個(gè)送給朋友的生日祝福程序,這篇文章主要給大家介紹了關(guān)于如何用python給朋友做生日快樂(lè)祝福的相關(guān)資料,需要的朋友可以參考下
    2023-11-11
  • 詳解C++編程中一元運(yùn)算符的重載

    詳解C++編程中一元運(yùn)算符的重載

    這篇文章主要介紹了C++編程中一元運(yùn)算符的重載,特別對(duì)遞增和遞減運(yùn)算符重載作了著重講解,需要的朋友可以參考下
    2016-01-01
  • python opencv讀mp4視頻的實(shí)例

    python opencv讀mp4視頻的實(shí)例

    今天小編就為大家分享一篇python opencv讀mp4視頻的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-12-12
  • Python存儲(chǔ)讀取HDF5文件代碼解析

    Python存儲(chǔ)讀取HDF5文件代碼解析

    這篇文章主要介紹了Python存儲(chǔ)讀取HDF5文件代碼解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • python后端接收前端回傳的文件方法

    python后端接收前端回傳的文件方法

    今天小編就為大家分享一篇python后端接收前端回傳的文件方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-01
  • 如何利用python給微信公眾號(hào)發(fā)消息實(shí)例代碼

    如何利用python給微信公眾號(hào)發(fā)消息實(shí)例代碼

    使用過(guò)微信公眾號(hào)的小伙伴應(yīng)該知道微信公眾號(hào)有時(shí)候會(huì)給你推一些文章,當(dāng)你選擇它的某個(gè)功能時(shí),它還會(huì)返回一些信息,下面這篇文章主要給大家介紹了關(guān)于如何利用python給微信公眾號(hào)發(fā)消息的相關(guān)資料,需要的朋友可以參考下
    2022-03-03
  • 解決python大批量讀寫(xiě).doc文件的問(wèn)題

    解決python大批量讀寫(xiě).doc文件的問(wèn)題

    今天小編就為大家分享一篇解決python大批量讀寫(xiě).doc文件的問(wèn)題。具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • Python比較兩個(gè)圖片相似度的方法

    Python比較兩個(gè)圖片相似度的方法

    這篇文章主要介紹了Python比較兩個(gè)圖片相似度的方法,涉及Python操作pil模塊實(shí)現(xiàn)圖片比較的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-03-03
  • Flask框架學(xué)習(xí)筆記之使用Flask實(shí)現(xiàn)表單開(kāi)發(fā)詳解

    Flask框架學(xué)習(xí)筆記之使用Flask實(shí)現(xiàn)表單開(kāi)發(fā)詳解

    這篇文章主要介紹了Flask框架學(xué)習(xí)筆記之使用Flask實(shí)現(xiàn)表單開(kāi)發(fā),結(jié)合實(shí)例形式較為詳細(xì)的分析了flask框架表單模板定義、數(shù)據(jù)提交等相關(guān)操作技巧,需要的朋友可以參考下
    2019-08-08
  • python創(chuàng)建只讀屬性對(duì)象的方法(ReadOnlyObject)

    python創(chuàng)建只讀屬性對(duì)象的方法(ReadOnlyObject)

    有時(shí)需要?jiǎng)?chuàng)建一個(gè)帶只讀屬性的對(duì)象,大家可以參考下如下的方法進(jìn)行創(chuàng)建,稍加改造,可以得到很特殊的效果
    2013-02-02

最新評(píng)論