>백엔드 개발 >C++ >cv::warpPerspective를 사용하여 점 세트를 왜곡하는 방법은 무엇입니까?

cv::warpPerspective를 사용하여 점 세트를 왜곡하는 방법은 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-12-03 17:40:12791검색

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

cv::Point 세트에서 가짜 기울기 보정을 위해 cv::warpPerspective 실행

질문: 방법 cv::warpPerspective를 사용하여 점 집합에 기울기 조정 효과를 얻을 수 있나요? 포인트는 특정 순서가 아니며 벡터 내에 저장됩니다.

문제 이해:

  • 잘못된 포인트 순서: 원하는 변환을 얻으려면 입력 및 출력 벡터가 일치해야 합니다.
  • 잘못된 이미지 크기: 출력 이미지의 너비와 높이가 일치해야 합니다. 기울기가 조정된 개체의 경계 직사각형.

가짜 기울기 조정 단계:

  1. 정확한 점 순서 지정: 입력 및 출력 벡터의 포인트는 동일한 순서를 따릅니다(예: 왼쪽 위, 왼쪽 아래, 오른쪽 아래, 오른쪽 상단).
  2. 회전된 직사각형 조정: cv::minAreaRect()를 사용하여 입력 지점 주위에 회전된 직사각형을 만듭니다. 그러나 이 방법은 원래 점 좌표를 약간 변경할 수 있습니다.
  3. 아핀 변환: 아핀 변환 함수 cv::getAffineTransform() 및 cv::warpAffine()을 다음과 같이 활용합니다. 이 특정 기울기 조정 작업에서는 계산상 더 효율적입니다.
  4. 다른 출력 크기: 기울어진 이미지에 관심 객체만 포함하려면 경계 사각형 크기와 일치하는 새 이미지 크기(예: cv::Size(너비, 높이))를 정의하세요.
  5. Apply Affine Transform: 입력 이미지, 입력 지점, 출력 지점 및 정의된 출력 크기를 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.