LoginSignup
3
5

More than 5 years have passed since last update.

画像認識のためのOpenCVの使い方

Posted at

私が画像認識に使って覚えたことを書いていきます。

画像・動画読み込みと表示

# -----動画読み込み、再生-----
import cv2
# 動画読み込み 0はデバイス番号
cap = cv2.VideoaCapture(0)

while True:
    # 動画読み込み,
    _,frame = cap.read()
    # 動画を反転させる
    frame = cv2.flip(frame, 1)

    # 動画を表示
    cv2.imread("frame", frame)
    # キー入力を待機させる 0xFFにてASCIIコードする(バージョンによっては無いとエラーが起きる)
    K = cv2.waitKey(1)&0xFF
    # 文字列を数字に変換する
    Q = ord("q")
    # "q"を入力すると終了する
    if K == Q:
        break
# 表示画面の破棄 *特定のウィンドウのみを終了させたいときは関数の中にウィンドウ名を入力する
cv2.destroyAllWindows()
# 読み込んだ動画を開放する
cap.release()



# -----画像の読み込み-----
image = cv2.imread("画像")

cv2.imshow("image", image)
# キー入力待機 何かキー入力を行ったら終了する
cv2.waitKey(0)
cv2.destroyAllWindows()

グレースケールから輪郭の描画まで

# グレースケール
gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
# 2値化
_,th = cv2.threshold(gray, 50,255, cv2.THRESH_BINARY)
# 判別分類法(2値画像が鮮明になったためこれをよく使った。)
ret,th = cv2.threshold(gray, 0,255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)
# -----輪郭-----
# 画像の大きさで中身がすべて0の画像
only_cnt = np.zeros(image.shape)
# 輪郭を検出する
_,contour,hi = cv2.findContours(th, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
for i in contour:
    # 検出した領域を囲む周囲長を計算する
    epsilon = 0.001 * cv2.arcLength(i, True)
    # 輪郭の近似
    approx = cv2.approxPolyDP(i, epsilon, True)
    # 輪郭の描画
    cv2.drawContours(only_cnt, [approx], -1, (0,0,255), 2)

*OpenCVの輪郭とは黒い背景から白い物体を検出する事です。(これが分かっていなくて上手くいかない事がありました。)

背景差分

cap = cv2.VideoCapture(0)
# 背景オブジェクトを作成
fgbg = cv2.createBackgroundSubtractorMOG2()


while True:
    _,frame = cap.read()
    # 画像に適用させる
    mask = fgbg.apply(frame)
    # 画像表示
    cv2.imshow("frame", mask)
    if cv2.waitKey(1)&0xFF==ord("q"):
        break

cv2.destroyAllWindows()
cap.realease()

色の検出

import cv2
import numpy as np

cap = cv2.VideoCapture("bal.mp4")
# 色の上限と下限を指定(この場合は赤)
upper = np.array([120,255,200])
lower = np.array([100,210,110])

while True:
    _,frame = cap.read()
    frame = cv2.flip(frame, 1)
    # 画像をHSVに変換
    hsv = cv2.cvtColor(frame, cv2.COLOR_RGB2HSV)
    # 色を葉に指定して2値化する
    mask = cv2.inRange(hsv, lower, upper)
    # mask画像の画素値が0(黒)以外部分のみを表示する
    frame_color = cv2.bitwise_and(frame, frame, mask=mask)
    # 画像の分離
    H,S,V = cv2.split(frame_color)
    # 2値化
    _,thresh = cv2.threshold(H, 0,255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)
    # 画像の表示
    cv2.imshow("frame",thresh)

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

cv2.destroyAllWindows()
cap.release()

まとめ

まだまだ、面白い機能があります。色々紹介していきたいです。
紹介してほしいものがありましたらコメントお願いします。(わかる範囲で紹介させて頂きます。)

3
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
5