[OpenCV-Python] 13色空間変換

OpenCV-Python:OpenCVでのIV画像処理

13色空間変換

目標
  •BGRからグレースケールへ、またはBGRからHSVへなど、画像の色空間を変換する方法を学習します。
  •画像から特定の色のオブジェクトを取得するプログラムを作成する必要はありませんでした。
  •学習する関数は、cv2.cvtColor()、cv2.inRange()などです。

13.1色空間を変換する

OpenCVの色空間変換には150以上の方法があります。しかし、私たちがよく使用するタイプは、BGR↔GrayとBGR↔HSVの2つだけであることがわかります。
使用する関数はcv2.cvtColor(input_image、flag)です。ここで、flagは変換タイプです。
BGR↔Grayの変換では、使用するフラグはcv2.COLOR_BGR2GRAYです。
また、BGR↔HSVの変換では、使用するフラグはcv2.COLOR_BGR2HSVです。
次のコマンドを使用して、使用可能なすべてのフラグを取得することもできます。

import cv2
flags=[i for in dir(cv2) if i startswith('COLOR_')]
print flags

注:OpenCVのHSV形式では、H(色/彩度)の値の範囲は[0、179]、S(彩度)の値の範囲は[0、255]、V(輝度)の値の範囲は[0,255]です。ただし、ソフトウェアが異なれば、使用する値も異なる場合があります。したがって、OpenCVのHSV値を他のソフトウェアのHSV値と比較する必要がある場合は、正規化することを忘れないでください。

13.2オブジェクトトラッキング

画像をBGRからHSVに変換する方法がわかったので、これを使用して特定の色のオブジェクトを抽出できます。BGR空間よりも、HSV色空間で特定の色を表現する方が簡単です。私たちのプログラムでは、抽出したいのは青いオブジェクトです。実行する必要のある手順は
  次のとおりです。•ビデオから画像の各フレームを取得します。
  画像をHSV空間に変換し
  ます。•HSVしきい値を青の範囲に設定します。
  •青いオブジェクトを取得します。もちろん、青いオブジェクトの周りに円を描くなど、他にやりたいことは何でもできます。
これが私たちのコードです:

import cv2
import numpy as np cap=cv2.VideoCapture(0) while(1):
# 获取每一帧
ret,frame=cap.read()

# 转换到 HSV
hsv=cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)

# 设定蓝色的阈值
lower_blue=np.array([110,50,50]) 
upper_blue=np.array([130,255,255])

# 根据阈值构建掩模
mask=cv2.inRange(hsv,lower_blue,upper_blue)

# 对原图像和掩模进行位运算
res=cv2.bitwise_and(frame,frame,mask=mask)

# 显示图像cv2.imshow('frame',frame) 
cv2.imshow('mask',mask) 
cv2.imshow('res',res) k=cv2.waitKey(5)&0xFF
if k==27:
	break
# 关闭窗口
cv2.destroyAllWindows()

img

注:これは、オブジェクトトラッキングで最も簡単な方法です。アウトラインを学習すると、関連する知識がさらに学習します。つまり、オブジェクトの重心を見つけ、重心に従ってオブジェクトを追跡し、カメラの前で手を振るだけで描画できます。同じグラフィック、または他のより興味深いもの。

13.3追跡するオブジェクトのHSV値を見つける方法は?

これは私がstackoverflow.comで遭遇した最も一般的な質問です。実際、これは本当に簡単です。関数cv2.cvtColor()もここで使用できます。しかし、ここで渡したいパラメーターは、画像ではなく(必要な)BGR値です。たとえば、緑色のHSV値を検索する場合は、ターミナルで次のコマンドを入力するだけで済みます。

import cv2
import numpy as np
green=np.uint8([0,255,0])
hsv_green=cv2.cvtColor(green,cv2.COLOR_BGR2HSV)
error: /builddir/build/BUILD/opencv-2.4.6.1/
modules/imgproc/src/color.cpp:3541:
error: (-215) (scn == 3 || scn == 4) && (depth == CV_8U || depth == CV_32F)
in function cvtColor
#scn (the number of channels of the source),
#i.e. self.img.channels(), is neither 3 nor 4.
#
#depth (of the source),
#i.e. self.img.depth(), is neither CV_8U nor CV_32F.
# 所以不能用 [0,255,0] ,而要用 [[[0,255,0]]]
# 这里的三层括号应该分别对应于 cvArray , cvMat , IplImage
green=np.uint8([[[0,255,0]]])
hsv_green=cv2.cvtColor(green,cv2.COLOR_BGR2HSV)
print(hsv_green)
# [[[60 255 255]]]

これで、[H-100、100、100]と[H + 100、255、255]をそれぞれ上限と下限のしきい値として使用できます。この方法に加えて、他の画像編集ソフトウェア(GIMPなど)またはオンライン変換ソフトウェアを使用して、対応するHSV値を見つけることができますが、最後にHSV範囲を調整することを忘れないでください。

詳細については、公式アカウントに注意してください。
img

おすすめ

転載: blog.csdn.net/yegeli/article/details/113406099