前提・実現したいこと
初めて質問します。主にProcessingを用いたインタラクションデザインを学んでおります。
テンプレートマッチングどころか、OpenCVも初めて触るレベルでして、凄く初歩的な質問でしたら申し訳ございません。
現在、リアルタイムの動画をwebカメラから取り込み、映ったもの(幾何学模様が2,3個を想定)の位置を認識するプログラミングを調べています。
最終的に目指しているのは、アクリル板の台の下にwebカメラを置き、台の上に置かれたものの底に幾何学模様を貼り付けて、その位置に映像を上から映し出す作品です。
テンプレートマッチングで実装出来そうなのですが、参考に出来るようなサンプルプログラムが見つからず、お手上げの状態です。
また、テンプレートマッチングだと認識できる位置が、テンプレート画像内での位置になってしまうかと思うのですがいかがでしょうか。。。
現状でのコードを一応貼って置きます。画像によるテンプレートマッチングです。
一歩でも動き始められるようなヒントでも良いので、どなたか助言を下されば幸いです。
何卒宜しくお願い致します。
##現状でのコード
Processing
1import processing.video.*; 2import gab.opencv.*; 3import org.opencv.core.Mat; 4import org.opencv.core.CvType; 5import org.opencv.imgproc.Imgproc; 6import org.opencv.core.Core.MinMaxLocResult; 7import org.opencv.core.Core; 8 9//Capture Camera; //本当はこれで読み込むビデオを入力画像として使いたい 10 11// 入力画像の準備 12PImage inputImage = loadImage("tiisakusita1.jpg"); 13OpenCV inputCV = new OpenCV(this, inputImage); 14Mat inputMat = OpenCV.imitate(inputCV.getGray()); 15 16// テンプレート画像の準備 17PImage templateImage = loadImage("tiisakusita2.jpg"); 18 19OpenCV templateCV = new OpenCV(this, templateImage); 20Mat templateMat = OpenCV.imitate(templateCV.getGray()); 21 22// 結果格納用の行列の準備 23int resultCols = inputMat.cols() - templateMat.cols() + 1; 24int resultRows = inputMat.rows() - templateMat.rows() + 1; 25Mat resultMat = new Mat(resultRows, resultCols, CvType.CV_32FC1); 26 27// テンプレートマッチングを実行 28Imgproc.matchTemplate(inputCV.getColor(), templateCV.getColor(), resultMat, Imgproc.TM_CCOEFF_NORMED); 29 30// 結果を描画 31println("OK!"); 32size(400, 300); 33image(inputImage, 100, 0); 34image(templateImage, 10, 10,80,80); 35 36MinMaxLocResult mmlr = Core.minMaxLoc(resultMat); 37 38if (mmlr.maxVal > 0.1) { 39 println("Val: " + mmlr.maxVal); 40 stroke(255, 0, 0); 41 strokeWeight(3); 42 noFill(); 43 rect((int)mmlr.maxLoc.x + 100, (int)mmlr.maxLoc.y, templateMat.cols(), templateMat.rows()); 44}
回答2件
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
2018/11/01 05:48
2018/11/01 06:15
2018/11/04 03:39