工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

自動ビジョンオブジェクト追跡

カメラが視覚を使用してカラーオブジェクトを自動的に追跡するのを支援するパン/チルトサーボデバイス。

ストーリー

はじめに

前回のチュートリアルでは、PiCamを配置するためにパン/チルトサーボデバイスを制御する方法について説明しました。次に、デバイスを使用して、カメラがカラーオブジェクトを自動的に追跡できるようにします

これはOpenCVでの初めての経験であり、告白しなければなりません。この素晴らしい「オープンソースコンピュータービジョンライブラリ」が大好きです。

OpenCVは、学術的および商用の両方で無料で使用できます。 C ++、C、Python、Javaインターフェースを備えており、Windows、Linux、Mac OS、iOS、Androidをサポートしています。私の一連のOpenCVチュートリアルでは、Raspberry Pi(つまり、OSとしてのRaspbian)とPythonに焦点を当てます。 OpenCVは、計算効率を重視し、リアルタイムアプリケーションに重点を置いて設計されました。したがって、物理コンピューティングプロジェクトに最適です!

ステップ1:BOM –部品表

主要部品:

  • Raspberry Pi V3 – US $ 32.00
  • 5メガピクセル1080pセンサーOV5647ミニカメラビデオモジュール– US $ 13.00
  • TowerPro SG90 9G 180度マイクロサーボ(2 X)-US $ 4.00
  • ミニパン/ティルトカメラプラットフォーム防振カメラマウント、2サーボ付き(*)– US $ 8.00
  • LEDレッド
  • 抵抗220オーム
  • 抵抗1Kオーム(2X)–オプション
  • その他:金属部品、バンドなど(パン/チルトメカニズムを構築する場合)

(*)サーボ付きの完全なパン/チルトプラットフォームを購入するか、独自に構築することができます。

ステップ2:OpenCV3パッケージをインストールする

Raspbian(Stretch)の最新バージョンに更新されたRaspberry Pi V3を使用しているため、OpenCVをインストールする最善の方法は、Adrian Rosebrockによって開発された優れたチュートリアルに従うことです:Raspbian Stretch:Install RaspberryPi上のOpenCV3 + Python。

PiにOpenCVをインストールするためにいくつかの異なるガイドを試しました。エイドリアンのチュートリアルは最高です。彼のガイドラインに従って、同じことを行うことをお勧めします。

エイドリアンのチュートリアルを終了したら、Piで実験を実行するためのOpenCV仮想環境を用意する必要があります。

仮想環境に移動して、OpenCV3が正しくインストールされていることを確認しましょう。

エイドリアンは、システム変数が正しく設定されていることを確認するために、新しいターミナルを開くたびにコマンド「source」を実行することをお勧めします。

ソース〜/ .profile 

次に、仮想環境に入りましょう:

 workon cv 

プロンプトの前にテキスト(cv)が表示されている場合は、 cv virtual 環境:

(cv)pi @ raspberry:〜$ 
エイドリアンは cvPython仮想環境に注意を促します は完全に独立しており、RaspbianStretchのダウンロードに含まれているデフォルトのPythonバージョンから隔離されています。そのため、グローバルsite-packagesディレクトリ内のPythonパッケージは、cv仮想環境では使用できません。同様に、cvのsite-packagesにインストールされているPythonパッケージは、Pythonのグローバルインストールでは使用できません。

ここで、Pythonインタープリターを入力します:

 python 
そして3.5(またはそれ以上)バージョンを実行していることを確認します

インタープリター内(「>>>」が表示されます)で、OpenCVライブラリをインポートします:

 import cv2 

エラーメッセージが表示されない場合、OpenCVはPython仮想環境に正しくインストールされています。

インストールされているOpenCVのバージョンを確認することもできます:

 cv2 .__ version __ 

3.3.0(または将来リリースされる可能性のある優れたバージョン)が表示されるはずです。上記のTerminalPrintScreenは、前の手順を示しています。

ステップ3:カメラをテストする

RPiにOpenCVをインストールしたら、カメラが正しく機能しているかどうかをテストしましょう。

ラズベリーパイにすでにPiCamがインストールされていることを前提としています。

IDEに以下のPythonコードを入力してください:

 import numpy as npimport cv2cap =cv2.VideoCapture(0)while(True):ret、frame =cap.read()frame =cv2.flip(frame、-1)#カメラを垂直に反転灰色=cv2.cvtColor(frame、cv2.COLOR_BGR2GRAY)cv2.imshow( 'frame'、frame)cv2.imshow( 'gray'、gray)if cv2.waitKey(1)&0xFF ==ord( 'q'): breakcap.release()cv2.destroyAllWindows()

