Opencvで読み込んだ画像はnumpy配列になっているのでnumpyのtranposeで転置することで90度回転の準備をする transpose_img = img.transpose(1,0,2) 画像の90度回転 What is going on with this article? 今回解決したい課題は、ネジの向きの判定です。状況としては、次の画像のように3つのレーンがあり、各レーンについて流れてくるネジの向きを判定する、というものです。, テンプレートマッチにより、この課題を解決したいと思います。ネジのテンプレート画像として次のネジの画像を用います。テンプレート画像を準備する上でのポイントは、この画像の背景色を実際の解析対象での背景色と合わせることです。ここでは背景を上の画像と同じく黒くしています。, 下のコードでは、レーンを1度ずつ回転させ、テンプレート画像と最もマッチした角度をネジの角度としています。最後に各レーンについて、ネジの頭が上を向いていた場合に”正しい向きです”と出力するようにしています。なぜテンプレートではなくレーンを回転させる必要があるのでしょうか。それは、テンプレートを回転させてしまうと、斜めになったときに余白ができてしまうからです。この余白も含めてテンプレートマッチが行われるため、これは邪魔になってしまいます。, テンプレートマッチは画素ごとに比較を行うので、回転させる必要があります。回転に不変なSURF特徴量などを使えば回転させずにマッチさせることができますが、やや高度な内容になるので今回は扱いません。, ところで、画像解析と、画像処理が、厳密には異なることをご存知ですか?画像処理が画像の各ピクセルに対する演算を示すのに対し、画像解析はさらに画像から情報を取り出すことを示します。今回の例で言えば、ネジの角度を取り出す、といったようなイメージです。ディジタル画像処理という書籍がありまして、このような画像解析と画像処理の違いを含め、今回の場合でも重要な画像処理、画像解析に適した撮影方法などについても言及されています。プログラミングを習得するための本ではありませんが、実際の問題に画像解析でアプローチする上で読んでおきたい本です。. 入力画像1. ハフ変換で円を検出する. →, ※ この記事の範囲内では、 opencv-contrib-python は opencv-python 大丈夫です。2, を試してみます。 # 輪郭の全長に固定値で 0.1 の係数をかけるので十分 今回は、特徴量が分散しているため、全体的にマッチしていますが、特徴点が一部に偏っている画像の場合は、そこにマッチング状況が良好なものが集中することになります。. ©Copyright2020 OpenCV画像解析入門.All Rights Reserved. ハフ変換は画像中の直線や円などを検出する操作です。 OpenCVで形状のある物体の輪郭と方向を認識する(主成分分析:PCA、固有ベクトル), ■ 動画の処理についてはこちら numpy配列の順番を逆順にする方法でできる. OpenCVを使った顔認識(Haar-like特徴分類器) ただし、 `100 <= x <= 200` とする 回転マッチでネジの向きを判定. エッジ処理 . debag3 :エッジ検出までの画像 2. 学習は、トレーニングデータをそのまま記憶するだけです。学習コストがゼロなため、高速に動作します。怠惰学習アルゴリズムの代表選手です。 「Python/OpenCVで画像の二値化をする方法」 「Python/OpenCVの適応的閾値処理で綺麗な二値化!」 輪郭検出処理. OCRで内容を読み取る準備ができました(内容の読み取りは次の記事で紹介予定) 今回解決したい課題は、ネジの向きの判定です。状況としては、次の画像のように3つのレーンがあり、各レーンについて流れてくるネジの向きを判定する、というものです。 OpenCV の特徴点マッチングの利用して物体検出する方法について紹介します。 物体検出の手順 画像を読み込む. 回転マッチでネジの向きを判定. 画像の切り抜きやチャンネルの分離、画像の一部にのみ他の値を代入するといっ[…], 次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。, OpenCV – バイラテラルフィルタの仕組みと cv2.bilateralFilter の使い方, OpenCV – cv2.LUT の使い方、ガンマ補正、ネガポジ反転、ポスタリゼーション, VSCode – Remote Development をパスワード入力なしで使用する方法. このブログでは初心者が科学技術プログラムを作れるようになることを目標に、学習結果を記録していきます。, 次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。. ここでは物体の特徴量として輪郭情報を検出し、その情報から位置座標を取得する方法を紹介します. Canny -openCV. imread ( "IMG_4754s.JPG" ) # A-KAZE検出器の生成 detector = cv2 . By following users and tags, you can catch up information on technical fields that you are interested in as a whole, By "stocking" the articles you like, you can search right away. 探索空間から最近傍のラベルをK個探索する方法として、OpenCVは、総当たり法(Brute-Force)と高速近似近傍探索法(FLANN)をサポートしています。, 高速近似近傍探索法(FLANN: Fast Library for Approximate Nearest Neighbors) 動機. 今回解決したい課題は、ネジの向きの判定です。状況としては、次の画像のように3つのレーンがあり、各レーンについて流れてくるネジの向きを判定する、というものです。 動機. you can read useful information later efficiently. ("●"が"あ"と認識されていてなかなか面白いですね), 各点(256x256x256)の情報があるRGBの画像 → 各点(2=1/0)の二値情報の二値画像の変換を行います。これは、輪郭抽出をしやすくするための加工です。 ↩, opencv-contrib-python は open-python に加えて contrib のモジュールも一緒にインポートしてくれます。 opencv-python のところは cv2 でも大丈夫らしいです。ただ、公式のドキュメントを見る限り、新しく入れる分にはこっちの表記にするのが良いみたいです。(参考: https://pypi.org/project/opencv-python/) ↩, こちらの記事 も参考にさせていただきました! tesseractなどのインストールが必要です。 ↩. 物体ごとにマスクを作成する 免許証と同じサイズのカード(nanacoカード)の輪郭を OpenCV で検出し、射影変換することでカードの内容が読みやすいようにしました, 斜め上から撮ったカードを... 動画の中を移動する物体の動きをトラッキング(追跡)することが出来れば、その物体の変位や速度、加速度といった物理量を計算することが出来ます。ここでは、Python/OpenCVを使って動画内物体トラッキングコードの例を紹介します。, こんにちは。wat(@watlablog)です。本日は動画処理の例題として、物体トラッキングの方法を紹介します!, 言葉の使われ方は分野によって様々ですが、例えばマーケティング分野では、インターネットを閲覧しているユーザがどのページを見てどのリンクを辿ったかを調べることもトラッキングと呼びます。, また信号処理の分野では、回転体のFFT分析でわかる回転次数の変化を追うこともトラッキングと呼びます。, このページでは動画内の物体の移動を追跡する内容を扱い、同じくトラッキングと呼びます。, 動画から物体の動きを追跡するという処理は、そのままで軌跡情報が得られていることになります。, 物理や工学の実験では着目している物体がどの方向にどれだけ動いたかを知ることは、事象の理解にとても重要です。, 変位センサ、GPSセンサを付けられる規模であれば良いのですが、微小範囲を取り扱ってセンサを付けることが出来なかったり、そもそもセンサを取付けることで事象の変化が懸念される場合等は動画で分析することが多々あります。, 動画で軌跡や変位が数値としてわかるということは、速度や加速度といった情報も同時に得ることが可能です。, 動画撮影や動画ファイルにはFPS(Frames Per Second)、フレームレートとも呼ばれる時間情報を持っています。, 変位と速度、加速度はそれぞれ時間による微積分関係にあるため、FPS情報が取得できれば算出可能となります。, ここで、物体トラッキング手順の例を紹介していきます。「~例」としているのは、このトラッキング技術はケースによって様々な手法を使い分ける必要があり、万能な方法がないからです。, ここでは物体の特徴量として輪郭情報を検出し、その情報から位置座標を取得する方法を紹介します。, あくまで一例ですので、異なる物体特徴量検出の方法を覚えたらそれは物体トラッキングの手段が増えたことにもなります。, 他の例では、ディープニューラルネットワークを使った検出が最新技術でしょうか。CNNやYOLOといったキーワードで検索すると色々出て来ますね。これらはAI技術ですが、ご興味があればAIカテゴリのページも是非見てみて下さい!, 動画内の物体トラッキングをするためには、まずは動画ファイルを扱う方法を知る必要があります。, 動画といってもパラパラ漫画のような多数のフレームで構成されています。そのため、基本はフレームに対する画像処理をする方法を覚えておけば問題ありません。, 以下の記事はそれぞれ「動画のフレームに対しある画像処理をする」という内容ですので、必要であれば是非ご覧下さい。「Python/OpenCVで動体検知!動画の動いている部分を検出」「Python動画編集!動画に位置制御したテロップを入れる方法」「Pythonでブログの広告が目立つかどうか「動的」に評価する方法」, 輪郭を始めとする様々な特徴量の抽出には、カラー画像をそのまま扱うのではなく、グレースケール化したり二値化したりといった前処理を行うことが一般的です。, 以下の記事はグレースケール化や二値化に関する内容ですので、こちらも必要に応じてご覧下さい。「Python/OpenCVで画像の二値化をする方法」「Python/OpenCVの適応的閾値処理で綺麗な二値化!」, 本題の輪郭抽出方法ですが、輪郭は上記グレースケール化と二値化処理を使って行います。, 詳しくは以下の記事に記載しましたので、併せてご覧下さい。「Python/OpenCVで画像内オブジェクトの輪郭抽出をする」, …かなり適当感はありますが、当WATLABブログのロゴマークを黒い背景の中で動かしてみました。, 先ほどのサンプル動画に対し、物体トラッキングをする全コードを以下に示します。ポイントは輪郭検出を行っているdef関数です。, 輪郭検出で得られたcontoursには輪郭の座標情報が格納されています。この座標情報をx, y軸それぞれで平均をとったものを物体の座標としています。, その他は既に紹介した記事内容と同じです。しかし、今回はカラー画像を扱っているので、VideoWriterの最後の引数がTrueになっている点が注意点です(これをFalseにすると動画が正常に保存されない)。, 以下の動画が実行結果です。移動する物体に対しcv2.circleで円を描画していますが、見事にトラッキング出来ている結果を得ました。, 以下はおまけですが、このコードを先ほどのコードの一番下に追加することで、グラフ表示が出来ます。, 以下のグラフが軌跡です。綺麗な正弦波を得ることが出来ました。縦軸は画像の場合下が正ですが、このグラフは上が正になっていることに注意が必要です。, このように軌跡情報が数値であれば、後は既に得ているFPS情報を使って時間の関数にすることも可能ですね。, 本記事では動画から各フレームを取得し、フレームに対しグレースケール化と二値化処理を施し輪郭抽出を行い、輪郭情報から位置座標を連続的に取得することで軌跡を得るPythonコードを紹介しました。, 動画処理は基本を習得すればどれも同じような流れなので、今後も何か画像処理を覚えたら動画へも応用してみたいと思います。, 今回は輪郭情報からトラッキングをしてみましたが、他にも色々な手法がありそうですね!Twitterでも関連情報をつぶやいているので、wat(@watlablog)のフォローお待ちしています!, 機械工学を専攻し大学院を修了後、
このテストでは、誤検知はないようです。, 特徴量同士のマッチング状況が良好なもののみ表示するようにコードを一部変更してみます。, 先ほどとは別の特徴量が描画されました。 入力画像1の物体を入力画像2から探します。 sample1.jpg. https://www.youtube.com/watch?v=OUbUFn71S4s, ■ インストールと簡単な使い方はこちら OpenCV 3とPython 3で特徴量マッチング(A-KAZE, KNN) # 画像読込 img1 = cv2 . 入力画像2. → こんな感じで角度を補正してカードを表示できるようになりました © Copyright 2020 WATLAB -Python, 信号処理, AI-. # nanacoは0.2くらいが良さそう。免許証の場合はまたチューニングが必要かも, """ 輪郭を取得します。 cv2.Canny. 今回は、OpenCV 3 + Python 3 を使って、下記のような、回転、ズームした画像の特徴量マッチングをしてみます。, OpenCV(Open Source Computer Vision Library)はBSDライセンスの映像/画像処理ライブラリ集です。画像のフィルタ処理、テンプレートマッチング、物体認識、映像解析、機械学習などのアルゴリズムが多数用意されています。, ■ OpenCVを使った動体追跡の例 (OpenCV Google Summer of Code 2015) debag2: グレイスケールまでの画像. Why not register and get more from Qiita? Help us understand the problem. OpenCVで特徴点を抽出する(AgastFeature, FAST, GFTT, MSER, AKAZE, BRISK, KAZE, ORB, SimpleBlob) 2016.10.20 2020.10.16 c++ 応用編. # ある程度まともにカードを写す前提では係数のチューニングはほぼ不要と思われる(OCRの調整では必要かも), # カードの横幅(画像がカードが縦になっているので、射影変換の際にはwidthとheightが逆になっている), you can read useful information later efficiently. OpenCVを使った物体追跡(マウスで指定した特徴点をLucas-Kanade法で追跡する 2016.10.20 2020.10.16 c++ 応用編. Why not register and get more from Qiita? 免許証と同じサイズのカード(nanacoカード)の輪郭を OpenCV で検出し、射影変換することでカードの内容が読みやすいようにしました. 本題の輪郭抽出方法ですが、輪郭は上記グレースケール化と二値化処理を使って行います。 詳しくは以下の記事に記載しましたので、併せてご覧下さい。 ただし、本来なら読み取る部分に制限を加えるなどの必要がありますが、ざっくりやっちゃっています。, nanaco_in_hand.jpeg の画像を使って、最後に得られた画像を pyocr を使って画像全体に関してOCRをかけてみました。 What is going on with this article? 色空間の変換 -OpenCV. 静止画像の処理についてはこちら OpenCVでエッジ検出してみる OpenCVで各種フィルター処理をする(グラディエント、ハイパス、ラプラシアン、ガウシアン) OpenCV 3(core + contrib)をPython 3の環境にインストール&OpenCV 2とOpenCV 3の違い&簡単な動作チェック, ■ 静止画像の処理についてはこちら OpenCVでWebカメラ/ビデオカメラの動画をリアルタイムに変換してみる OpenCVを使ったモーション テンプレート解析(リアルタイムに物体とその動く方向を認識する), KNN(K-Nearest Neighbor algorithm)は、探索空間から最近傍のラベルをK個選択し、多数決でクラスラベルを割り当てるアルゴリズムです。 探索対象の特徴点と近い空間のみを検索します。探索空間が減るので高速に検索することができます。ただし、探索のパラメータに誤ったものを指定してしまうと、探索空間の選択を誤ってしまい、最近傍の特徴点が含まれていない探索空間だけを検索して終わってしまう状況が発生してしまいます。, 以前、OpenCV 3では、動作しないチュートリアルがあることを書きました(リンク)が、FLANNの特徴点マッチングは、私の環境(OpenCV 3.1.0 + Python 3.5.2 + Windows 10)では動作しませんでした。, FLANNは、C++やOpenCV2では問題なく動作しているいるので、FLANNを利用したい場合は、C++または、OpenCV2の環境で実行します。OpenCV 3とPython 3の組み合わせで動かす場合は、現状は「総当たり法(Brute-Force)」を利用します。, D.Loweが提唱したRatio Testで、マッチング結果を間引いて表示します。, この方法は、画像全体のマッチング状況を視覚的に把握することができます。