[OpenCV3]パースペクティブ変換-cv :: getPerspectiveTransform()およびcv :: warpPerspective()



Perspective Transformation Cv



パースペクティブ変換は、投影マッピングとも呼ばれる新しい表示平面への画像の投影です。図1に示すように、ABCは透視変換によってA'B'C 'に変換されます。




図1透視変換の概略図

パースペクティブ変換の一般的な式は次のとおりです。




変換された座標x、yは次のとおりです。

拡張後:




その中で、 パースペクティブ変換行列と呼ばれます。 スケーリング、せん断、比率などの線形変換を表します

翻訳に使用されるため、前に紹介したアフィン変換は、特別な遠近法変換と見なすことができます。

図2に示すように、 傾斜角 キャプチャされた道路画像はに変換されます 航空写真 つまり、カメラの視点が道路と平行になるように切り替えられます。


図2斜視図


まず、このパースペクティブ変換の変換行列を取得する必要があります。 opencv2とopencv3で遠近変換行列を計算するために使用される関数はcv :: getPerspectiveTransform()です。 C ++インターフェイスは次のように呼び出されます。

perspective = cv2.warpPerspective(image, M, (960, 270), cv2.INTER_LINEAR)

図3に示すように、鳥瞰図に対応する道路上の2本の平行な分割線上で4つのポイントA(165、270)、C(360、125)、D(615、125)、B(835、270)を選択します。アイビュー。グラフ上の点はAです((165、270)、C '(165、30)、D'(835、30)、B((835、270)。


図3パースペクティブ変換エンドポイント

これらの4組の点を介して、透視変換行列Mを計算できます。

C ++コードは次のとおりです。

  1. cv::Mat cv::getPerspectiveTransform( // return 3x3 perspective transformation matrix
  2. const cv::Point2f* src, // source image four vertex coordinates (point array)
  3. const cv::Point2f* dst // coordinates of the four vertices on the target image (point array)
  4. )


Pythonコードは次のとおりです。

  1. cv::Mat get_perspective_mat()
  2. {
  3. cv::Point2f src_points[] = {
  4. cv::Point2f(165, 270),
  5. cv::Point2f(835, 270),
  6. cv::Point2f(360, 125),
  7. cv::Point2f(615, 125) }
  8. cv::Point2f dst_points[] = {
  9. cv::Point2f(165, 270),
  10. cv::Point2f(835, 270),
  11. cv::Point2f(165, 30),
  12. cv::Point2f(835, 30) }
  13. cv::Mat M = cv::getPerspectiveTransform(src_points, dst_points)
  14. return M
  15. }


計算結果は以下のとおりです。


パースペクティブ変換行列を取得した後、次のように呼び出されるcv :: warpPerspective()でパースペクティブ変換を使用できます。

  1. def get_perspective_mat():
  2. src_points = np.array([[165., 270.], [835., 270.], [360., 125.], [615., 125.]], dtype = 'float32')
  3. dst_points = np.array([[165., 270.], [835., 270.], [165., 30.], [835., 30.]], dtype = 'float32')
  4. M = cv2.getPerspectiveTransform(src_points, dst_points)
  5. return M

C ++コードは次のとおりです。

  1. void cv::warpPerspective(
  2. cv::InputArray src, // enter image
  3. cv::OutputArray dst, // output image
  4. cv::InputArray M, // 3x3 transformation matrix
  5. cv::Size dsize, // target image size
  6. int flags = cv::INTER_LINEAR, // interpolation method
  7. int borderMode = cv::BORDER_CONSTANT, // extrapolation method
  8. const cv::Scalar& borderValue = cv::Scalar() / / use the constant boundary
  9. )



Pythonコードは次のとおりです。

  1. cv::Mat perspective
  2. cv::warpPerspective(image, perspective, M, cv::Size(960, 270), cv::INTER_LINEAR)


変換の結果は次のとおりです。



2017.05.19