上記のコードは、PiCamによって生成されるビデオストリームをキャプチャし、BGRカラーとグレーモードの両方で表示します。

カメラの組み立て方法により、カメラを垂直に回転させたことに注意してください。そうでない場合は、「flip」コマンドラインにコメントを付けるか削除してください。

または、GitHubからコードをダウンロードすることもできます:simpleCamTest.py

実行するには、次のコマンドを入力します:

 python simpleCamTest.py 

プログラムを終了するには、キーボードの[q]または[Ctrl] + [C]キーを押す必要があります

写真は結果を示しています。

OpenCVの詳細については、チュートリアル「loading -video-python-opencv-tutorial

」に従ってください。

ステップ4:OpenCVを使用したPythonでの色検出

私たちが達成しようとすることの1つは、特定の色のオブジェクトの検出と追跡です。そのためには、OpenCVが色を解釈する方法についてもう少し理解する必要があります。

Henri Dangは、OpenCVを使用したPythonでの色検出に関する優れたチュートリアルを作成しました。

通常、私たちのカメラはRGBカラーモードで動作します。これは、赤、緑、青の3色のライトから作成できるすべての可能な色と考えると理解できます。ここでは、代わりにBGR(青、緑、赤)を使用します。

上記のように、BGRを使用すると、ピクセルは青、緑、赤の3つのパラメーターで表されます。各パラメーターの値は通常、0〜255(または、16進数でO〜FF)です。たとえば、コンピュータ画面の真っ青なピクセルのB値は255、G値は0、R値は0になります。

OpenCVはHSV(色相、彩度、値)カラーモデルで動作します。これは、1970年代にコンピューターグラフィックスの研究者によって人間のやり方とより密接に一致するように設計されたRGBカラーモデルの代替表現です。ビジョンは色を作る属性を認識します:

すばらしい。したがって、OpenCVを使用して特定の色を追跡する場合は、HSVモデルを使用してその色を定義する必要があります。

上の写真に示されているプラ​​スチックの箱のように、黄色のオブジェクトを追跡する必要があるとしましょう。簡単な部分は、そのBGR要素を見つけることです。任意のデザインプログラムを使用して見つけることができます(私はPowerPointを使用しました)。

私の場合は次のことがわかりました:

  • 青:71
  • 緑:234
  • 赤:213

次に、BGR(71、234、213)モデルをHSVモデルに変換する必要があります。このモデルは、範囲の上限と下限で定義されます。そのために、以下のコードを実行してみましょう:

インポートsysimportnumpy as npimport cv2blue =sys.argv [1] green =sys.argv [2] red =sys.argv [3] color =np.uint8([[[blue、green 、red]]])hsv_color =cv2.cvtColor(color、cv2.COLOR_BGR2HSV)hue =hsv_color [0] [0] [0] print( "下限は:")、print( "[" + str(hue- 10)+ "、100、100] \ n")print( "上限は:")、print( "[" + str(hue + 10)+ "、255、255]")

または、GitHubからコードをダウンロードすることもできます:bgr_hsv_converter.py

実行するには、前に見つかったBGR値をパラメーターとして持つ以下のコマンドを入力します。

 python bgr_hsv_converter.py 71 234 213 
プログラムはオブジェクトの色の上限と下限を印刷します。

この場合:

下限:[24、100、100] 
および

上界:[44、255、255] 
ターミナルのPrintScreenに結果が表示されます。

最後になりましたが、重要なことですが、色を決定した後、OpenCVがオブジェクトを「マスク」する方法を見てみましょう。

 import cv2import numpy as np#画像を読む-1は、BGRimg =cv2.imread( 'yellow_object.JPG'、1)の画像が必要であることを意味します#各axisimgでimagのサイズを20%に変更します=cv2.resize(img、(0,0)、fx =0.2、fy =0.2)#BGR画像をHSV画像に変換hsv =cv2.cvtColor(img、cv2.COLOR_BGR2HSV)#NumPyを使用して、上下を保持する配列を作成しますrange#「dtype =np.uint8」は、データ型が8ビットであることを意味しますintegerlower_range =np.array([24、100、100]、dtype =np.uint8)upper_range =np.array([44、255、255 ]、dtype =np.uint8)#imagemask =cv2.inRange(hsv、lower_range、upper_range)#のマスクを作成します#マスクと画像の両方を並べて表示しますcv2.imshow( 'mask'、mask)cv2.imshow ( 'image'、img)#ユーザーが[ESC]を押すのを待つwhile(1):k =cv2.waitKey(0)if(k ==27):breakcv2.destroyAllWindows()

