pythonに基づくOpencv画像処理は、無人の車の運転の最初のステップである、交差点の交通灯の色検出を実行します。

1.ビデオ読書

まず、テストしたビデオが4kであるため、ビデオを読み込みます。サイズ変更を使用してビデオの解像度を調整しました。

cap = cv2.VideoCapture( 'video /小路口.mp4')
while True:
    ret、frame = cap.read()
    if ret == False:
        break 
    frame = cv2.resize(frame、(1920,1080))
    cv2。 imshow( 'frame'、frame)
    c = cv2.waitKey(10)
    if c == 27:
        break

imshow()(以下に示すように)

2.ロイエリアを傍受する

roi領域をインターセプトします。つまり、不要な干渉要因を回避するために、トラフィックライトの位置をインターセプトする必要があります(下の図を参照)。

傍受されたロイ(下図に示す)

3.hsvカラースペースを変換します

HSV色成分範囲(詳細は元のリンクを参照)
一般に、色空間画像の効果的な処理はHSV空間で行われるため、基本色の対応するHSV成分に厳密な範囲を指定する必要があります。以下は実験により計算されます。ファジー範囲(正確な範囲はインターネットで提供されていません)。

H:0〜180

S:0〜255

V:0-255

ここでは、赤の一部が紫の範囲として分類されています(下の図を参照)。

上記には特定の色の値が与えられています。色の効果が良くない場合は、pythonコードを使用して最小値と最大値を微調整できます。opencvのAPIを使用して、必要な色を取得します。次のコードをにコピーできます。色を調整します。
1.まずロイエリアの写真を撮る必要があります
2.写真を読んで色の値を調整します

色調整コードは次のとおりです:(詳細については、ビデオチュートリアルのリンクを参照してください)

import cv2 
import numpy as np 

def empty(a):
    pass 

def stackImages(scale、imgArray):
    rows = len(imgArray)
    cols = len(imgArray [0])
    rowsAvailable = isinstance(imgArray [0]、list)
    width = imgArray [0] [0] .shape [1] 
    height = imgArray [0] [0] .shape [0] 
    if rowsAvailable:
        for x in range(0、rows):
            for y in range(0、cols):
                if imgArray [x] [y] .shape [:2] == imgArray [0] [0] .shape [:2]:
                    imgArray [x] [y] = cv2.resize(imgArray [x] [y]、(0 、0)、なし、スケール、スケール) 
                else:
                    imgArray [x] [y] = cv2.resize(imgArray [x] [y]、(imgArray [0] [0] .shape [1]、imgArray [0] [0] .shape [0])、なし、 scale、scale)
                if len(imgArray [x] [y] .shape)== 2:imgArray [x] [y] = cv2.cvtColor(imgArray [x] [y]、cv2.COLOR_GRAY2BGR)
        imageBlank = np.zeros ((height、width、3)、np.uint8)
        hor = [imageBlank] * rows 
        hor_con = [imageBlank] * 
        range(0、rows)内のxの行:
            hor [x] = np.hstack(imgArray [x] )
        ver = np.vstack(hor)
    else:
        for x in range(0、rows):
            if imgArray [x] .shape [:2] == imgArray [0] .shape [:2]:
                imgArray [x] = cv2.resize(imgArray [x]、(0、0)、None、scale、scale) 
            else:
                imgArray [x] = cv2.resize(imgArray [x]、(imgArray [0] .shape [1]、imgArray [0] .shape [0])、None、scale、scale)
            if len(imgArray [x]。 shape)== 2:imgArray [x] = cv2.cvtColor(imgArray [x]、cv2.COLOR_GRAY2BGR)
        hor = np.hstack(imgArray)
        ver = hor 
    return ver 

#读取的図片直径パス= '。/ green。 JPG」
cv2.namedWindow( "トラックバー")
cv2.resizeWindow( "トラックバー"、640240)
cv2.createTrackbar( "色相分"、 "トラックバー"、0179、空)
cv2.createTrackbar( "色相マックス"、 "トラックバー"、 19,179、empty)
cv2.createTrackbar( "Sat Min"、 "TrackBars"、110,255、empty)空) 
cv2.createTrackbar( "Val Max"、 "TrackBars"、255,255、empty) 
cv2.createTrackbar(" Sat Max "、"TrackBars "、240,255、empty)
cv2.createTrackbar( "Val Min"、 "TrackBars"、153,255、empty)

