Raspberry Pi CSI カメラは、Python を使用して、動きの検出と認識のために opencv ライブラリ関数を呼び出します

目次

1. カメラの通話を完了する

2. Python を使用して opencv ライブラリ関数を呼び出し、画像を処理します

2.1 画像処理の大まかな流れ

2.2 opencv call関数のパラメータと意味

2.2.1 ret, img = cap.read() フレーム画像の読み込み

2.2.2 cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) グレースケール画像

2.2.3 grey_diff_img = cv2.absdiff(gray_img,Previous_img) 帧差法

2.2.4 cv2.threshold(src, thresh, maxval, type)の二値化処理

2.2.5 cv2.medianBlur(src, ksize) メディアン フィルター

2.2.6 np.ones(shape, dtype=None, order='C')

2.2.7 cv2.morphologyEx(src, op, kernel) 

2.2.8 cv2.findContours(画像,モード,メソッド)

2.2.9 cv2.contourArea() 輪郭面積の計算

2.2.10 cv2.boundingRect()はアウトラインフレームの座標を返します

2.2.11 cv2.rectangle() 座標接続、フレーム輪郭

2.2.12 cv2.imshow()ウィンドウの表示イメージ

3. 処理コード


1. カメラの通話を完了する

やり方が分からない方はご覧ください

Raspberry Pi が CSI カメラを呼び出してリアルタイム監視する

2. Python を使用して opencv ライブラリ関数を呼び出し、画像を処理します

2.1 画像処理の大まかな流れ

(1) カメラデバイスの電源をオンにします

(2) 画像はフレーム処理(1 フレームごとの処理)され、while ループで最初にカメラから 1 フレームの画像が読み込まれます。

(3) グレースケール画像処理。前のフレーム画像が空かどうかを判断します。空の場合は、画像のフレームを割り当てて画像のグレースケール処理を実行します。空でない場合は、画像のグレースケール処理も実行します。

(4)フレーム差分法。前フレーム画像と今回フレーム画像を用いて差分処理を行う。

(5)二値化画像処理。フレーム差分法の後の画像に対して二値化処理を行う。

(6)メディアンフィルタ処理

(7) クローズド操作、エロージョン、エクスパンション処理。

(8) 動画に対して輪郭検出を行い、座標セットを返す

(9) 座標を使用してターゲットをフレーム化します。

(10) 画像を表示し、処理後の画像を前のフレームの画像に変更します。

2.2 opencv call関数のパラメータと意味

2.2.1 ret, img = cap.read() フレーム画像の読み込み

cap は、カメラ デバイス 0 によってキャプチャされたカメラ画像データです (例: cap = cv2.VideoCapture(0) );

read() はカメラから画像のフレームを読み取るための opencv ライブラリ関数であり、cap.read() はカメラ デバイス 0 によって読み取られた画像のフレームを取得するためのものです。

img はカメラ デバイス 0 によって読み取られた画像のフレームであり、画像形式は BGR です。

ret は bool 型で、読み取りが成功した場合は True を返し、失敗した場合は False を返します。

2.2.2 cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) グレースケール画像

img: 変換する画像。

cv2.COLOR_BGR2GRAY: BGR 形式の画像をグレースケール画像に変換します。

grey = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) grey は変換されたグレースケール画像です

2.2.3 grey_diff_img = cv2.absdiff(gray_img,Previous_img) 帧差法

cv2.absdiff(a,b) : a と b は両方とも画像のフレームです。

