マシンビジョン(4)-マシンビジョンアプリケーション

マシンビジョン(4)-マシンビジョンアプリケーション

1つは、顔認識

顔認識は、入力画像内の顔の位置、サイズ、および姿勢(存在する場合)を決定する必要があり、生体認証、ビデオモニタリング、人間とコンピューターの相互作用などのアプリケーションでよく使用されます。2001年、ViolaとJonesは、Haar機能に基づくカスケード分類器オブジェクト検出アルゴリズムを提案しました。これは2002年にLienhartとMaydtによって改良され、高速で信頼性の高い顔検出アプリケーションに効果的な方法を提供します。OpenCVは、アルゴリズムのオープンソース実装を統合し、分類器のトレーニングに多数のサンプルのHaar機能を使用し、トレーニングされたウォーターフォールカスケード分類器カスケードを呼び出してパターンマッチングを行います。
OpenCVの顔認識アルゴリズムは、最初に取得した画像をグレースケールに変換し、エッジ処理とノイズフィルタリングを実行します。次に、画像を縮小し、ヒストグラムを均等化し、一致する分類器を、分類器と一致するまで同じ倍数で拡大します。サイズが検出された画像よりも大きい場合、マッチング結果が返されます。マッチングプロセスでは、前面や側面など、カスケード分類器のさまざまなタイプに従ってマッチングを実行できます。
OpenCVは顔認識アルゴリズムを統合しており、顔認識の機能を実現するには、OpenCVの対応するインターフェイスを呼び出すだけで済みます。
ソースコードの実現
1.初期化部分
初期化部分は、主にROSノード、画像、認識パラメータの設定を完了します。

def __init__(self):
        rospy.on_shutdown(self.cleanup);
 
        # 创建cv_bridge
        self.bridge = CvBridge()
        self.image_pub = rospy.Publisher("cv_bridge_image", Image, queue_size=1)
 
        # 获取haar特征的级联表的XML文件,文件路径在launch文件中传入
        cascade_1 = rospy.get_param("~cascade_1", "")
        cascade_2 = rospy.get_param("~cascade_2", "")
 
        # 使用级联表初始化haar特征检测器
        self.cascade_1 = cv2.CascadeClassifier(cascade_1)
        self.cascade_2 = cv2.CascadeClassifier(cascade_2)
 
        # 设置级联表的参数,优化人脸识别,可以在launch文件中重新配置
        self.haar_scaleFactor  = rospy.get_param("~haar_scaleFactor", 1.2)
        self.haar_minNeighbors = rospy.get_param("~haar_minNeighbors", 2)
        self.haar_minSize      = rospy.get_param("~haar_minSize", 40)
        self.haar_maxSize      = rospy.get_param("~haar_maxSize", 60)
        self.color = (50, 255, 50)
 
        # 初始化订阅rgb格式图像数据的订阅者,此处图像topic的话题名可以在launch文件中重映射
        self.image_sub = rospy.Subscriber("input_rgb_image", Image, self.image_callback, queue_size=1)

2. ROS画像コールバック関数
カメラからリリースされたRGB画像データを受信した、ルーチンノードはコールバック関数に入り、画像をOpenCVデータ形式に変換し、前処理後に顔認識関数の呼び出しを開始し、最終的に認識を公開します結果。

def image_callback(self, data):
        # 使用cv_bridge将ROS的图像数据转换成OpenCV的图像格式
        try:
            cv_image = self.bridge.imgmsg_to_cv2(data, "bgr8")     
            frame = np.array(cv_image, dtype=np.uint8)
        except CvBridgeError, e:
            print e
 
        # 创建灰度图像
        grey_image = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
 
        # 创建平衡直方图,减少光线影响
        grey_image = cv2.equalizeHist(grey_image)
 
        # 尝试检测人脸
        faces_result = self.detect_face(grey_image)
 
        # 在opencv的窗口中框出所有人脸区域
        if len(faces_result)>0:
            for face in faces_result: 
                x, y, w, h = face
                cv2.rectangle(cv_image, (x, y), (x+w, y+h), self.color, 2)
 
        # 将识别后的图像转换成ROS消息并发布
        self.image_pub.publish(self.bridge.cv2_to_imgmsg(cv_image, "bgr8"))

