前提・実現したいこと
Pythonのソースコードを参照して、
2つの画像(記載されている数字を除くと同一レイアウト)に対して、
akaze検出器で各々の特徴点を抽出後、K近傍法で特徴点を絞った後に変換行列を作成して画像変換をしています。
本当に初歩的な質問だとは思いますが、ご助力のほどよろしくお願いいたします。
発生している問題・エラーメッセージ
Pythonの知識がないため、OpenCvに関する記載から調べて作業しています。
特徴点を絞り、変換前後の座標をPoint2fの配列を経由してMatに変換したのですが、
アファイン変換を行うとエラーが出ます。
(M0.type() == CV_32F || M0.type() == CV_64F) && M0.rows == 2 && M0.cols == 3
該当のソースコード
参考にしたコード
Python
1for m, n in matches: 2 if m.distance < ratio * n.distance: 3 good.append([m]) 4 5mtx = cv2.estimateAffinePartial2D( 6 np.float32([kp1[m[0].queryIdx].pt for m in good]).reshape(-1, 1, 2), 7 np.float32([kp2[m[0].trainIdx].pt for m in good]).reshape(-1, 1, 2))[0] 8 9warped_image = cv2.warpAffine(img1, mtx, (img1.shape[1], img1.shape[0]))
エラーが発生しているコード
C#
1//descriptor1は画像Aの特徴点、descriptor2は画像Bの特徴点 2matches = matcher.KnnMatch(descriptor1, descriptor2, 2); 3List<Point2f> p1 = new List<Point2f>(), p2 = new List<Point2f>(); 4foreach (var m in matches) 5{ 6 double dis1 = m[0].Distance; 7 double dis2 = m[1].Distance; 8 if (dis1 <= dis2 * match_per) 9 { 10 p1.Add(key_point1[m[0].QueryIdx].Pt); 11 p2.Add(key_point2[m[1].TrainIdx].Pt); 12 } 13} 14 15Mat matHenkan = Cv2.GetPerspectiveTransform(p1, p2); //3*3*CV_64FC1 16 17//ここでの状態は以下の通り 18//元画像:MatMoto(1753*2480*CV_8UC3)、結果:MatKekka(new Mat()) 変換行列:matHenkan (3*3*CV_64FC1) 19Cv2.WarpAffine(MatMoto, MatKekka, matHenkan , Matread.Size()); 20 21//今回は、画像B(MatMoto(1753*2480*CV_8UC3)を 22//画像A(1764*2478*CV_8UC4)に合わせに行っています。
試したこと
本来であれば、estimateAffinePartial2Dを使いたいのですが、
どのパラメータに何を渡せばよいかわかりませんでした。
アファイン変換時の本エラーを見て行列の次元数と、チャンネル?が問題だと感じたので
C#
1matHenkan.ConvertTo(matHenkan2, MatType.CV_8UC3, MatMoto.Cols, MatMoto.Rows);
と変換行列を更に変換したのですが、変換行列は(33CV_8UC1)となり、
アファイン変換後のエラー内容は同じでした。
あと解決策を模索しているときに、NumSharpをNugetから取得しようとしましたが、
エラー パッケージ 'NumSharp 0.20.5' をインストールできませんでした。このパッケージを '.NETFramework,Version=v4.5.2' を対象とするプロジェクトにインストールしようとしていますが、そのフレームワークと互換性があるアセンブリ参照またはコンテンツ ファイルがパッケージに含まれていません。詳細については、パッケージの作成者に問い合わせてください。
補足情報(FW/ツールのバージョンなど)
C# OpenCvSharp3(v4.00) .NETFramework(4.5.2)
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。