画像の 2 つのフレーム間の違いを比較します (例: モーション検出中は、移動オブジェクトのみが移動しますが、背景は移動しません。 cv2.absdiff(a,b) は、背景を含む移動オブジェクトの画像を取得します。削除されましたgrey_diff_img は、2 フレームの処理後の画像のフレームです。

2.2.4  cv2.threshold(src, thresh, maxval, type)の二値化処理

src: 渡された画像のフレーム。

thresh: しきい値 (値の範囲は 0 ~ 255、光の強度に応じて選択されます)

maxval: 塗りつぶしの色 (値の範囲は 0 ~ 255、通常は 2 値化された画像の場合は 255 を選択します)

タイプ: 以下に示すように

 thresh_img = cv2.threshold(gray_diff_img, 40, 255, cv2.THRESH_BINARY)

結果として得られる二値化画像 thresh_img

2.2.5 cv2.medianBlur(src, ksize) メディアン フィルター

src は処理する画像です。

ksize はフィルター カーネルのサイズです。フィルター カーネル サイズは、フィルター処理中の近隣イメージの高さと幅を指します。コア サイズは 3、5、7 など、1 より大きい奇数でなければならないことに注意してください。 
例:mask_img = cv2.medianBlur(thresh_img, 3) 

2.2.6 np.ones(shape, dtype=None, order='C')

shape: 配列のサイズを定義する int または int のタプルです。

dtype: はオプションのパラメータで、デフォルト値は float です。int などの配列のデータ型を指定するために使用されます。

order: 順序は、多次元配列を行優先 (C スタイル) または列優先 (Fortran スタイル) のどちらの順序でメモリに格納するかを定義します。書く必要はなく、デフォルトのままです。

例:k = np.ones((3, 3), np.uint8) 

サイズ 1 の (1,1) の小さな行列は、3 行 3 列の大きな行列を形成する単位であり、型は uint8 です。(正確な理由はわかりませんが、おそらく画像のサイズを意味していると思います)

2.2.7 cv2.morphologyEx(src, op, kernel) 

src: は処理する必要がある画像です。

OP:

cv2.MORPH_OPEN: オープン操作。イメージを腐食してから拡張します。これは dilate(erode(src,kernal)) と同等です。オープン操作は、イメージの境界を滑らかにし、バンプを削除します。 cv2.MORPH_CLOSE: クローズ操作、最初にイメージを実行します
。拡張と腐食を実行します。これは、erode(dilate(src,kernal)) と同等であり、閉じる操作は、イメージ内の小さな穴を埋める、イメージのくぼみを埋めるなどに使用されます。

kernel: 画像サイズを表す配列をカーネルとして入力します。(私もよく分かりません)

例 close = cv2.morphologyEx(mask_img, cv2.MORPH_CLOSE, k)

2.2.8 cv2.findContours(画像,モード,メソッド)

image  : 入力画像を表します。入力イメージはバイナリ イメージである必要があることに注意してください入力画像がカラー画像の場合は、最初にグレースケール化して 2 値化する必要があります。

mode  : アウトラインの取得モードを示します。次の 4 種類があります。

cv2.RETR_EXTERNAL は、外側の輪郭のみを検出することを意味します。

cv2.RETR_LIST によって検出された輪郭は、階層関係を確立しません。

 cv2.RETR_CCOMP は 2 レベルの輪郭を確立します。上の層は外側の境界、内側の層は内側の穴の境界情報です。内側の穴に別の接続されたオブジェクトがある場合、このオブジェクトの境界も最上層にあります。

cv2.RETR_TREE は、階層ツリー構造のアウトラインを構築します。

Method輪郭の近似方法。4 種類あります。
cv2.CHAIN_APPROX_NONE はすべての輪郭点を格納し、隣接する 2 つの点間のピクセル位置の差が 1 を超えない、つまり max(abs(x1-x2), abs(y2-) y1 ))<=1。
cv2.CHAIN_APPROX_SIMPLE は、水平方向、垂直方向、斜め方向の要素を圧縮し、その方向の終了座標のみを保持します。たとえば、長方形の輪郭の場合、輪郭情報を保存するのに必要な点は 4 つだけです。
 cv2.CHAIN_APPROX_TC89_L1 および cv2.CHAIN_APPROX_TC89_KCOS は、teh-Chinl チェーン近似アルゴリズムを使用します。

関数戻り値contours : 複数の輪郭を返します (複数の動体フレームを返します)。各輪郭の単位は点集合 (つまり、輪郭サイズ) です。

例:cnts = cv2.findContours(close_img,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)

2.2.9 cv2.contourArea() 輪郭面積の計算

2.2.10 cv2.boundingRect()はアウトラインフレームの座標を返します

x、y、w、h = cv2.boundingRect(c) 、x、y、w、h は輪郭の座標長さ、c は輪郭のサブセットです

2.2.11 cv2.rectangle() 座標接続、フレーム輪郭

cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2) 

画像、長方形の左上隅の座標、長方形の右下隅の座標、フォントの色、フォントの太さ

2.2.12 cv2.imshow()ウィンドウの表示イメージ

 cv2.imshow("name", img) "name" はウィンドウ名、img はウィンドウ表示イメージです。

3. 処理コード

import cv2
import time
import numpy as np

def videos():
    cap = cv2.VideoCapture(0)
    cap.set(3, 640)
    cap.set(4, 480)
    cap.set(5,40)
    
    img_num = 0
    k = np.ones((3, 3), np.uint8)  

    while True:
        ret, img = cap.read()

        if not img_num:
            previous = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        gray_diff = cv2.absdiff(gray, previous)  
        thresh = cv2.threshold(gray_diff, 40, 255, cv2.THRESH_BINARY)[1] 
        mask = cv2.medianBlur(thresh, 3) 
        close = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, k) 

        cnts = cv2.findContours(close,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)[0] 
        for c in cnts:   
            area = cv2.contourArea(c)
            if area > 200:
                x, y, w, h = cv2.boundingRect(c)
                cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)

        cv2.imshow("thresh_img", close)
        cv2.imshow("Result", img)
        img_num += 1

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

videos()

左上が太陽光の影響で少し白くなっています。

 

 

おすすめ

転載: blog.csdn.net/qq_51679917/article/details/130440779