3.顔
認識認識は、OpenCVが提供する顔認識インターフェイスを直接呼び出して、データベース内の顔の特徴を照合します。

def detect_face(self, input_image):
        # 首先匹配正面人脸的模型
        if self.cascade_1:
            faces = self.cascade_1.detectMultiScale(input_image, 
                    self.haar_scaleFactor, 
                    self.haar_minNeighbors, 
                    cv2.CASCADE_SCALE_IMAGE, 
                    (self.haar_minSize, self.haar_maxSize))
                                         
        # 如果正面人脸匹配失败,那么就尝试匹配侧面人脸的模型
        if len(faces) == 0 and self.cascade_2:
            faces = self.cascade_2.detectMultiScale(input_image, 
                    self.haar_scaleFactor, 
                    self.haar_minNeighbors, 
                    cv2.CASCADE_SCALE_IMAGE, 
                    (self.haar_minSize, self.haar_maxSize))
        
        return faces

コードには起動ファイルに設定する必要のあるパラメーターとトピック名がいくつかあるため、ルーチンを実行するには起動ファイルも作成する必要があります。

<launch>
    <node pkg="test2" name="face_detector" type="face_detector.py" output="screen">
        <remap from="input_rgb_image" to="/usb_cam/image_raw" />
        <rosparam>
            haar_scaleFactor: 1.2
            haar_minNeighbors: 2
            haar_minSize: 40
            haar_maxSize: 60
        </rosparam>
        <param name="cascade_1" value="$(find robot_vision)/data/haar_detectors/haarcascade_frontalface_alt.xml" />
        <param name="cascade_2" value="$(find robot_vision)/data/haar_detectors/haarcascade_profileface.xml" />
    </node>
</launch>

2.オブジェクトトラッキング

物体追跡と物体認識には類似点があり、同じ特徴点検出方法が使用されますが、焦点が異なります。オブジェクト認識のオブジェクトは静的または動的であり、オブジェクトの特徴点に基づいて確立されたモデルが認識のデータベースとして使用されます。オブジェクトトラッキングはオブジェクトの位置の正確な位置を強調し、入力画像は通常、次のことを行う必要があります。動的特性を持っています。
オブジェクト追跡機能は、最初に入力画像ストリームと追跡対象の選択されたオブジェクトに従って画像の現在のフレーム内のオブジェクトの特徴点をサンプリングし、次に現在のフレームと次のフレームのグレー値を比較して特性を推定します現在のフレーム内の追跡対象の位置画像の次のフレーム内のポイントの位置。次に、同じ位置で特徴点をフィルタリングします。残りの点は、画像の2番目のフレーム内の追跡対象の特徴点です。特徴点クラスターは、追跡オブジェクトの場所です。この機能は、OpenCVが提供する画像処理アルゴリズムに基づいています。
背景が無地で色の違いが大きいテストオブジェクトを選択してみてください。画面内で認識されたオブジェクトを移動すると、長方形のフレームが移動するオブジェクトのリアルタイムの位置を識別し、認識領域、しきい値、およびその他のパラメータを実験環境に合わせて調整できることがわかります。
ソースコードの実現
1.初期化部分
初期化部分は、主にROSノード、画像、認識パラメータの設定を完了します。

def __init__(self):
        rospy.on_shutdown(self.cleanup);
 
        # 创建cv_bridge
        self.bridge = CvBridge()
        self.image_pub = rospy.Publisher("cv_bridge_image", Image, queue_size=1)
 
        # 设置参数:最小区域、阈值
        self.minArea   = rospy.get_param("~minArea",   500)
        self.threshold = rospy.get_param("~threshold", 25)
 
        self.firstFrame = None
        self.text = "Unoccupied"
 
        # 初始化订阅rgb格式图像数据的订阅者,此处图像topic的话题名可以在launch文件中重映射
        self.image_sub = rospy.Subscriber("input_rgb_image", Image, self.image_callback, queue_size=1)

