文字標識を認識して動作するラズマウス4号機の製作記録

文字認識ラズマウス
文字認識ラズマウス

ラズマウスに取り付けたカメラで標識に書かれた数字を認識して、その数字が意味する動作(左折、右折、前進、後退、停止)を実行するラズマウス4号機の製作記録。
ラズパイの標準フォントの数字を学習させ、ラベルに印字した数字を認識するプログラムは、このサイトの「プログラム事例」の「ラズパイのフォントで学習する文字認識プログラム例」を使った。

●数字を認識するラズマウスの構成部品

文字認識ラズマウス構成
文字認識ラズマウス構成

●プログラム構成

数字を認識するモジュールは、このサイトの「プログラム事例」の「ラズパイのフォントで学習する文字認識プログラム例」のRasRecogNum.pyモジュールをimportして使った。

 (1)ラズマウスの動作停止
 (2)数字標識の画像をキャプチャ
 (3)数字標識ラベルの切り出し
 (4)数字標識の中の数字画像の切り出し
 (5)文字認識学習モデルで数字を認識
 (6)数字に割り付けられた動作開始

<数字標識認識ラズマウスのプログラム事例>
# -*- coding: utf-8 -*-
import RasRecogNum as RRN
import time

def recognizeNo():
    # カメラからの画像をキャプチャして表示
    ret, frame = RRN.cap.read()
    RRN.cv2.namedWindow('VIDEO', cv2.WINDOW_AUTOSIZE)
    RRN.cv2.imshow('VIDEO', frame)

    imgGray, imgThresh = RRN.transImage(frame)		# 解析用の画像変換
    allContours, contLabelAttr = RRN.detectLabelContours(imgThresh)		# ラベル輪郭の検出
            # no:Label輪郭番号、(cx,cy):重心、boxNP:輪郭矩形4コーナー座標、boundR=(xb, yb, wb, hb)
    recogListInLabel = []
    recogNoListInFrame = []
    if len(contLabelAttr) > 0:		# ラベルを1個以上検出した場合
        print("The number of Detected Label =====", len(contLabelAttr))
        for lblNo in range(len(contLabelAttr)):
            imgThreshLabel = RRN.cutImgLabel(contLabelAttr[lblNo], imgThresh)	# ラベル画像(2値化)を切り出し
            mojiRectList = RRN.detectMojiFromLabel(imgThreshLabel, 0.15, 0.2)	# ラベル内の文字輪郭検出
                # mojiRectList=[[ptj1(x,y), ptj2(x,y)],.......]=認識文字のローカル座標
            if len(mojiRectList) > 0:	# 文字輪郭がある場合、数字認識
                strNo, recogNoList = RRN.recognizeNumber(mojiRectList, imgThreshLabel)
                    # strNo:認識した複数の数字(str型)、recogNoList:検出数字リスト(左から順に)Dict型
                print("Recognized Number = ", strNo)
                recogListInLabel.append([lblNo, strNo, recogNoList])
                recogNoListInFrame.append(strNo)
    else:
        print("NG! 認識ラベル無し")
        returnStrNo = ""
    RRN.drawResult(allContours, contLabelAttr, recogListInLabel, frame, imgGray, imgThresh)	# 認識結果の画像表示

    if len(recogNoListInFrame) > 0:	# 画面内に複数の認識数字を検出した場合
        for i in range(len(recogNoListInFrame)):
            strNo = recogNoListInFrame[i]
            ###  登録されている数字なら
                returnStrNo = strNo
            ### 登録されていない数字なら
                returnStrNo = ""
    return returnStrNo

"""メイン関数"""
if __name__ == '__main__':
    while True:
        ### ラズマウスの動作プログラム ###
        ### ラズマウスが停止したら、数字標識を認識するモジュールを呼ぶ
        retNo = recognizeNo()
        ### retNo で 次のラズマウスの動作
        

 

●文字認識ラズマウスの走行テスト

ラズマウスは紙壁に向かって前進し、7cm手前で停止。カメラでキャプチャした画像を処理して、学習モデルから印字している数字を認識。数字にはそれぞれ次の動作が決められており、認識した数字に従って次の動作を実行し、次の紙壁に向かって前進する。今回は4個の紙壁と数字標識を用いて、走行試験をした。

テスト状態と文字標識
テスト状態と文字標識

●文字標識を認識して動作するラズマウス(YouTube)

ラズマウスに取り付けたWEBカメラでキャプチャした標識に書かれた数字を認識して、その数字が意味する動作(左折、右折、前進、後退、停止)を実行するラズマウス4号機。ラズパイの標準フォントの数字を機械学習(ディープラーニング)させ、その学習モデルでラベルに印字した数字を認識する。数字認識学習モデルは、MLPとCNNで行ったが、この事例ではMLPを使った。

数字認識ラズマウスの走行試験