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