Skip to content

Instantly share code, notes, and snippets.

@kattoyoshi
Last active February 6, 2019 12:41
Show Gist options
  • Save kattoyoshi/9b89798ea7886eb4ff305fa1956140cd to your computer and use it in GitHub Desktop.
Save kattoyoshi/9b89798ea7886eb4ff305fa1956140cd to your computer and use it in GitHub Desktop.
CoordinateSystemsPractice
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Coordinate System Practice\n",
"\n",
"## 目的・目標\n",
"---\n",
"- 数式を実際にコードに落として理解する. \n",
"- 座標変換に慣れる.\n",
"- Bird's-eye View 画像を生成できるようになる.\n",
"\n",
"## やること\n",
"---\n",
"- 練習1: 座標変換\n",
" - ワールド座標系(WCS)の $Y_w=0$ の平面上にある簡単な形状の図形を ICS に変換する.\n",
" - 更に, ICS から再度 WCS ($Y_w=0$) に戻してみる.\n",
" - あくまでも座標変換のみが目的なので濃淡は 2 値とし, 図形内部を白領域と仮定する.\n",
"- 練習2: ICS から Bird's-eye View 画像作成\n",
" - 練習1で求めた ICS 画像から WCS ($Y_w=0$) の鳥瞰画像を生成する.\n",
" - おおよそ元々の WCS で定義した像に戻ることを確認する."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import math\n",
"import cv2\n",
"from IPython.display import Image, display_png "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## ざっくりとした座標系の定義\n",
"---"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAoUAAAHDCAYAAABSwGA4AAABYWlDQ1BrQ0dDb2xvclNwYWNlRGlzcGxheVAzAAAokWNgYFJJLCjIYWFgYMjNKykKcndSiIiMUmB/yMAOhLwMYgwKicnFBY4BAT5AJQwwGhV8u8bACKIv64LMOiU1tUm1XsDXYqbw1YuvRJsw1aMArpTU4mQg/QeIU5MLikoYGBhTgGzl8pICELsDyBYpAjoKyJ4DYqdD2BtA7CQI+whYTUiQM5B9A8hWSM5IBJrB+API1klCEk9HYkPtBQFul8zigpzESoUAYwKuJQOUpFaUgGjn/ILKosz0jBIFR2AopSp45iXr6SgYGRiaMzCAwhyi+nMgOCwZxc4gxJrvMzDY7v////9uhJjXfgaGjUCdXDsRYhoWDAyC3AwMJ3YWJBYlgoWYgZgpLY2B4dNyBgbeSAYG4QtAPdHFacZGYHlGHicGBtZ7//9/VmNgYJ/MwPB3wv//vxf9//93MVDzHQaGA3kAFSFl7jXH0fsAAAILaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA1LjQuMCI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnRpZmY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vdGlmZi8xLjAvIj4KICAgICAgICAgPHRpZmY6UmVzb2x1dGlvblVuaXQ+MjwvdGlmZjpSZXNvbHV0aW9uVW5pdD4KICAgICAgICAgPHRpZmY6Q29tcHJlc3Npb24+MTwvdGlmZjpDb21wcmVzc2lvbj4KICAgICAgICAgPHRpZmY6T3JpZW50YXRpb24+MTwvdGlmZjpPcmllbnRhdGlvbj4KICAgICAgICAgPHRpZmY6UGhvdG9tZXRyaWNJbnRlcnByZXRhdGlvbj4yPC90aWZmOlBob3RvbWV0cmljSW50ZXJwcmV0YXRpb24+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgoPRSqTAABAAElEQVR4AeydB3wVVfbHTyoJCYHQW6ih9957FXEXLIsFu6vu2rvo6urfvva+4rrWtaKComKhI733DqHXQCBA6nv/3zl37rx5LwlFIARyLp+8mbn9fmfemx/ntjAi8uNPnRJQAkpACSgBJaAElEAxJhBejNuuTVcCSkAJKAEloASUgBJwCKgo1EdBCSgBJaAElIASUAJKgFQU6kOgBJSAElACSkAJKAEloKJQnwEloASUgBJQAkpACSgBUlGoD4ESUAJKQAkoASWgBJSAikJ9BpSAElACSkAJKAEloARAQMcU6mOgBJSAElACSkAJKAEloKJQnwEloASUgBJQAkpACSgBtRTqM6AElIASUAJKQAkoASUAAtp9rI+BElACSkAJKAEloASUgIpCfQaUgBJQAkpACSgBJaAE1FKoz4ASUAJKQAkoASWgBJQACGj3sT4GSkAJKAEloASUgBJQAioK9RlQAkpACSgBJaAElIASUEuhPgNKQAkoASWgBJSAElACIKDdx/oYKAEloASUgBJQAkpACago1GdACSgBJaAElIASUAJKQC2F+gwoASWgBJSAElACSkAJgIB2H+tjoASUgBJQAkpACSgBJaCiUJ8BJaAElIASUAJKQAkoAbUU6jOgBJSAElACSkAJKAElAALafayPgRJQAkpACSgBJaAElICKQn0GlIASUAJKQAkoASWgBNRSqM+AElACSkAJKAEloASUAAho97E+BkpACSgBJaAElIASUAIqCvUZUAJKQAkoASWgBJSAElBLoT4DSkAJKAEloASUgBJQAiCg3cf6GCgBJaAElIASUAJKQAmoKNRnQAkoASWgBJSAElACSkAthfoMKAEloASUgBJQAkpACYCAdh/rY6AElIASUAJKQAkoASWgolCfASWgBJSAElACSkAJKAG1FOozoASUgBJQAkpACSgBJQAC2n2sj4ESUAJKQAkoASWgBJSAikJ9BpSAElACSkAJKAEloATUUqjPgBJQAkpACSgBJaAElAAIaPexPgZKQAkoASWgBJSAElACKgr1GVACSkAJKAEloASUgBJQS6E+A0pACSgBJaAElIASUAIgoN3H+hgoASWgBJSAElACSkAJqCjUZ0AJKAEloASUgBJQAkpALYX6DCiB4yYQ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\n"
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"display_png(Image(\"CS_definition.png\"))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 練習1: 座標変換\n",
"---\n",
"### 座標変換対象 WCS 上図形の定義"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"# Zw: 0-50 [m]\n",
"# Xw: ± 25 [m]\n",
"# Yw: 0 [m] (fixed)\n",
"\n",
"# 画像として表示する際の分解能(表示用)\n",
"resolution_X = 10 # pix/m\n",
"resolution_Z = 10 # pix/m\n",
"\n",
"wcs_sample = np.zeros((50*resolution_Z, 50*resolution_Z, 3), np.uint8)\n",
"wcs_sample[:,:,2] = 255 # Blue"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"def WCS_to_WCSImageCS(img, pt, resolution_X, resolution_Z):\n",
" '''WCSのYw=0平面を画像として表示する際の座標変換関数'''\n",
" Xw = pt[0]\n",
" Zw = pt[1]\n",
" w = int(img.shape[0]/2)\n",
" h = img.shape[1]\n",
" x = Xw * resolution_X + w\n",
" y = h - Zw * resolution_Z\n",
" return [x, y]\n",
"\n",
"assert [0,0] == WCS_to_WCSImageCS(wcs_sample, [-25, 50], resolution_X, resolution_Z), \"error\"\n",
"assert [250, 250] == WCS_to_WCSImageCS(wcs_sample, [0, 25], resolution_X, resolution_Z), \"error\"\n",
"assert [500, 500] == WCS_to_WCSImageCS(wcs_sample, [25, 0], resolution_X, resolution_Z), \"error\""
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"# Polygon [[X1w, Z1w],[X2w, Z2w],[X3w, Z3w], ....]\n",
"rect1_wcs = [[2, 30], [6, 30], [6, 34], [2, 34]]\n",
"rect2_wcs = [[-2, 30], [-6, 30], [-6, 34], [-2, 34]]\n",
"rect3_wcs = [[10, 30], [14, 30], [14, 34], [10, 34]]\n",
"rect4_wcs = [[-10, 30], [-14, 30], [-14, 34], [-10, 34]]\n",
"rect5_wcs = [[2, 20], [6, 20], [6, 24], [2, 24]]\n",
"rect6_wcs = [[-2, 20], [-6, 20], [-6, 24], [-2, 24]]\n",
"rect7_wcs = [[10, 20], [14, 20], [14, 24], [10, 24]]\n",
"rect8_wcs = [[-10, 20], [-14, 20], [-14, 24], [-10, 24]]\n",
"rect9_wcs = [[2, 10], [6, 10], [6, 14], [2, 14]]\n",
"rect10_wcs = [[-2, 10], [-6, 10], [-6, 14], [-2, 14]]\n",
"rect11_wcs = [[10, 10], [14, 10], [14, 14], [10, 14]]\n",
"rect12_wcs = [[-10, 10], [-14, 10], [-14, 14], [-10, 14]]\n",
"\n",
"polygons_wcs_xz = [rect1_wcs, rect2_wcs, rect3_wcs, rect4_wcs, \n",
" rect5_wcs, rect6_wcs, rect7_wcs, rect8_wcs,\n",
" rect9_wcs, rect10_wcs, rect11_wcs, rect12_wcs]"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"wcs_sample_copy = wcs_sample.copy()\n",
"\n",
"polygons_wcsImg = []\n",
"for pts in polygons_wcs_xz:\n",
" polygons_wcsImg.append([WCS_to_WCSImageCS(wcs_sample_copy, pt, resolution_X, resolution_Z) for pt in pts])\n",
" \n",
"for pts in polygons_wcsImg:\n",
" cv2.fillConvexPoly(wcs_sample_copy, np.array(pts), (255,255,255))\n",
"\n",
"plt.imshow(wcs_sample_copy)\n",
"plt.xlabel(\"$X_w$ [m]\")\n",
"plt.xticks([0,250,500],[\"-25\", \"0\", \"25\"])\n",
"plt.ylabel(\"$Z_w$ [m]\")\n",
"plt.yticks([0,250,500],[\"50\", \"25\", \"0\"])\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 座標系 / パラメータの定義\n",
"- WCS からズレた位置にカメラ座標系(CCS)及び画像座標系(ICS)を定義する\n",
" - カメラ外部パラメータ = WCS と CCS の幾何的関係(並進、回転)を定義する\n",
" - カメラの内部パラメータ(焦点距離, 画素ピッチ, 画像中心)を定義する\n",
" - カメラの画素数を定義する"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### 外部パラメータ(平行移動ベクトル・回転行列)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"class CamOuterParams(): \n",
" def __init__(self, Ocss_x=0.0, Ocss_y=0.0, Ocss_z=0.0, alpha=0.0, beta=0.0, gamma=0.0):\n",
" \"\"\"\n",
" # Arguments\n",
" Ocss_x: CSS 原点の WCS における位置原点 X 座標 [m]\n",
" Ocss_y: CSS 原点の WCS における位置原点 Y 座標 [m]\n",
" Ocss_z: CSS 原点の WCS における位置原点 Z 座標 [m]\n",
" alpha: CCS の WCS X軸まわりの回転 [deg]\n",
" beta: CCS の WCS Y軸まわりの回転 [deg]\n",
" gamma: CCS の WCS Z軸まわりの回転 [deg]\n",
" \"\"\"\n",
" # 3次元平行移動ベクトル (CSS から見た WCS の原点へのベクトル)\n",
" self._translation_matrix = np.transpose(np.array([-Ocss_x, -Ocss_y, -Ocss_z]))\n",
" \n",
" # deg to rad\n",
" alpha = math.pi/180 * alpha \n",
" beta = math.pi/180 * beta\n",
" gamma = math.pi/180 * beta \n",
" \n",
" R_Z = np.array([[math.cos(gamma), -1.*math.sin(gamma), 0.],\n",
" [math.sin(gamma), math.cos(gamma) , 0.],\n",
" [0. , 0. , 1.]])\n",
"\n",
" R_Y = np.array([[math.cos(beta) , 0., math.sin(beta)],\n",
" [0. , 1., 0. ],\n",
" [-1.*math.sin(beta), 0., math.cos(beta)]])\n",
"\n",
" R_X = np.array([[1., 0. , 0. ],\n",
" [0., math.cos(alpha), -1.*math.sin(alpha)],\n",
" [0., math.sin(alpha), math.cos(alpha) ]])\n",
" # 3次元回転ベクトル\n",
" self._rotation_matrix = np.dot(np.dot(R_Z, R_Y), R_X)\n",
" \n",
" @property\n",
" def rotation_matrix(self):\n",
" return self._rotation_matrix\n",
" \n",
" @property\n",
" def translation_matrix(self):\n",
" return self._translation_matrix"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### カメラ内部パラメータ\n",
"カメラは XCG-CG510C(SONY) を仮定する"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"class CamInnerParams():\n",
" def __init__(self, \n",
" f=5,\n",
" delta_u = 4.54e-3,\n",
" delta_v = 4.54e-3,\n",
" ImageH = 2464,\n",
" ImageV = 2056,\n",
" delta_c_u = 0,\n",
" delta_c_v = 0):\n",
" \"\"\"\n",
" # Arguments:\n",
" f: 焦点距離[mm]\n",
" del_u: カメラ画素横方向サイズ [mm]\n",
" del_v: カメラ画素縦方向サイズ [mm]\n",
" ImageH: カメラ横方向画素数\n",
" ImageV: カメラ縦方向画素数\n",
" del_c_u: 画像座標系における光軸と画像面(投影面)との交点の画像中心からの横方向位置 [pixel]\n",
" del_c_v: 画像座標系における光軸と画像面(投影面)との交点の画像中心からの縦方向位置 [pixel]\n",
" \"\"\"\n",
" # instance member\n",
" self._f = f\n",
" self._delta_u = delta_u\n",
" self._delta_v = delta_v\n",
" self._imageH = ImageH\n",
" self._imageV = ImageV\n",
" self._c_u = (ImageH - 1) / 2.0 + delta_c_u\n",
" self._c_v = (ImageV - 1) / 2.0 + delta_c_v\n",
" \n",
" @property\n",
" def f(self):\n",
" return self._f\n",
" @property\n",
" def delta_u(self):\n",
" return self._delta_u\n",
" @property\n",
" def delta_v(self):\n",
" return self._delta_v\n",
" @property\n",
" def c_u(self):\n",
" return self._c_u\n",
" @property\n",
" def c_v(self):\n",
" return self._c_v\n",
" @property\n",
" def imageH(self):\n",
" return self._imageH\n",
" @property\n",
" def imageV(self):\n",
" return self._imageV"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 座標変換\n",
"- WCS to ICS の変換を行う\n",
"- ICS to WCS ($Y_w=0$) に変換する"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"class CS_Transform():\n",
" \"\"\"\n",
" WCS を対象とした座標変換クラス\n",
" input 座標値は横ベクトル (X, Y, Z) を仮定する\n",
" \"\"\"\n",
" def __init__(self, cam_inner_params, cam_outer_params):\n",
" \"\"\"\n",
" # Arguments\n",
" cam_inner_params: CamInnerParams クラスのインスタンス\n",
" cam_outer_params: CamOuterParams クラスのインスタンス\n",
" \"\"\"\n",
" self._cam_inner_params = cam_inner_params\n",
" self._translation_matrix = cam_outer_params.translation_matrix\n",
" self._rotation_matrix = cam_outer_params.rotation_matrix\n",
" \n",
" @property\n",
" def cam_inner_params(self):\n",
" return self._cam_inner_params\n",
" \n",
" def wcs2ccs(self, point_wcs):\n",
" \"\"\"\n",
" # Arguments\n",
" point_wcs: ndarray\n",
" wcs の座標位置 (Xw, Yw, Zw) [m]\n",
" # Returns\n",
" point_ccs: ndarray\n",
" ccs での座標位置 (X, Y, Z) [m]\n",
" \"\"\"\n",
" transposed_point_wcs = point_wcs.T\n",
" point_ccs = np.dot(self._rotation_matrix, transposed_point_wcs) + self._translation_matrix\n",
" return point_ccs.T\n",
" \n",
" def ccs2normics(self, point_ccs):\n",
" \"\"\"\n",
" # Arguments\n",
" point_ccs: ndarray\n",
" ccs での座標位置 (X, Y, Z) [m]\n",
" # Retruns\n",
" point_normics: ndarray\n",
" normalized ics での座標位置 (x, y) [mm]\n",
" \"\"\"\n",
" X = point_ccs[0]\n",
" Y = point_ccs[1]\n",
" Z = point_ccs[2]\n",
" if Z == 0.0:\n",
" Z = 1e-9\n",
" return np.array([X/Z, Y/Z])\n",
" \n",
" def normics2ics(self, point_normics):\n",
" \"\"\"\n",
" # Arguments\n",
" point_normics: ndarray\n",
" normalized ics での座標位置 (x, y) [mm]\n",
" # Retruns\n",
" point_ics: ndarray\n",
" ics での座標位置 (u, v) [pixel]\n",
" 注意: 本計算では, 正規化画像座標系 y 方向と画像座標系 v 方向が一致していると仮定している.\n",
"  実際の多くのケースでは y 方向と v 方向は逆行する点に注意が必要.\n",
" \"\"\"\n",
" x = point_normics[0]\n",
" y = point_normics[1]\n",
" \n",
" u = x * self._cam_inner_params.f / self._cam_inner_params.delta_u + self._cam_inner_params.c_u\n",
" v = y * self._cam_inner_params.f / self._cam_inner_params.delta_v + self._cam_inner_params.c_v\n",
" return np.array([int(u),int(v)])\n",
" \n",
" def wcs2ics(self, point_wcs):\n",
" \"\"\"\n",
" # Arguments\n",
" point_wcs: ndarray\n",
" wcs の座標位置 (Xw, Yw, Zw) [m]\n",
" # Returns\n",
" point_ics: ndarray\n",
" ics での座標位置 (u, v) [pixel]\n",
" \"\"\"\n",
" return self.normics2ics(self.ccs2normics(self.wcs2ccs(point_wcs)))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### シミュレーション結果\n",
"#### 計算1"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"cam_outer_params = CamOuterParams(Ocss_x=-0.1, Ocss_y=1.5, Ocss_z=-1.0, alpha=0.0, beta=0.0, gamma=0.0)\n",
"cam_innter_params = CamInnerParams(delta_c_u=0, delta_c_v=0) # 画像中心と一致\n",
"fn_transforms = CS_Transform(cam_innter_params, cam_outer_params)\n",
"\n",
"polygons_icsImg = []\n",
"for pts in polygons_wcs_xz:\n",
" pts_np = np.array(pts)\n",
" pts_xyz = np.insert(pts_np, 1, [0,0,0,0], axis=1)\n",
" polygons_icsImg.append([list(fn_transforms.wcs2ics(pt)) for pt in pts_xyz])\n",
"\n",
"ics_sample = np.zeros((cam_innter_params.imageV, cam_innter_params.imageH, 3), np.uint8)\n",
"ics_sample[:,:,2] = 255\n",
"\n",
"for pts in polygons_icsImg:\n",
" cv2.fillConvexPoly(ics_sample, np.array(pts), (255,255,255))\n",
"\n",
"# v の方向に注意\n",
"plt.imshow(ics_sample)\n",
"plt.vlines(x=(cam_innter_params.imageH-1)/2.0, ymin=0, ymax=cam_innter_params.imageV-1, colors=\"r\")\n",
"plt.hlines(y=(cam_innter_params.imageV-1)/2.0, xmin=0, xmax=cam_innter_params.imageH-1, colors=\"r\")\n",
"plt.ylim([0, cam_innter_params.imageV])\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### 計算2"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# Ocss_x = -2.0に変更\n",
"cam_outer_params = CamOuterParams(Ocss_x=-2.0, Ocss_y=1.5, Ocss_z=-1.0, alpha=0.0, beta=0.0, gamma=0.0)\n",
"cam_innter_params = CamInnerParams(delta_c_u=0, delta_c_v=0) # 画像中心と一致\n",
"fn_transforms = CS_Transform(cam_innter_params, cam_outer_params)\n",
"\n",
"polygons_icsImg = []\n",
"for pts in polygons_wcs_xz:\n",
" pts_np = np.array(pts)\n",
" pts_xyz = np.insert(pts_np, 1, [0,0,0,0], axis=1)\n",
" polygons_icsImg.append([list(fn_transforms.wcs2ics(pt)) for pt in pts_xyz])\n",
"\n",
"ics_sample = np.zeros((cam_innter_params.imageV, cam_innter_params.imageH, 3), np.uint8)\n",
"ics_sample[:,:,2] = 255\n",
"\n",
"for pts in polygons_icsImg:\n",
" cv2.fillConvexPoly(ics_sample, np.array(pts), (255,255,255))\n",
"\n",
"plt.imshow(ics_sample)\n",
"plt.vlines(x=(cam_innter_params.imageH-1)/2.0, ymin=0, ymax=cam_innter_params.imageV-1, colors=\"r\")\n",
"plt.hlines(y=(cam_innter_params.imageV-1)/2.0, xmin=0, xmax=cam_innter_params.imageH-1, colors=\"r\")\n",
"plt.ylim([0, cam_innter_params.imageV])\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### 計算3"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# alpha = -5, Ocss_y = 5.0, Ocss_x=0.0 に変更\n",
"cam_outer_params = CamOuterParams(Ocss_x=0.0, Ocss_y=5.0, Ocss_z=-1.0, alpha=-5.0, beta=0.0, gamma=0.0)\n",
"cam_innter_params = CamInnerParams(delta_c_u=0, delta_c_v=0) # 画像中心と一致\n",
"fn_transforms = CS_Transform(cam_innter_params, cam_outer_params)\n",
"\n",
"polygons_icsImg = []\n",
"for pts in polygons_wcs_xz:\n",
" pts_np = np.array(pts)\n",
" pts_xyz = np.insert(pts_np, 1, [0,0,0,0], axis=1)\n",
" polygons_icsImg.append([list(fn_transforms.wcs2ics(pt)) for pt in pts_xyz])\n",
"\n",
"ics_sample = np.zeros((cam_innter_params.imageV, cam_innter_params.imageH, 3), np.uint8)\n",
"ics_sample[:,:,2] = 255\n",
"\n",
"for pts in polygons_icsImg:\n",
" cv2.fillConvexPoly(ics_sample, np.array(pts), (255,255,255))\n",
"\n",
"# v の方向に注意\n",
"plt.imshow(ics_sample)\n",
"plt.vlines(x=(cam_innter_params.imageH-1)/2.0, ymin=0, ymax=cam_innter_params.imageV-1, colors=\"r\")\n",
"plt.hlines(y=(cam_innter_params.imageV-1)/2.0, xmin=0, xmax=cam_innter_params.imageH-1, colors=\"r\")\n",
"plt.ylim([0, cam_innter_params.imageV])\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 練習2: ICS から Bird's-eye View 画像作成\n",
"---\n",
"練習1の計算1が撮影された画像であると仮定して、鳥瞰図を作成する. \n",
"\n",
"- 方法1 \n",
" - WCS (Y=0) の鳥観図描画領域を微小グリッド状に切って, 微小グリッド毎に ICS 画像との幾何的関係を計算し, 透視変換を繰り返し連結する.\n",
"- 方法2\n",
" - WCS (Y=0) の鳥観図描画領域の4隅とICS 画像の帰化的関係を計算し, 1回の透視変換で鳥瞰図を生成する."
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [],
"source": [
"class GenBirdsEyeViewImage():\n",
" def __init__(self,\n",
" cs_transform,\n",
" srcImg,\n",
" startXw = - 8.0,\n",
" endXw = 8.0,\n",
" startZw = 0,\n",
" endZw = 30.0,\n",
" calcStepXw = 0.25,\n",
" calcStepZw = 0.25,\n",
" birdsEyeImageResolution = 100):\n",
" \"\"\"\n",
" # Arguments\n",
" cs_transform: CS_Transform クラスのインスタンス\n",
" srcImg: ndarray\n",
" ICS の画像\n",
" startXw: 鳥瞰画像 Xw 方向描画開始位置 [m]\n",
" endXw: 鳥瞰画像 Xw 方向描画終了位置 [m]\n",
" startZw: 鳥瞰画像 Zw 方向描画開始位置 [m]\n",
" endZw: 鳥瞰画像 Zw 方向描画終了位置 [m]\n",
" calcStepXw: Xw 方向微小グリッドの計算ステップ [m]\n",
" calcStepZw: Zw 方向微小グリッドの計算ステップ [m]\n",
" birdsEyeImageResolution: 鳥瞰画像の解像度 [pixel/m]\n",
" \"\"\"\n",
" self.cs_transform = cs_transform\n",
" self.srcImg = np.copy(srcImg)\n",
" self.startXw = startXw\n",
" self.endXw = endXw\n",
" self.startZw = startZw\n",
" self.endZw = endZw\n",
" self.calcStepXw = calcStepXw\n",
" self.calcStepZw = calcStepZw\n",
" self.birdsEyeImageResolution = birdsEyeImageResolution\n",
" \n",
" def WCS2BirdsEyeViewPixel(self, pt_wcs):\n",
" \"\"\"\n",
" WCS上の点の鳥瞰画像におけるピクセル座標を計算する\n",
" # Arguments\n",
" pt_wcs: ndarray\n",
" Yw=0上の点座標 [Xw, 0, Zw] [m]\n",
" # Retruns\n",
" 鳥瞰画像のピクセル座標 (x,y)\n",
" \"\"\"\n",
" assert pt_wcs[1] == 0, \"Yw=0 が必要です.\" # 鳥瞰変換ゆえ \n",
" x = (pt_wcs[0] - self.startXw) * self.birdsEyeImageResolution\n",
" y = (pt_wcs[2] - self.startZw) * self.birdsEyeImageResolution\n",
" return np.array([x,y])\n",
" \n",
" def generateBirdsEyeViewImage(self):\n",
" # 出力画像の初期化\n",
" dstWidth = int((self.endXw - self.startXw) * self.birdsEyeImageResolution)\n",
" dstHeight = int((self.endZw - self.startZw) * self.birdsEyeImageResolution)\n",
" dstImg = np.zeros((dstHeight, dstWidth, 3), np.uint8)\n",
" # WCS 上でグリッドを定義し, WCS上の4点をICS上の4点に変換\n",
" # ICS 上 4点の pixel => WCS上 4点に相当する鳥瞰画像上の pixel 4点 への透視変換行列を計算\n",
" # 上記処理をグリッド毎にループ\n",
" for x in np.arange(self.startXw, self.endXw, self.calcStepXw):\n",
" for z in np.arange(self.startZw, self.endZw, self.calcStepZw):\n",
" \n",
" # WCS 上の点(Yw=0平面)\n",
" pt1_wcs = np.array([x, 0, z])\n",
" pt2_wcs = np.array([x + self.calcStepXw, 0, z])\n",
" pt3_wcs = np.array([x + self.calcStepXw, 0, z + self.calcStepZw])\n",
" pt4_wcs = np.array([x, 0, z + self.calcStepZw])\n",
" \n",
" # ICS 上の pixel 座標 (u,v) 計算\n",
" pt1_ics = self.cs_transform.wcs2ics(pt1_wcs)\n",
" pt2_ics = self.cs_transform.wcs2ics(pt2_wcs)\n",
" pt3_ics = self.cs_transform.wcs2ics(pt3_wcs)\n",
" pt4_ics = self.cs_transform.wcs2ics(pt4_wcs)\n",
" \n",
" # 鳥瞰画像上の pixel 座標 (x,y) 値\n",
" pt1_birdImg = self.WCS2BirdsEyeViewPixel(pt1_wcs)\n",
" pt2_birdImg = self.WCS2BirdsEyeViewPixel(pt2_wcs)\n",
" pt3_birdImg = self.WCS2BirdsEyeViewPixel(pt3_wcs)\n",
" pt4_birdImg = self.WCS2BirdsEyeViewPixel(pt4_wcs)\n",
" # 透視変換\n",
" pts_src = np.float32([pt1_ics, pt2_ics, pt3_ics, pt4_ics])\n",
" pts_dst = np.float32([pt1_birdImg, pt2_birdImg, pt3_birdImg, pt4_birdImg])\n",
" matrix = cv2.getPerspectiveTransform(pts_src, pts_dst)\n",
" srcImg_transformed = cv2.warpPerspective(self.srcImg, matrix, (dstWidth, dstHeight))\n",
" # 鳥瞰画像上の該当ピクセルのみコピー\n",
" # 点 (x,y) の指定と画像 (row, col) の関係に注意\n",
" dstImg[int(pt1_birdImg[1]):int(pt3_birdImg[1]),\n",
" int(pt1_birdImg[0]):int(pt3_birdImg[0]),:] = \\\n",
" srcImg_transformed[int(pt1_birdImg[1]):int(pt3_birdImg[1]),\n",
" int(pt1_birdImg[0]):int(pt3_birdImg[0]),:]\n",
" return dstImg"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [],
"source": [
"class GenBirdsEyeViewImage2():\n",
" def __init__(self,\n",
" cs_transform,\n",
" srcImg,\n",
" startXw = - 8.0,\n",
" endXw = 8.0,\n",
" startZw = 0,\n",
" endZw = 30.0,\n",
" birdsEyeImageResolution = 100):\n",
" \"\"\"\n",
" # Arguments\n",
" cs_transform: CS_Transform クラスのインスタンス\n",
" srcImg: ndarray\n",
" ICS の画像\n",
" startXw: 鳥瞰画像 Xw 方向描画開始位置 [m]\n",
" endXw: 鳥瞰画像 Xw 方向描画終了位置 [m]\n",
" startZw: 鳥瞰画像 Zw 方向描画開始位置 [m]\n",
" endZw: 鳥瞰画像 Zw 方向描画終了位置 [m]\n",
" calcStepXw: Xw 方向微小グリッドの計算ステップ [m]\n",
" calcStepZw: Zw 方向微小グリッドの計算ステップ [m]\n",
" birdsEyeImageResolution: 鳥瞰画像の解像度 [pixel/m]\n",
" \"\"\"\n",
" self.cs_transform = cs_transform\n",
" self.srcImg = np.copy(srcImg)\n",
" self.startXw = startXw\n",
" self.endXw = endXw\n",
" self.startZw = startZw\n",
" self.endZw = endZw\n",
" self.birdsEyeImageResolution = birdsEyeImageResolution\n",
" \n",
" def WCS2BirdsEyeViewPixel(self, pt_wcs):\n",
" \"\"\"\n",
" WCS上の点の鳥瞰画像におけるピクセル座標を計算する\n",
" # Arguments\n",
" pt_wcs: ndarray\n",
" Yw=0上の点座標 [Xw, 0, Zw] [m]\n",
" # Retruns\n",
" 鳥瞰画像のピクセル座標 (x,y)\n",
" \"\"\"\n",
" assert pt_wcs[1] == 0, \"Yw=0 が必要です.\" # 鳥瞰変換ゆえ \n",
" x = (pt_wcs[0] - self.startXw) * self.birdsEyeImageResolution\n",
" y = (pt_wcs[2] - self.startZw) * self.birdsEyeImageResolution\n",
" return np.array([x,y])\n",
" \n",
" def generateBirdsEyeViewImage(self):\n",
" # 出力画像の初期化\n",
" dstWidth = int((self.endXw - self.startXw) * self.birdsEyeImageResolution)\n",
" dstHeight = int((self.endZw - self.startZw) * self.birdsEyeImageResolution)\n",
" dstImg = np.zeros((dstHeight, dstWidth, 3), np.uint8)\n",
" # 鳥観図変換する WCS の領域4隅をICS上の4点に変換\n",
" # ICS 上 4点の pixel => WCS上 4点に相当する鳥瞰画像上の pixel 4点 への透視変換行列を計算し一回の透視変換で鳥観図作成\n",
" \n",
" # WCS 上の点(Yw=0平面)\n",
" pt1_wcs = np.array([self.startXw, 0, self.startZw])\n",
" pt2_wcs = np.array([self.startXw, 0, self.endZw])\n",
" pt3_wcs = np.array([self.endXw, 0, self.endZw])\n",
" pt4_wcs = np.array([self.endXw, 0, self.startZw])\n",
"\n",
" # ICS 上の pixel 座標 (u,v) 計算\n",
" pt1_ics = self.cs_transform.wcs2ics(pt1_wcs)\n",
" pt2_ics = self.cs_transform.wcs2ics(pt2_wcs)\n",
" pt3_ics = self.cs_transform.wcs2ics(pt3_wcs)\n",
" pt4_ics = self.cs_transform.wcs2ics(pt4_wcs)\n",
"\n",
" # 鳥瞰画像上の pixel 座標 (x,y) 値\n",
" pt1_birdImg = self.WCS2BirdsEyeViewPixel(pt1_wcs)\n",
" pt2_birdImg = self.WCS2BirdsEyeViewPixel(pt2_wcs)\n",
" pt3_birdImg = self.WCS2BirdsEyeViewPixel(pt3_wcs)\n",
" pt4_birdImg = self.WCS2BirdsEyeViewPixel(pt4_wcs)\n",
" # 透視変換\n",
" pts_src = np.float32([pt1_ics, pt2_ics, pt3_ics, pt4_ics])\n",
" pts_dst = np.float32([pt1_birdImg, pt2_birdImg, pt3_birdImg, pt4_birdImg])\n",
" matrix = cv2.getPerspectiveTransform(pts_src, pts_dst)\n",
" dstImg = cv2.warpPerspective(self.srcImg, matrix, (dstWidth, dstHeight))\n",
"\n",
" return dstImg"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 変換元画像の生成"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"cam_outer_params = CamOuterParams(Ocss_x=-0.1, Ocss_y=1.5, Ocss_z=-1.0, alpha=0.0, beta=0.0, gamma=0.0)\n",
"cam_innter_params = CamInnerParams(delta_c_u=0, delta_c_v=0) # 画像中心と一致\n",
"cs_transforms = CS_Transform(cam_innter_params, cam_outer_params)\n",
"\n",
"polygons_icsImg = []\n",
"for pts in polygons_wcs_xz:\n",
" pts_np = np.array(pts)\n",
" pts_xyz = np.insert(pts_np, 1, [0,0,0,0], axis=1)\n",
" polygons_icsImg.append([list(cs_transforms.wcs2ics(pt)) for pt in pts_xyz])\n",
"\n",
"ics_sample = np.zeros((cam_innter_params.imageV, cam_innter_params.imageH, 3), dtype=np.uint8)\n",
"ics_sample[:,:,2] = 255\n",
"\n",
"for pts in polygons_icsImg:\n",
" cv2.fillConvexPoly(ics_sample, np.array(pts), (255,255,255))\n",
"\n",
"# v の方向に注意\n",
"plt.imshow(ics_sample)\n",
"plt.ylim([0, cam_innter_params.imageV])\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 変換実行\n",
"#### 方法1"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"birdsView = GenBirdsEyeViewImage(cs_transforms, ics_sample, startXw=-8.0, endXw=8.0, startZw=0, endZw=30, \n",
" calcStepXw=0.5, calcStepZw=0.5, birdsEyeImageResolution=100)\n",
"birdsImage = birdsView.generateBirdsEyeViewImage()\n",
"plt.imshow(birdsImage)\n",
"plt.ylim([0,3000])\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### 方法2"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"birdsView2 = GenBirdsEyeViewImage2(cs_transforms, ics_sample, startXw=-8.0, endXw=8.0, \n",
" startZw=0, endZw=30, birdsEyeImageResolution=100)\n",
"birdsImage2 = birdsView2.generateBirdsEyeViewImage()\n",
"plt.imshow(birdsImage2)\n",
"plt.ylim([0,3000])\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## まとめ\n",
"---\n",
"今回の試みを通して実際にコードにコードに落とすことで, 座標変換に対しする理解が深まった. \n",
"やはり, 本を読んで勉強するだけでなく実際に手を動かさないと技術は身につかない, ということを再認識した. "
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.8"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment