>백엔드 개발 >C++ >내 cv::warpPerspective 기울기 조정 구현이 잘못된 결과를 생성하는 이유는 무엇이며 어떻게 해결할 수 있습니까?

내 cv::warpPerspective 기울기 조정 구현이 잘못된 결과를 생성하는 이유는 무엇이며 어떻게 해결할 수 있습니까?

DDD
DDD원래의
2024-11-23 03:32:11678검색

Why Does My cv::warpPerspective Deskewing Implementation Produce Incorrect Results, and How Can I Fix It?

점 집합의 기울기를 조정하기 위해 cv::warpPerspective를 올바르게 실행하는 방법

문제:

cv 사용 시도 ::warpPerspective는 일련의 점에 대해 기울기 조정 효과를 얻었습니다. 만족스럽지 못한 결과. 원하는 기울기 보정은 아래 이미지에서 녹색 직사각형으로 표시됩니다.

[관심 영역의 윤곽을 그린 녹색 직사각형이 있는 문서 이미지]

원인:

잘못된 결과는 여러 가지 원인으로 인해 발생할 수 있습니다. 요인:

  1. 포인트 순서: 입력 및 출력 벡터의 포인트 순서는 동일해야 합니다(예: 왼쪽 상단, 왼쪽 하단, 오른쪽 하단, 상단) -right).
  2. 출력 이미지 크기: 결과 이미지에 과도한 배경이 포함되지 않도록 너비와 높이를 설정해야 합니다. 기울어진 영역 주변의 경계 직사각형과 일치시킵니다.

해결책:

이러한 문제를 해결하기 위해 아래 코드는 다음과 같습니다. 수정됨:

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

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

    // Assemble a rotated rectangle from the points
    RotatedRect box = minAreaRect(cv::Mat(not_a_rect_shape));

    // Extract the corner points of the rotated rectangle
    Point2f pts[4];
    box.points(pts);

    // Define the vertices for the warp transformation
    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);

    // Use the affine transform as it's faster for the given use case
    Mat warpAffineMatrix = getAffineTransform(src_vertices, dst_vertices);

    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);
}

개선 사항:

효율성을 더욱 높이려면 cv:: 대신 cv::getAffineTransform() 및 cv::warpAffine() 사용을 고려하세요. getPerspectiveTransform() 및 cv::warpPerspective(). 이러한 기능은 아핀 변환을 위해 특별히 설계되었으며 속도가 훨씬 빠릅니다.

위 내용은 내 cv::warpPerspective 기울기 조정 구현이 잘못된 결과를 생성하는 이유는 무엇이며 어떻게 해결할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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