ホームページ  >  記事  >  バックエンド開発  >  透視変換とアフィン変換を使用して点の傾きを補正するにはどうすればよいですか?

透視変換とアフィン変換を使用して点の傾きを補正するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-21 01:15:15345ブラウズ

How to Deskew Points Using Perspective Transformation and Affine Transforms?

デスキューのためのパース変換

パースペクティブ変換を使用して一連の点に対してデスキュー効果を実現するには、次のことを理解することが不可欠です。

ポイント順序:

視点変換では点の順序が重要です。精度を確保するには、ソース ベクトルとデスティネーション ベクトルの両方で順序が一貫している必要があります。

画像サイズ:

結果の画像に次のオブジェクトのみを含めたい場合興味がある場合は、結果として得られる長方形の寸法と一致するように幅と高さを設定します。

パフォーマンス考慮事項:

回転、サイズ変更、デスキューなどのアフィン変換の場合、アフィン変換を使用する方が効率的です。対応するもの:

  • getAffineTransform()
  • warpAffine()

アフィン変換:

getAffineTransform() 3 つの点のみが必要で、2x3 行列が得られますが、 warpAffine() はワーピングを実行します。

結果の画像のサイズ変更:

結果の画像を入力とは異なるサイズにサイズ変更するには、次を使用します:

cv::Size size(box.boundingRect().width, box.boundingRect().height);
cv::warpPerspective(src, dst, size, ... );

例:

vector<Point> not_a_rect_shape;
not_a_rect_shape.push_back(Point(408, 69));
not_a_rect_shape.push_back(Point(72, 2186));
not_a_rect_shape.push_back(Point(1584, 2426));
not_a_rect_shape.push_back(Point(1912, 291));

RotatedRect box = minAreaRect(cv::Mat(not_a_rect_shape));

Point2f pts[4];
box.points(pts);

Point2f src_vertices[3];
src_vertices[0] = pts[0];
src_vertices[1] = pts[1];
src_vertices[2] = pts[3];

Point2f dst_vertices[3];
dst_vertices[0] = Point(0, 0);
dst_vertices[1] = Point(box.boundingRect().width-1, 0);
dst_vertices[2] = Point(0, box.boundingRect().height-1);

Mat warpAffineMatrix = getAffineTransform(src_vertices, dst_vertices);

cv::Size size(box.boundingRect().width, box.boundingRect().height);
warpAffine(src, rotated, warpAffineMatrix, size, INTER_LINEAR, BORDER_CONSTANT);

以上が透視変換とアフィン変換を使用して点の傾きを補正するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。