2.画像​​処理
ルーチンノードは、カメラから解放されたRGB画像データを受信した後、コールバック関数に入り、画像をOpenCV形式に変換します。画像の前処理が完了すると、2つの画像フレームが比較され、移動するオブジェクトが比較されます。画像の違いに基づいて識別されます。認識結果を識別して公開します。

def image_callback(self, data):
        # 使用cv_bridge将ROS的图像数据转换成OpenCV的图像格式
        try:
            cv_image = self.bridge.imgmsg_to_cv2(data, "bgr8")     
            frame = np.array(cv_image, dtype=np.uint8)
        except CvBridgeError, e:
            print e
 
        # 创建灰度图像
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        gray = cv2.GaussianBlur(gray, (21, 21), 0)
 
        # 使用两帧图像做比较,检测移动物体的区域
        if self.firstFrame is None:
            self.firstFrame = gray
            return  
        frameDelta = cv2.absdiff(self.firstFrame, gray)
        thresh = cv2.threshold(frameDelta, self.threshold, 255, cv2.THRESH_BINARY)[1]
 
        thresh = cv2.dilate(thresh, None, iterations=2)
        binary, cnts, hierarchy= cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
 
        for c in cnts:
            # 如果检测到的区域小于设置值,则忽略
            if cv2.contourArea(c) < self.minArea:
               continue 
 
            # 在输出画面上框出识别到的物体
            (x, y, w, h) = cv2.boundingRect(c)
            cv2.rectangle(frame, (x, y), (x + w, y + h), (50, 255, 50), 2)
            self.text = "Occupied"
 
        # 在输出画面上打当前状态和时间戳信息
        cv2.putText(frame, "Status: {}".format(self.text), (10, 20),
            cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)
 
        # 将识别后的图像转换成ROS消息并发布
        self.image_pub.publish(self.bridge.cv2_to_imgmsg(frame, "bgr8"))

コードには起動ファイルに設定する必要のあるパラメーターとトピック名がいくつかあるため、ルーチンを実行するには起動ファイルも作成する必要があります。

<launch>
    <node pkg="test2" name="motion_detector" type="motion_detector.py" output="screen">
        <remap from="input_rgb_image" to="/usb_cam/image_raw" />
        <rosparam>
            minArea: 500
            threshold: 25
        </rosparam>
    </node>
</launch>

3、QRコード認識

2次元コードは、生活の中でますます多くのシーンで使用されています。ショッピングモールでの買い物でも、自転車の共有でも、2次元コードは入り口の標識として広く使用されています。ROSはさまざまなQRコード認識関数パッケージを提供します-(ar_track_alvar)
1。ar_track_alvar関数パッケージ
関数パッケージar_track_alvarのインストールは非常に簡単で、次のコマンドを使用するだけです。

sudo apt-get install ros-kinetic-ar-track-alvar

インストールが完了したら、ROSのデフォルトのインストールディレクトリでar_track_alvar関数パッケージを見つけます。関数パッケージの下にある起動フォルダーを開くと、複数の起動ファイルが表示されます。これらはPR2ロボットが使用するQRコード認識ルーチンであり、これらのファイルに基づいて変更できるため、マシンビジョンにQRコード認識の機能があります。
2. QRコードの作成
ar_track_alvar関数パッケージは、QRコードラベルを生成する機能を提供します。次のコマンドを使用して、対応するラベルを持つQRコードラベルを作成できます。

rosrun ar_track_alvar createMarker AR_ID

AR_IDには、0〜65535の任意の数値を指定できます。次に例を示します。

rosrun ar_track_alvar createMarker 0

ラベルが0のQRコードラベル画像を作成し、MarkerData_0.pngという名前を付けて、端末の現在のパスの下に配置できます。システム画像ビューアを直接使用して、QRコードファイルを開くこともできます。
createMarkerツールには、構成可能な多くのパラメーターもあります。ヘルプを表示するには、次のコマンドを使用してください。

