この質問はすでにaskedでしたが、まだ解決できません。一連の点からcv::findHomography
と呼ぶことによってホモグラフィ行列を得る。私はそれが適切かどうかをチェックする必要があります。
提案された方法は、インライアの最大再投影誤差を計算し、それを閾値と比較することである。しかし、このようなフィルタリングの後、私は、オブジェクト境界ボックスをほぼ直線またはいくつかの奇妙な非凸四角形に自己交差などで変形させて狂った変換を続けています。
ホモグラフィ行列自体が適切かどうかを確認するために使用できる制約はありますか?得られたホモグラフィ行列が良いかどうかを確認するには?
答えて
あなたの質問は数学です。与えられた3x3の行列は、それが良い剛性変換を表すかどうかを決定する。 それは「良い」ですが、ここでは、多角形の点の方向を維持する必要があり、あなたに
- ホモグラフィを助けることができるいくつかの手がかりが何であるかを定義するのは難しいです。簡単なテストを設計する。点(0,0)、(imwidth、0)、(幅、高さ)、(0、高さ)は時計回りに配置された四角形を表します。それらの点にホモグラフィを適用し、それらが時計回りに配置されているかどうかを確認してください。時計回りになると、ホモグラフィが画像を反転(ミラーリング)しています。しかし、あなたのポイントが順調でない場合は、 "ホモグラフィが悪い"
- ホモグラフィは、オブジェクトのスケールをあまりにも変更しません。たとえば、画像をXの倍率で縮小または拡大すると予想される場合は、このルールをチェックしてください。ホモグラフィを用いて4点(0,0)、(imwidth、0)、(幅-1、高さ)、(0、高さ)を変換し、四角形の面積(ポリゴンの面積を計算するopencv法)面積が大きすぎる(または小さすぎる)場合は、おそらくエラーが発生します。
- 良いホモグラフィは、通常、低い値の視点を使用します。通常、画像のサイズが〜1000x1000ピクセルの場合、これらの値は〜0.005-0.001である必要があります。高い視点は、おそらくエラーである巨大な歪みを引き起こすでしょう。それらの値がどこにあるのかわからない場合は、私の投稿を読んでください: trying to understand the Affine Transform 。それはアフィン変換の数学を説明し、他の2つの値は遠近法のパラメータです。
上記の3つの条件(条件2が最も重要です)を確認すると、ほとんどの問題を検出できると思います。 幸運
:/ /answers.opencv.org/question/2588/check-if-homography-is-good/ホモグラフィの回転部分行列であると思われるものの行列式を計算し、それが大きいか小さいかを調べることで、方位が保存されているかどうかを知ることができます(基本的にこのような行列式を計算することはピタゴラス式と同じです)。 – rbaleksandar
編集:この回答は質問には関係ありませんが、議論は私のような認識のために一致する結果を使用しようとする人に役立つかもしれません!私はいくつかの時間前に投稿さ
がPoint2f[] objCorners = { new Point2f(0, 0),
new Point2f(img1.Cols, 0),
new Point2f(img1.Cols, img1.Rows),
new Point2f(0, img1.Rows) };
Point2d[] sceneCorners = MyPerspectiveTransform3(objCorners, homography);
double marginH = img2.Width * 0.1d;
double marginV = img2.Height * 0.1d;
bool homographyOK = isInside(-marginH, -marginV, img2.Width + marginH, img2.Height + marginV, sceneCorners);
if (homographyOK)
for (int i = 1; i < sceneCorners.Length; i++)
if (sceneCorners[i - 1].DistanceTo(sceneCorners[i]) < 1)
{
homographyOK = false;
break;
}
if (homographyOK)
homographyOK = isConvex(sceneCorners);
if (homographyOK)
homographyOK = minAngleCheck(sceneCorners, 20d);
private static bool isInside(dynamic minX, dynamic minY, dynamic maxX, dynamic maxY, dynamic coors)
{
foreach (var c in coors)
if ((c.X < minX) || (c.Y < minY) || (c.X > maxX) || (c.Y > maxY))
return false;
return true;
}
private static bool isLeft(dynamic a, dynamic b, dynamic c)
{
return ((b.X - a.X) * (c.Y - a.Y) - (b.Y - a.Y) * (c.X - a.X)) > 0;
}
private static bool isConvex<T>(IEnumerable<T> points)
{
var lst = points.ToList();
if (lst.Count > 2)
{
bool left = isLeft(lst[0], lst[1], lst[2]);
lst.Add(lst.First());
for (int i = 3; i < lst.Count; i++)
if (isLeft(lst[i - 2], lst[i - 1], lst[i]) != left)
return false;
return true;
}
else
return false;
}
private static bool minAngleCheck<T>(IEnumerable<T> points, double angle_InDegrees)
{
//20d * Math.PI/180d
var lst = points.ToList();
if (lst.Count > 2)
{
lst.Add(lst.First());
for (int i = 2; i < lst.Count; i++)
{
double a1 = angleInDegrees(lst[i - 2], lst[i-1]);
double a2 = angleInDegrees(lst[i], lst[i - 1]);
double d = Math.Abs(a1 - a2) % 180d;
if ((d < angle_InDegrees) || ((180d - d) < angle_InDegrees))
return false;
}
return true;
}
else
return false;
}
private static double angleInDegrees(dynamic v1, dynamic v2)
{
return (radianToDegree(Math.Atan2(v1.Y - v2.Y, v1.X - v2.X))) % 360d;
}
private static double radianToDegree(double radian)
{
var degree = radian * (180d/Math.PI);
if (degree < 0d)
degree = 360d + degree;
return degree;
}
static Point2d[] MyPerspectiveTransform3(Point2f[] yourData, Mat transformationMatrix)
{
Point2f[] ret = Cv2.PerspectiveTransform(yourData, transformationMatrix);
return ret.Select(point2fToPoint2d).ToArray();
}
あまりにも多くのコードがコメントなし*に役立つ*絶望のため – user3085931
私は関数名は自分自身を説明すると思います。これは私ができることです。要約:ホモグラフィによる変形後、見つかった形状が1)許容範囲内か、2)サイズが許容可能か、3)形状が凸であるか否か(ここでは間違いがある)4)形状の内角が許容範囲かない。いくつかの間違いがあります。私の作業が終わったらコードを更新します。そして、より良い点検を達成するための他の方法があれば、私は絶望的です。私はまた、絶望的であり、他の人々のコードを常にたくさん読んでいるのが好きです。 – Koray
FYI:http://stackoverflow.com/questions/11053099/how-can-you-tell-if-a-homography-matrix-is-acceptable-or-notは私の見解では私が見た最も妥当な解決策ですこのトピックについては – user3085931
- 1. フルスクリーンアプリケーションが実行されているかどうかを確認するには?
- 2. スクリーンセーバーが実行されているかどうかを確認するには?
- 3. 何かが無かどうかを確認する良い方法は?
- 4. ブーストシリアライゼーション:ストリームが「良い」かどうかを確認
- 5. JavaクラスがNetBeans IDE内から実行されたかどうかを確認するには?
- 6. UIViewControllerが表示されているかどうかを確認する良い方法はありますか?
- 7. リンクが訪問されたかどうかを確認するにはどうすればよいですか?
- 8. エラーが返されたかどうかを確認するにはどうすればよいですか?
- 9. PL/SQLがSQLの実行を確認したらOKかどうかを確認しますか?
- 10. Python ftplib:ファイルが変更されたかどうかを確認する最も良い方法は?
- 11. 行が存在しないかどうか確認する[MySQL]
- 12. シーケンスがソートされているかどうかを確認する並列アルゴリズム
- 13. 配列がソートされているかどうかを確認する
- 14. JavaScript setTimeoutが実行されたかどうかを確認する
- 15. カーネルがCUDAで実行されたかどうかを確認する方法
- 16. rubyスクリプトが既に実行されているかどうかを確認
- 17. ページが更新されたかどうかを確認する
- 18. テキストフィールドからデータを取得し、yesまたはcancelが押されたかどうかを確認
- 19. ブーストスレッド、スレッドがまだ実行されているかどうかを確認するにはどうしたらいいですか?
- 20. GridViewから行が選択されているかどうかを確認する方法は?
- 21. MySQLは値が行内にマイナスで区切られているかどうかを確認します
- 22. 行が存在するかどうかを確認するクエリ
- 23. ユーザーがdbで確認されているかどうかを確認
- 24. bash - 文字列に改行が含まれているかどうかを確認する
- 25. 列にユニーク制約があるかどうかを確認
- 26. tagNameまたはinstanceof HTMLAnchorElementを確認する方が良いでしょうか
- 27. リストのメンバーシップを確認するにはどうしたらいいですか?
- 28. gitでコミットを確認するにはどうしたらいいですか?
- 29. WordPressでサムネイルを確認するにはどうしたらいいですか?
- 30. 2つのTorchテンソルまたは行列が等しいかどうかを確認する方法?
参照[この] [1]の答え:
これは、誰かを助けるかもしれません。 [1]:最初の提案チェックHTTPに加えhttp://stackoverflow.com/questions/10972438/detecting-garbage-homographies-from-findhomography-in-opencv/10981249#10981249 –