または、GitHubからコードをダウンロードすることもできます:colorDetection.py

実行するには、次のコマンドを入力して、ディレクトリにターゲットオブジェクト(私の場合はyellow_object.JPG)の写真を入れます。

 python colorDetection.py 

上の画像は、元の画像( "image")と、マスクが適用された後のオブジェクトの表示( "mask")を示しています。

ステップ5:オブジェクトの動きの追跡

マスクを使用してオブジェクトを「選択」する方法がわかったので、カメラを使用してオブジェクトの動きをリアルタイムで追跡しましょう。そのために、OpenCVチュートリアルを使用したエイドリアンローズブロックのボールトラッキングに基づいてコードを作成しました。

エイドリアンのチュートリアルを詳しく読むことを強くお勧めします。

まず、 imutilsライブラリがあるかどうかを確認します インストールされています。これは、いくつかの基本的なタスク(サイズ変更や画面の反転など)をはるかに簡単にする、AdrianのOpenCVコンビニエンス関数のコレクションです。そうでない場合は、以下のコマンドを入力して、仮想Python環境にライブラリをインストールします。

 pip install imutils 

次に、GitHubからコードball_tracking.pyをダウンロードし、次のコマンドを使用して実行します。

 python ball_traking.py 

基本的に、次の行で取得した「ビデオ垂直フリップ」を除いて、エイドリアンと同じコードです。

 frame =imutils.rotate(frame、angle =180)

また、使用されたマスク境界は前のステップで取得したものであることに注意してください。

ステップ6:GPIOをテストする

OpenCVの基本を試したので、RPiにLEDを取り付けて、GPIOとの対話を開始しましょう。

上記の電気回路図に従ってください:LEDのカソードはGPIO 21に接続され、アノードは220オームの抵抗を介してGNDに接続されます。

仮想Python環境内でLEDをテストしてみましょう。

RPi.GPIOがPython仮想環境にインストールされていない可能性があることに注意してください!この問題を修正するには、そこに着いたら((cv)がターミナルにあることを確認してください)、pipを使用して仮想環境にインストールする必要があります:

 pip install RPi.GPIO 

Pythonスクリプトを使用して簡単なテストを実行しましょう:

 import sysimport timeimport RPi.GPIO as GPIO#initialize GPIO and VariablesredLed =int(sys.argv [1])freq =int(sys.argv [2])GPIO.setmode(GPIO.BCM )GPIO.setup(redLed、GPIO.OUT)GPIO.setwarnings(False)print( "\ n [INFO] {1}秒ごとにGPIO {0}で接続されたLEDの点滅(5回)"。format( redLed、freq))for i in range(5):GPIO.output(redLed、GPIO.LOW)time.sleep(freq)GPIO.output(redLed、GPIO.HIGH)time.sleep(freq)#少しやりますcleanupprint( "\ n [INFO]プログラムとクリーンアップを終了します\ n")GPIO.cleanup()

このコードは、引数としてGPIO番号と、LEDが点滅する秒数を受け取ります。 LEDが5回点滅し、プログラムが終了します。終了する前に、GPIOを解放することに注意してください。

したがって、スクリプトを実行するには、パラメータとして LED GPIO を入力する必要があります。 、および頻度

例:

 python LED_simple_test.py 21 1 
上記のコマンドは、「GPIO21」に接続された赤いLEDを「1」秒ごとに5回点滅させます。

ファイルGPIO_LED_test.pyはGitHubからダウンロードできます

