[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 ++コードは次のとおりです。
- cv::Mat cv::getPerspectiveTransform( // return 3x3 perspective transformation matrix
- const cv::Point2f* src, // source image four vertex coordinates (point array)
- const cv::Point2f* dst // coordinates of the four vertices on the target image (point array)
- )
Pythonコードは次のとおりです。
- cv::Mat get_perspective_mat()
- {
- cv::Point2f src_points[] = {
- cv::Point2f(165, 270),
- cv::Point2f(835, 270),
- cv::Point2f(360, 125),
- cv::Point2f(615, 125) }
- cv::Point2f dst_points[] = {
- cv::Point2f(165, 270),
- cv::Point2f(835, 270),
- cv::Point2f(165, 30),
- cv::Point2f(835, 30) }
- cv::Mat M = cv::getPerspectiveTransform(src_points, dst_points)
- return M
- }
計算結果は以下のとおりです。
パースペクティブ変換行列を取得した後、次のように呼び出されるcv :: warpPerspective()でパースペクティブ変換を使用できます。
- def get_perspective_mat():
- src_points = np.array([[165., 270.], [835., 270.], [360., 125.], [615., 125.]], dtype = 'float32')
- dst_points = np.array([[165., 270.], [835., 270.], [165., 30.], [835., 30.]], dtype = 'float32')
- M = cv2.getPerspectiveTransform(src_points, dst_points)
- return M
C ++コードは次のとおりです。
- void cv::warpPerspective(
- cv::InputArray src, // enter image
- cv::OutputArray dst, // output image
- cv::InputArray M, // 3x3 transformation matrix
- cv::Size dsize, // target image size
- int flags = cv::INTER_LINEAR, // interpolation method
- int borderMode = cv::BORDER_CONSTANT, // extrapolation method
- const cv::Scalar& borderValue = cv::Scalar() / / use the constant boundary
- )
Pythonコードは次のとおりです。
- cv::Mat perspective
- cv::warpPerspective(image, perspective, M, cv::Size(960, 270), cv::INTER_LINEAR)
変換の結果は次のとおりです。
2017.05.19