rosrun ar_track_alvar createMarker

createMarkerは、デジタルラベルを使用してQRコードラベルを生成できるだけでなく、文字列、ファイル名、URLなどを使用できます。また、-sパラメータを使用して、生成されるQRコードのサイズを設定することもできます。
次のコマンドを使用して、一連のQRコードラベルを作成できます。

roscd robot_vision/config
rosrun ar_track_alvar createMarker -s 5 0
rosrun ar_track_alvar createMarker -s 5 1
rosrun ar_track_alvar createMarker -s 5 2

3.カメラ認識QRコード
ar_track_alvar関数パッケージは、individualNoKinectとindividualMarkersの2つの異なる認識ノードにそれぞれ対応するQRコードを認識する視覚センサーとしてUSBカメラまたはRGB-Dカメラをサポートします。
4. Kinectは2
次元コードを認識します。KinectなどのRGB-Dカメラを使用して、2次元コードを認識することもできます。

第四に、物体認識

ROSは、強力なオブジェクト認識フレームワークであるオブジェクト認識キッチン(ORK)を統合します。これには、さまざまな3次元オブジェクト認識方法が含まれています。
1.ORK関数パッケージ
操作はUbuntu16.04で実行されます。このバージョンのkineticはすべてのORK関数パッケージを統合しているわけではないため、ソースコードをインストールするには次の手順が必要です。
まず、次のコマンドを使用して依存ライブラリをインストールします。

sudo apt-get install meshlab
sudo apt-get install libosmesa6-dev
sudo apt-get install python-pyside.qtcore
sudo apt-get install python-pyside.qtgui

rosinstallファイルをダウンロードし、
ファイルリンクをコンパイルします。https://github.com/wg-perception/object_recognition_core
ここに画像の説明を挿入
新しいork_wsワークスペースを作成し、ork.rosinstall.kinetic.plusファイルをork_wsに直接ダウンロードして、次の手順に従います。

cd ork_ws
wstool init src [文件路径]/ork.rosinstall.kinetic.plus

機能のソースコードをダウンロードします。

cd src
wstool update -j8
git clone https://github.com/jbohren/xdot.git
cd ..
rosdep install --from-paths src -i -y

コンパイル:

cd ork_ws
catkin_make

オブジェクト認識プロセス:
(1)認識が必要なオブジェクトモデルを作成します
(2)モデルを
トレーニングして認識モデルを生成します(3)トレーニングされた認識モデルをオブジェクト認識に使用します
2.オブジェクトモデルライブラリを構築します
データベース
作成しますCouchDBをインストールしますツール:

sudo apt-get install couchdb

インストールが成功したかどうかをテストします。

curl -X GET http://localhost:5984

Cokeモデルデータを作成します。

rosrun object_recognition_core object_add.py -n "coke " -d "A universal can of coke " --commit

ここに画像の説明を挿入
3Dモデルをロードする
既存のcoke.stlモデルをダウンロードし、github経由でダウンロードします。

git clone https://github.com/wg-perception/ork_tutorials

srcファイルにダウンロードしてから、
Cokeモデルをデータベースにロードします。

rosrun object_recognition_core mesh_add.py 49cce25ad1745bc78d8c16a90200008e [path]/ork_tutorials/data/coke.stl --commit

モデルを表示します。

sudo pip install git+https://github.com/couchapp/couchapp.git
rosrun object_recognition_core push.sh

ここに画像の説明を挿入
クリックobject_listing:
ここに画像の説明を挿入
クリックメッシュ:
ここに画像の説明を挿入
3。モデルトレーニング
データベースには多くのモデルがロードされており、一致するテンプレートを生成するためにトレーニングする必要があります。
コマンドは次のとおりです。

sudo object_recognition_core training -c `rospack find object_recognition_linemod`/conf/training.ork

4.3次元オブジェクト認識

おすすめ

転載: blog.csdn.net/weixin_45661757/article/details/113257306