上記のターミナル印刷画面に結果が表示されます(もちろん、LEDが点滅していることを確認する必要があります。

それでは、OpenCVといくつかの基本的なGPIO関連のものを使ってみましょう。

ステップ7:色とGPIOの相互作用を認識する

OpenCVコードとGPIOインタラクションの統合を始めましょう。最後のOpenCVコードから始めて、GPIO-RPIライブラリを統合するので、カメラで色付きのオブジェクトが見つかったときはいつでも赤いLEDをオンにします。このステップで使用されたコードは、Raspberry PiのAdrianのすばらしいチュートリアルOpenCV、RPi.GPIO、およびGPIOZeroに基づいています。

最初に行うことは、LEDを「作成」して、特定のGPIOに接続することです。

 RPi.GPIOをGPIOredLedとしてインポート=21GPIO.setmode(GPIO.BCM)GPIO.setwarnings(False)GPIO.setup(redLed、GPIO.OUT)

次に、LEDを初期化する(オフにする)必要があります:

 GPIO.output(redLed、GPIO.LOW)ledOn =False 

ここで、オブジェクトが見つかったときに「円」が作成されるループ内で、LEDをオンにします。

 GPIO.output(redLed、GPIO.HIGH)ledOn =True 

GitHubから完全なコードをダウンロードしましょう:object_detection_LED.py

次のコマンドを使用してコードを実行します:

 python object_detection_LED.py 
さまざまなオブジェクト(色と形式)で試してみてください。マスクの境界内で色が一致すると、LEDがオンになります。

以下のビデオはいくつかの経験を示しています。 LEDをオンにして、色の範囲内にある黄色のオブジェクトのみが検出されることに注意してください。異なる色のオブジェクトは無視されます。

ここでは、最後の手順で説明したように、LEDのみを使用しています。ビデオを撮ったときにパンティルトをすでに組み立てていたので、無視してください。次のステップでは、PAN / TILTメカニズムで処理します。

ステップ8:パンチルトメカニズム

OpenCVとGPIOの基本を試したので、パン/チルトメカニズムをインストールしましょう。

詳細については、チュートリアルをご覧ください:Pan-Tilt-Multi-Servo-Control

サーボは外部5V電源に接続し、データピン(私の場合は黄色の配線)を以下のようにRaspberry PiGPIOに接続する必要があります。

  • GPIO 17 ==>チルトサーボ
  • GPIO 27 ==>パンサーボ
GNDを接続することを忘れないでください==> Raspberry Pi – Servos –外部電源)

オプションとして、Raspberry PiGPIOとサーバーデータ入力ピンの間に1Kオームの抵抗を直列に接続できます。これにより、サーボに問題が発生した場合にRPiが保護されます。

この機会を利用して、仮想Python環境内でサーボをテストしてみましょう。

Pythonスクリプトを使用して、ドライバーでいくつかのテストを実行しましょう:

 from time import sleepimport RPi.GPIO as GPIOGPIO.setmode(GPIO.BCM)GPIO.setwarnings(False)def setServoAngle(servo、angle):pwm =GPIO.PWM(servo、50)pwm .start(8)dutyCycle =angle / 18. + 3. pwm.ChangeDutyCycle(dutyCycle)sleep(0.3)pwm.stop()if __name__ =='__ main __':import sysservo =int(sys.argv [1]) GPIO.setup(servo、GPIO.OUT)setServoAngle(servo、int(sys.argv [2]))GPIO.cleanup()
上記のコードの中核は関数setServoAngle(servo、angle)です。この関数は、引数として、サーボGPIO番号、およびサーボを配置する必要のある角度値を受け取ります。この関数の入力が「角度」になったら、それを同等のデューティサイクルに変換する必要があります。

スクリプトを実行するには、パラメータとしてサーボGPIO を入力する必要があります。 、および角度

例:

 python angleServoCtrl.py 17 45 

上記のコマンドは、GPIO 17(「傾斜」)に接続されたサーボを「仰角」で45度に配置します。

ファイルangleServoCtrl.pyはGitHubからダウンロードできます

ステップ9:オブジェクトのリアルタイム位置を見つける

ここでのアイデアは、パン/チルトメカニズムを使用してオブジェクトを画面の中央に配置することです。悪いニュースは、開始するには、オブジェクトがどこにあるかをリアルタイムで知る必要があるということです。しかし、良いニュースは、オブジェクトの中心の座標がすでにわかっていれば、それは非常に簡単なことです。

まず、前に使用した「object_detect_LED」コードを変更して、作成されたオブジェクトのx、y座標を出力します。

GitHubからコードをダウンロードします:objectDetectCoord.py

コードの「コア」は、オブジェクトを見つけて、その上に赤い点が中央にある円を描く部分です。