while True:
    img = cv2.imread(path)
    imgHSV = cv2.cvtColor(img、cv2.COLOR_BGR2HSV)
    h_min = cv2.getTrackbarPos( "Hue Min" 、 "TrackBars")
    h_max = cv2.getTrackbarPos( "Hue Max"、 "TrackBars")
    s_min = cv2.getTrackbarPos( "Sat Min"、 "TrackBars")
    s_max = cv2.getTrackbarPos( "Sat Max"、 "TrackBars")
    v_min = cv2.getTrackbarPos( "Val Min"、 "TrackBars")
    v_max = cv2.getTrackbarPos( "Val Max"、 "TrackBars")
    print(h_min、h_max、s_min、s_max、v_min、v_max)
    lower = np.array( [h_min、s_min、v_min])
    upper = np。array([h_max、s_max、v_max])
    マスク= cv2.inRange(imgHSV、lower、upper) 
    imgResult = cv2.bitwise_and(img、img、mask = mask) 


    imgStack = stackImages(0.6、([img、imgHSV]、[mask、imgResult]))
    cv2.imshow( "Stacked Images"、imgStack)
    cv2.waitKey(1)

コードを実行した後、調整結果(下の図に示すように)は、緑色が取得されたことは明らかです。

4.バイナリ画像の色判定

画像はバイナリ画像であるため、画像に255の白い点がある場合、最大値の255を取得すると、ビデオフレームは連続的に変化し、各カラー値をトラバースします。

red_color = np.max(red_blur)
green_color = np.max(green_blur)
if red_color == 255:
	print( 'red')
elif green_color == 255:
	print( 'green')

5.カラー結果が画像に描画されます

長方形のフレームを使用して、トラフィックライトエリアを選択します

cv2.rectangle(frame、(1020,50)、(1060,90)、(0,0,255)、2)座標cv2.putText(frame、 "red"、(1020、40)、cv2で長方形のフレームを描画します.FONT_HERSHEY_COMPLEX、1、(0、0、255)、2)#赤いテキスト情報を表示する



6.完全なコード

import cv2 
import numpy as np 

cap = cv2.VideoCapture( 'video /小路口.mp4')
while True:
    ret、frame = cap.read()
    if ret == False:
        break 
    frame = cv2.resize(frame、(1920 、1080))
    #截取roi登録
    roiColor = frame [50:90,950:1100] 
    #変換换hsv颜色空ºhsv 
    = cv2.cvtColor(roiColor、cv2.COLOR_BGR2HSV)

    #red 
    lower_hsv_red = np.array([157,177,122])
    upper_hs .array([179,255,255])
    mask_red = cv2.inRange(hsv、lowerb = lower_hsv_red、upperb = upper_hsv_red)
    #中值滤波
    red_blur = cv2.medianBlur(mask_red、7)
    #green 
    lower_hsv_green = np.array([49 )
    upper_hsv_green = np.array([90,255,255])
    mask_green = cv2.inRange(hsv、lowerb = lower_hsv_green、upperb = upper_hsv_green)
    #メディアン
    フィルターgreen_blur = cv2.medianBlur(mask_green、7)#

    画像はバイナリ画像であるため、画像に255の白い点がある場合は、最大値を255にします
    。red_color= np.max(red_blur)
    green_color = np.max(green_blur)
    #値が255に等しい場合、バイナリ画像をred_colorで判断します。
    red_color == 255の場合、赤と判断されます
        print( 'red')
                        #。これは私がよく混乱する座標です。それらをリストアップして覚えておいてください。
                        #y 
                        y + hx x + w #frame [50:90,950:1100] #xy 

                        x + w y + h 
        cv2.rectangle(frame、(1020,50)、(1060,90)、(0,0,255)、2 )#座標で長方形のフレームを描く 
        cv2.putText(frame、 "red"、(1020、40)、cv2.FONT_HERSHEY_COMPLEX、1、(0、 0、255)、2)#赤いテキスト情報を表示する
    #値が255に等しい場合、green_colorのバイナリイメージを判断し、緑色と判断されます
    elif green_color == 255:
        print( 'green')
        cv2.rectangle(frame、(1020,50)、(1060,90)、(0,255 、0)、2)
        cv2.putText(frame、 "green"、(1020、40)、cv2.FONT_HERSHEY_COMPLEX、1、(

    0、255、0 )、2)cv2.imshow( 'frame'、frame)
    red_blur = cv2.resize(red_blur、(300,200))
    green_blur = cv2.resize(green_blur、(300,200))
    cv2.imshow( 'red_window'、red_blur)
    cv2.imshow( 'green_window'、green_blur)

    c = cv2.waitKey(10)
    c == 27の場合:
        ブレーク

赤色光の影響を検出します(下図を参照)

緑色のライトの効果を確認します(下図を参照)

やっと!完全なプロジェクトコードを入手するには、ここをクリックしてください

opencvとの最初の接触!だから私にスプレーしないでください、視覚分野の大物!(/狗头)
 
コード量は非常に少なく、一般化能力はなく、アプローチは非常に少ないです。しかし、私にとって、hsvカラースペースを学ぶことはまだ非常に役に立ちます!それでおしまい!Ollieはそれを与える!

誰もがXiaomingの子供用シューズをもっとサポートできます!

この記事は転載されており、著作権は作者に帰属します。侵害がある場合は、編集者に連絡して削除してください。

元のアドレス:https://blog.csdn.net/weixin_44912902

 

 

 

おすすめ

転載: blog.csdn.net/weixin_43881394/article/details/109049373