首頁 >後端開發 >C++ >如何使用 OpenCV 的'warpAffine”模擬點偏移?

如何使用 OpenCV 的'warpAffine”模擬點偏移?

Patricia Arquette
Patricia Arquette原創
2024-11-28 11:49:10181瀏覽

How to Simulate Deskewing of Points Using OpenCV's `warpAffine`?

如何使用 cv::warpPerspective在一組點上實現假傾斜校正效果

問題陳述

目標是應用透視變換為一組點以獲得偏移校正效果,類似於下圖影片:

[影片連結](http://nuigroup. com/?ACT=28&fid=27&aid=1892_H6eNAaign4Mrnn30Au8d)

結果分析

提供的範例圖片和程式碼示範了偏移校正效果,但並不準確。具體來說,轉換後的影像不包含整個 ROI,且長寬比不正確。

修正錯誤

為了解決這些問題,對程式碼進行了以下變更:

  1. 確保相同的頂點順序:來源向量和目標向量中的點必須具有相同的順序(例如,左上、左下、右下、右上)。
  2. 自訂輸出影像尺寸:為了正確包含 ROI,目標影像尺寸應為設定為圍繞原始點的邊界矩形的大小。
  3. 最佳化速度:為了提高效能,仿射使用變換函數(getAffineTransform() 和 warpAffine())來取代一般的透視變換函數。

更新了程式碼

void main()
{
    cv::Mat src = cv::imread("r8fmh.jpg", 1);

    // Points representing the corners of the paper
    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));

    // Debug drawing of the points
    const Point* point = &amp;not_a_rect_shape[0];
    int n = (int)not_a_rect_shape.size();
    Mat draw = src.clone();
    polylines(draw, &amp;point, &amp;n, 1, true, Scalar(0, 255, 0), 3, CV_AA);
    imwrite("draw.jpg", draw);

    // Rotated rectangle around the points
    RotatedRect box = minAreaRect(cv::Mat(not_a_rect_shape));

    // Source and destination vertex points
    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);

    // Affine transform matrix
    Mat warpAffineMatrix = getAffineTransform(src_vertices, dst_vertices);

    // Transformation and output image
    cv::Mat rotated;
    cv::Size size(box.boundingRect().width, box.boundingRect().height);
    warpAffine(src, rotated, warpAffineMatrix, size, INTER_LINEAR, BORDER_CONSTANT);

    imwrite("rotated.jpg", rotated);
}

以上是如何使用 OpenCV 的'warpAffine”模擬點偏移?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn