>백엔드 개발 >C++ >OpenCV의 `warpAffine`을 사용하여 점의 기울기를 시뮬레이션하는 방법은 무엇입니까?

OpenCV의 `warpAffine`을 사용하여 점의 기울기를 시뮬레이션하는 방법은 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-11-28 11:49:10179검색

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. 속도 최적화: 성능을 향상하려면 일반적인 Perspective 변환 함수 대신 affine 변환 함수(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으로 문의하세요.