파이썬(Python)/opencv

[Python]OpenCV 이미지 기울어지게 만들기, 원근감 주기(getPerspectiveTransform, warpPerspective)

끄적끄적아무거나 2022. 4. 4. 20:29
반응형

목차

     

     

     

     

     

    파이썬 OpenCV 이미지 파일 원근감 주기(Perspective)

     

     

    이번 포스트에서는 파이썬의 OpenCV를 사용해서 사진 파일(Picture file)을 불러와서 2차원 평면을 기울려서 3차원과 같은 형태로 원근감을 줘보겠습니다. 

     

    그림이 멀리서 보이는 듯하게 보이게 하기 위해서는 아래 작업들이 필요 합니다.

     

    1. 원본 이미지 픽셀 크기 확인

    2. getPerspectiveTransform 함수 

    3. warpPerspective 함수

     

     

    사실 함수 사용법만 알면 간단하게 할 수 있는 작업입니다. 

     

    getPerspectiveTransform 함수 사용에 대해 알아보겠습니다. 

     

    getPerspectiveTransform(원본 이미지 좌표, 변경할 이미지 좌표)

     

    입력값으로 원본 이미지의 좌표와 변경할 이미지의 좌표 값을 입력합니다. return 값으로 3x3 매트릭스(Matrix) 값이 나오는데 이 값이 warpPerspective 함수의 입력 값으로 사용 됩니다. 

     

     

    warpPerspective(원본이미지, return 매트릭스, (원본 이미지 픽셀 값)

     

    이해가 안되신다면 아래 예제 코드를 보면 쉽게 이해할 수 있습니다. 

     

     

     

     

     

    파이썬 OpenCV 이미지 파일 원근 예제#1

     

    이번 포스트에서 원본 이미지의 x축과 y축의 길이를 변경해서 3차원 형태로 이미지를 변경하는 작업을 진행하겠습니다. 

     

    예제 코드>>

    import cv2
    import numpy as np
    from matplotlib import pyplot as plt
    
    img = cv2.imread("car-cvt.jpg")
    print(img.shape)
    
    x_pos = img.shape[0]
    y_pos = img.shape[1]
    warped_x = 100
    
    ori_coordinate = np.float32([[0,0], [0,x_pos], [y_pos, 0], [y_pos,x_pos]])
    warped_coordinate = np.float32([[0, warped_x], [0,x_pos-warped_x], [y_pos, 0], [y_pos,x_pos]])
    
    Matrix = cv2.getPerspectiveTransform(ori_coordinate, warped_coordinate)
    print(Matrix)
    warped_img = cv2.warpPerspective(img, Matrix, (y_pos, x_pos))
    
    plt.subplot(121),plt.imshow(img),plt.title('original')
    plt.subplot(122),plt.imshow(warped_img),plt.title('warped')
    plt.show()

    5번 라인: imread 함수를 사용해서 img에 이미지 파일을 저장합니다.

    6번 라인: 이미지 파일의 x축 y축의 크기를 픽셀(Pixel)로 불러 옵니다. 

    8~9번 라인: x축과 y축 끝점의 값을 기록 합니다.

    10번 라인: 변경 정도를 나타내는 수치 입니다.

    12번 라인: 이미지의 4포인트 좌표를 표기합니다. 순서는 왼쪽 상단, 왼쪽 하단, 오른쪽 상단, 오른쪽 하단 순입니다.

    13번 라인: 왼쪽 상단과 왼쪽 하단에 warp 값을 넣어서 이미지를 틀어준 좌표를 입력 합니다.

    15번 라인: getPerspectiveTransform 함수를 사용해서 matrix 값을 불러 옵니다.

    17번 라인: warpPerspective 함수를 사용해서 왜곡된 이미지를 만듭니다.

    19~21번 라인: matplotlib 라이브러리를 사용해서 원본과 왜곡 이미지를 같은 화면에 배치해서 비교 해봅니다.

     

     

     

    결과>>

    (426, 640, 3)
    [[ 5.30516432e-01  0.00000000e+00  0.00000000e+00]
     [-1.56250000e-01  5.30516432e-01  1.00000000e+02]
     [-7.33568075e-04 -0.00000000e+00  1.00000000e+00]]

     

     

     

     

     

     

    파이썬 OpenCV 이미지 파일 원근 예제#2

     

     

    아래 예제는 13번 라인만 아래와 같이 변경했을 경우 입니다.

    warped_coordinate = np.float32([[warped_x, 0], [0,x_pos], [y_pos-warped_x, 0], [y_pos, x_pos]])

     

    결과>>

    (426, 640, 3)
    [[ 6.87500000e-01 -2.34741784e-01  1.00000000e+02]
     [ 0.00000000e+00  6.87500000e-01  0.00000000e+00]
     [-0.00000000e+00 -7.33568075e-04  1.00000000e+00]]

     

     

     

     

    반응형