質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

2315閲覧

二つの画像の特徴点から変換行列を作成する。

nakanori773

総合スコア4

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/10/13 06:10

編集2020/10/13 06:31

前提・実現したいこと

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)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

結果は完全ではありませんが、
議題の「二つの画像の特徴点から変換行列を作成する。」という部分に関しては、
回答の方法で解決したので、自己解決にしておきます。

ややこしいことをして申し訳ございません。

投稿2020/10/13 10:55

nakanori773

総合スコア4

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

InputArray.Create()を用いることで、Cv2.EstimateAffinePartial2Dを用いることが出来ました。

C#

1List<Point2f> p1 = new List<Point2f>(), p2 = new List<Point2f>(); 2Mat matHenkan = Cv2.EstimateAffinePartial2D(InputArray.Create(p1), InputArray.Create(p2))

ただ、変換結果は上手くいきませんでした。

Python

1 mtx = cv2.estimateAffinePartial2D( 2 np.float32([kp1[m[0].queryIdx].pt for m in good]).reshape(-1, 1, 2), 3 np.float32([kp2[m[0].trainIdx].pt for m in good]).reshape(-1, 1, 2))[0]

参考元のPythonのソースでは、np.float32().reshape(-1, 1, 2)としているので、その辺りが問題なのでしょうか?

投稿2020/10/13 08:27

編集2020/10/13 08:45
nakanori773

総合スコア4

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問