#半径が最小サイズを満たしている場合にのみ続行しますif radius> 10:#フレームに円とセントロイドを描画し、#追跡されたポイントのリストを更新しますcv2.circle(frame、(int( x)、int(y))、int(radius)、(0、255、255)、2)cv2.circle(frame、center、5、(0、0、255)、-1)#円の中心を印刷座標mapObjectPosition(int(x)、int(y))#ledがまだオンになっていない場合は、LEDをオンにします。ledOnでない場合:GPIO.output(redLed、GPIO.HIGH)ledOn =True 
中心座標を mapObjectPosition(int(x)、int(y))に「エクスポート」しましょう。 その座標を印刷するための関数。関数の下:

 def mapObjectPosition(x、y):print( "[INFO] Object Center coordenates at X0 ={0} and Y0 ={1}"。format(x、y))
>

プログラムを実行すると、上記のように、端末に(x、y)位置座標が表示されます。オブジェクトを移動し、座標を観察します。 xが0から500(左から右)になり、yがoから350(上から下)になることがわかります。上の写真をご覧ください。

すばらしい!次に、これらの座標をパン/チルト追跡システムの開始点として使用する必要があります

ステップ10:オブジェクト位置追跡システム

オブジェクトを常に画面の中央に配置する必要があります。たとえば、次の場合にオブジェクトを「中央」と見なすように定義しましょう。

  • 220
  • 160

これらの境界の外側では、偏差を補正するためにパン/チルトメカニズムを移動する必要があります。これに基づいて、関数 mapServoPosition(x、y)を作成できます。 以下のように。この関数でパラメーターとして使用される「x」と「y」は、中央位置を印刷するために以前に使用したものと同じであることに注意してください。

#サーボを配置してオブジェクトをframedefの中心に表示def mapServoPosition(x、y):グローバルpanAngleグローバルtiltAngle if(x <220):panAngle + =10 if panAngle> 140:panAngle =140 positionServo(panServo、panAngle)if(x> 280):panAngle- =10 if panAngle <40:panAngle =40 positionServo(panServo、panAngle)if(y <160):tiltAngle + =10 iftiltAngle> 140:tiltAngle =140 positionServo(tiltServo、tiltAngle)if(y> 210):tiltAngle- =10 iftiltAngle <40:tiltAngle =40 positionServo(tiltServo、tiltAngle)

(x、y)座標に基づいて、関数 positionServo(servo、angle)を使用してサーボ位置コマンドが生成されます。 たとえば、yの位置が「50」であると仮定します。これは、オブジェクトが画面のほぼ上部にあることを意味します。これは、「カメラの照準器」が「低い」(たとえば、120度の傾斜角度)と解釈できます。したがって、傾斜角度を「減少」させる必要があります(たとえば、100度まで)。これにより、カメラの照準器が「上」になり、オブジェクトが画面上で「下」になります(たとえば、190度まで増加します)。

上の図は、ジオメトリの観点からの例を示しています。

パンカメラがどのように動作するかを考えてください。画面はミラーリングされていないことに注意してください。つまり、オブジェクトを「左」に移動すると、カメラに反対すると、画面上で「右」に移動します。

関数positionServo(servo、angle)は次のように記述できます:

 def positionServo(servo、angle):os.system( "python angleServoCtrl.py" + str(servo)+ "" + str(angle))print( "[INFO]サーボの配置GPIO {0}から{1}度\ n ".format(servo、angle))
サーボポジショニングのために前に示したスクリプトを呼び出します。

angleServoCtrl.pyはobjectDetectTrac.pyと同じディレクトリにある必要があることに注意してください

完全なコードはGitHubからダウンロードできます:objectDetectTrack.py

ステップ11:結論

いつものように、このプロジェクトが他の人たちがエキサイティングなエレクトロニクスの世界への道を見つけるのに役立つことを願っています!

詳細と最終的なコードについては、GitHubの保管場所であるOpenCV-Object-Face-Tracking

にアクセスしてください。

その他のプロジェクトについては、私のブログMJRoBot.org

にアクセスしてください。 世界南部のサルド!

次のチュートリアルでお会いしましょう!

ありがとうございます

出典: 自動ビジョンオブジェクト追跡


製造プロセス

  1. Python オブジェクト指向プログラミング
  2. ラズベリーパイボール追跡
  3. Speathe
  4. リアルタイムの顔認識:エンドツーエンドのプロジェクト
  5. Python-オブジェクト指向
  6. 動的オブジェクト追跡精度の決定
  7. フィルタは6Dポーズ推定でロボットのビジョンを強化します
  8. 自動プレス機とは?
  9. 自動パワープレスとは?
  10. 自動パイプベンダーとは
  11. 自動回転テーブルとは