ホームページ > バックエンド開発 > C++ > cv::warpPerspective を使用して点のセットをデスキューする方法

cv::warpPerspective を使用して点のセットをデスキューする方法

Linda Hamilton
リリース: 2024-12-03 17:40:12
オリジナル
785 人が閲覧しました

How to Deskew a Set of Points Using cv::warpPerspective?

cv::Point のセットで偽のデスキューの cv::warpPerspective を実行する

質問: 方法を使用して一連の点に対してデスキュー効果を実現できますか? cv::warpPerspective?ポイントは特定の順序ではなく、ベクトル内に格納されます。

問題の理解:

  • ポイントの順序が正しくありません:目的の変換を実現するには、入力ベクトルと出力ベクトルが一致する必要があります。
  • 画像サイズが正しくありません: 出力画像の幅と高さは一致している必要があります。傾き補正されたオブジェクトの外接する四角形。

偽の傾き補正の手順:

  1. 正しい点の順序: 順序を確認します。入力ベクトルと出力ベクトルの両方の点は同じシーケンスに従います (例: 左上、
  2. 回転長方形の調整: cv::minAreaRect() を使用して、入力ポイントの周囲に回転した長方形を作成します。ただし、このメソッドは元の点の座標をわずかに変更する可能性があることに注意してください。
  3. Affine Transform: アフィン変換関数 cv::getAffineTransform() および cv::warpAffine() を次のように利用します。この特定のデスキューに関しては、計算的により効率的です。
  4. 異なる出力サイズ: 傾き補正された画像に対象のオブジェクトのみを含めるには、一致する新しい画像サイズ (例: cv::Size(width, height)) を定義します。外接する四角形のサイズ。
  5. アフィン変換の適用: 入力画像、入力ポイント、出力ポイントと定義された出力サイズを cv::warpAffine() に渡して、実際のデスキュー変換を実行します。

コード例:

#include <opencv2/opencv.hpp>

int main() {
    // Input image
    Mat src = imread("input.jpg");

    // Input points (not in particular order)
    vector<Point> points = {
        Point(408, 69), // Top-left
        Point(72, 2186), // Bottom-left
        Point(1584, 2426), // Bottom-right
        Point(1912, 291), // Top-right
    };

    // Rotated rectangle (bounding box)
    RotatedRect boundingRect = minAreaRect(Mat(points));

    // Corrected point ordering
    Point2f vertices[3];
    vertices[0] = boundingRect.center + boundingRect.size * 0.5f; // Top-left
    vertices[1] = boundingRect.center + boundingRect.size * 0.5f; // Bottom-left
    vertices[1].y += boundingRect.size.height;
    vertices[2] = boundingRect.center - boundingRect.size * 0.5f; // Bottom-right

    // Output point ordering
    Point2f outputVertices[3];
    outputVertices[0] = Point(0, 0); // Top-left
    outputVertices[1].x = outputVertices[0].x + boundingRect.size.width; // Bottom-left
    outputVertices[1].y = outputVertices[1].x;
    outputVertices[2] = outputVertices[0]; // Bottom-right

    // Affine transformation matrix
    Mat transformationMatrix = getAffineTransform(vertices, outputVertices);

    // Deskewed image with corrected size
    Mat deskewedImage;
    Size outputSize(boundingRect.size.width, boundingRect.size.height);
    warpAffine(src, deskewedImage, transformationMatrix, outputSize, INTER_LINEAR);

    // Save deskewed image
    imwrite("deskewed.jpg", deskewedImage);
}
ログイン後にコピー

以上がcv::warpPerspective を使用して点のセットをデスキューする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート