{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "name": "Open3D.ipynb", "provenance": [], "collapsed_sections": [ "9Q1M44nMAPyW", "lQ84t6x2A0un" ], "include_colab_link": true }, "kernelspec": { "name": "python3", "display_name": "Python 3" } }, "cells": [ { "cell_type": "markdown", "metadata": { "id": "view-in-github", "colab_type": "text" }, "source": [ "\"Open" ] }, { "cell_type": "markdown", "metadata": { "id": "dL_gG6Y3-sbT" }, "source": [ "# Open3D Visualize in Google Colab\n", "This notebook will think about how to visualize Open3D in Google Colab." ] }, { "cell_type": "markdown", "metadata": { "id": "o45hKikU-929" }, "source": [ "## Install Open3D" ] }, { "cell_type": "code", "metadata": { "id": "__IuaPNeCyKU" }, "source": [ "!pip install open3d" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "oMzIsQ1b_DGW" }, "source": [ "## Import Open3D and Numpy" ] }, { "cell_type": "code", "metadata": { "id": "AUnI0soSDwyU" }, "source": [ "import numpy as np\n", "import open3d as o3d" ], "execution_count": 2, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "vQjisWH5_rAH" }, "source": [ "## Read Point Cloud" ] }, { "cell_type": "code", "metadata": { "id": "9K1X0GbRGlO6", "colab": { "base_uri": "https://localhost:8080/" }, "outputId": "5a56cfdf-c1ca-491f-8d90-a9c8bd00ab58" }, "source": [ "!wget https://raw.githubusercontent.com/PointCloudLibrary/pcl/master/test/bunny.pcd" ], "execution_count": 3, "outputs": [ { "output_type": "stream", "text": [ "--2021-07-29 09:53:05-- https://raw.githubusercontent.com/PointCloudLibrary/pcl/master/test/bunny.pcd\n", "Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.108.133, 185.199.109.133, 185.199.110.133, ...\n", "Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.108.133|:443... connected.\n", "HTTP request sent, awaiting response... 200 OK\n", "Length: 10878 (11K) [text/plain]\n", "Saving to: ‘bunny.pcd’\n", "\n", "\rbunny.pcd 0%[ ] 0 --.-KB/s \rbunny.pcd 100%[===================>] 10.62K --.-KB/s in 0s \n", "\n", "2021-07-29 09:53:05 (103 MB/s) - ‘bunny.pcd’ saved [10878/10878]\n", "\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "6LPKVOCjEtjv" }, "source": [ "cloud = o3d.io.read_point_cloud(\"bunny.pcd\")\n", "if cloud.is_empty(): exit()" ], "execution_count": 4, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "Prfv0QYl_tGx" }, "source": [ "## Estimate Normals" ] }, { "cell_type": "code", "metadata": { "id": "g-Wbz7wHVeFZ" }, "source": [ "cloud.estimate_normals(search_param=o3d.geometry.KDTreeSearchParamHybrid(radius=0.1, max_nn=30))" ], "execution_count": 5, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "9Q1M44nMAPyW" }, "source": [ "## Visualize using o3d.visualization.draw_geometries()\n", "o3d.visualization.draw_geometries() is work fine outside Jupyter. \n", "But, it does not work inside Jupyter and Goolge Colab." ] }, { "cell_type": "code", "metadata": { "id": "Xp2S0Ec6FSE7", "outputId": "def3fe4c-1542-4bf7-e375-6cabb60b9bc3", "colab": { "base_uri": "https://localhost:8080/" } }, "source": [ "#o3d.visualization.draw_geometries([cloud])" ], "execution_count": 6, "outputs": [ { "output_type": "stream", "text": [ "\u001b[1;33m[Open3D WARNING] GLFW Error: X11: The DISPLAY environment variable is missing\u001b[0;m\n", "\u001b[1;33m[Open3D WARNING] Failed to initialize GLFW\u001b[0;m\n", "\u001b[1;33m[Open3D WARNING] [DrawGeometries] Failed creating OpenGL window.\u001b[0;m\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "lQ84t6x2A0un" }, "source": [ "## Visualize using o3d.visualization.Visualizer()\n", "o3d.visualization.Visualizer() is work fine outside Jupyter. \n", "But, it does not work inside Jupyter and Goolge Colab." ] }, { "cell_type": "code", "metadata": { "id": "k-9aM5Rs_P5N" }, "source": [ "#visualizer = o3d.visualization.Visualizer()\n", "#visualizer.create_window(window_name=\"point cloud\", width=1280, height=720, visible=False)\n", "#visualizer.add_geometry(cloud)\n", "#visualizer.run()" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "Fw-WPw2ODHuH" }, "source": [ "## Visualize using JVisualizer()\n", "Opne3D added experimental support for Jupyter visualization with WebGL. JVisualizer() is work fine inside Jupyter at local. \n", "It is required with Open3D with feature enabled. It does not work in Goolge Colab.\n" ] }, { "cell_type": "code", "metadata": { "id": "Q9WF23-_F_R-" }, "source": [ "# from open3d import JVisualizer\n", "\n", "#visualizer = JVisualizer()\n", "#visualizer.add_geometry(cloud)\n", "#visualizer.show()" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "uRViSa_lBCJU" }, "source": [ "## Visualize using o3d.visualization.Visualizer() with IPython.display\n", "o3d.visualization.Visualizer() with IPython.display is work fine inside Jupyter. It displays image that captured viewer launched outside. \n", "But, it does not work in Goolge Colab." ] }, { "cell_type": "code", "metadata": { "id": "zatHvhdQccAl" }, "source": [ "#import PIL.Image\n", "#from IPython.display import display\n", "\n", "#visualizer = o3d.visualization.Visualizer()\n", "#visualizer.create_window(window_name=\"point cloud\", width=1280, height=720, visible=False)\n", "#visualizer.add_geometry(cloud)\n", "#visualizer.update_geometry(cloud)\n", "#visualizer.poll_events()\n", "#image = visualizer.capture_screen_float_buffer()\n", "#visualizer.destroy_window()\n", "#image = (255.0 * np.asarray(image)).astype(np.uint8)\n", "#display(PIL.Image.fromarray(image, \"RGB\"))" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "ha6Mm4lbDq6k" }, "source": [ "## Visualize using Matplotlib\n", "In this section, it will visualize point cloud as a scatter plot using matplotlib. \n", "It works fine in inside Jupyter and Goolge Colab. But, it is image.\n" ] }, { "cell_type": "code", "metadata": { "id": "xkfNgGRN_fn3" }, "source": [ "import matplotlib.pyplot as plt\n", "from mpl_toolkits import mplot3d" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "cydG8ceDOxzq" }, "source": [ "points = np.asarray(cloud.points)" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "K_IRumbxOTYs" }, "source": [ "colors = None\n", "if cloud.has_colors():\n", " colors = np.asarray(cloud.colors)\n", "elif cloud.has_normals():\n", " colors = (0.5, 0.5, 0.5) + np.asarray(cloud.normals) * 0.5\n", "else:\n", " geometry.paint_uniform_color((1.0, 0.0, 0.0))\n", " colors = np.asarray(geometry.colors)" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 248 }, "id": "wok4OF12Iv6D", "outputId": "364c58d1-65bf-444a-ccb8-2f398e24e5c7" }, "source": [ "# Single View\n", "ax = plt.axes(projection='3d')\n", "ax.view_init(90, -90)\n", "ax.axis(\"off\")\n", "ax.scatter(points[:,0], points[:,1], points[:,2], s=1, c=colors)\n", "plt.show()" ], "execution_count": null, "outputs": [ { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } } ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 248 }, "id": "Lg_ROowJepa-", "outputId": "f9b2bf64-3cbb-450e-dcb0-56141d4dc5ab" }, "source": [ "# Multi View\n", "figsize = plt.rcParams.get('figure.figsize')\n", "fig = plt.figure(figsize=(figsize[0] * 2, figsize[1]))\n", "ax1 = fig.add_subplot(1, 2, 1, projection = '3d')\n", "ax2 = fig.add_subplot(1, 2, 2, projection = '3d')\n", "ax1.axis(\"off\")\n", "ax1.view_init(90, -90) # front view\n", "ax1.scatter(points[:,0], points[:,1], points[:,2], s=1, c=colors)\n", "ax2.axis(\"off\")\n", "ax2.view_init(90 + 90, -90) # top view\n", "ax2.scatter(points[:,0], points[:,1], points[:,2], s=1, c=colors)\n", "plt.show()" ], "execution_count": null, "outputs": [ { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } } ] }, { "cell_type": "markdown", "metadata": { "id": "0bIiGUKMPL_s" }, "source": [ "## Visualize with Plotly\n", "In this section, it will visualize point cloud as a scatter plot using plotly. It is able to move viewpoint using mouse. \n", "It works fine in inside Jupyter and Goolge Colab. :thumbsup:" ] }, { "cell_type": "code", "metadata": { "id": "Esm494vvQWIN" }, "source": [ "import plotly.graph_objects as go" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 542 }, "id": "N17gEj9pQfns", "outputId": "44757bc7-1a9e-493f-c072-1d7e89d8b6cd" }, "source": [ "fig = go.Figure(\n", " data=[\n", " go.Scatter3d(\n", " x=points[:,0], y=points[:,1], z=points[:,2], \n", " mode='markers',\n", " marker=dict(size=1, color=colors)\n", " )\n", " ],\n", " layout=dict(\n", " scene=dict(\n", " xaxis=dict(visible=False),\n", " yaxis=dict(visible=False),\n", " zaxis=dict(visible=False)\n", " )\n", " )\n", ")\n", "fig.show()" ], "execution_count": null, "outputs": [ { "output_type": "display_data", "data": { "text/html": [ "\n", "\n", "\n", "
\n", " \n", " \n", " \n", "
\n", " \n", "
\n", "\n", "" ] }, "metadata": { "tags": [] } } ] }, { "cell_type": "markdown", "metadata": { "id": "Ps_eG8YrjnEN" }, "source": [ "As well as, You can visualize mesh using plotly in Google Colab." ] }, { "cell_type": "code", "metadata": { "id": "AK1LavRPkFQS", "colab": { "base_uri": "https://localhost:8080/" }, "outputId": "aee7066c-56bf-466f-c5f4-759bd8ad6249" }, "source": [ "!wget https://graphics.stanford.edu/~mdfisher/Data/Meshes/bunny.obj" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "--2021-03-03 04:20:22-- https://graphics.stanford.edu/~mdfisher/Data/Meshes/bunny.obj\n", "Resolving graphics.stanford.edu (graphics.stanford.edu)... 171.67.77.70\n", "Connecting to graphics.stanford.edu (graphics.stanford.edu)|171.67.77.70|:443... connected.\n", "HTTP request sent, awaiting response... 200 OK\n", "Length: 205917 (201K) [text/plain]\n", "Saving to: ‘bunny.obj’\n", "\n", "bunny.obj 100%[===================>] 201.09K 498KB/s in 0.4s \n", "\n", "2021-03-03 04:20:22 (498 KB/s) - ‘bunny.obj’ saved [205917/205917]\n", "\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "8E7NTFQfkJzo" }, "source": [ "mesh = o3d.io.read_triangle_mesh(\"bunny.obj\")\n", "if mesh.is_empty(): exit()" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "kXi90AcckMF5" }, "source": [ "if not mesh.has_vertex_normals(): mesh.compute_vertex_normals()\n", "if not mesh.has_triangle_normals(): mesh.compute_triangle_normals()" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "aDXrkoYakOHc" }, "source": [ "triangles = np.asarray(mesh.triangles)\n", "vertices = np.asarray(mesh.vertices)\n", "colors = None\n", "if mesh.has_triangle_normals():\n", " colors = (0.5, 0.5, 0.5) + np.asarray(mesh.triangle_normals) * 0.5\n", " colors = tuple(map(tuple, colors))\n", "else:\n", " colors = (1.0, 0.0, 0.0)" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 542 }, "id": "AAe7DdprqEO4", "outputId": "19f1214f-6f94-4c83-b771-fb4bf0938428" }, "source": [ "fig = go.Figure(\n", " data=[\n", " go.Mesh3d(\n", " x=vertices[:,0],\n", " y=vertices[:,1],\n", " z=vertices[:,2],\n", " i=triangles[:,0],\n", " j=triangles[:,1],\n", " k=triangles[:,2],\n", " facecolor=colors,\n", " opacity=0.50)\n", " ],\n", " layout=dict(\n", " scene=dict(\n", " xaxis=dict(visible=False),\n", " yaxis=dict(visible=False),\n", " zaxis=dict(visible=False)\n", " )\n", " )\n", ")\n", "fig.show()" ], "execution_count": null, "outputs": [ { "output_type": "display_data", "data": { "text/html": [ "\n", "\n", "\n", "
\n", " \n", " \n", " \n", "
\n", " \n", "
\n", "\n", "" ] }, "metadata": { "tags": [] } } ] }, { "cell_type": "markdown", "metadata": { "id": "8BiLgzrL_PLP" }, "source": [ "You can use Plotly like o3d.visualization.draw_geometries() for visualize Open3D geometries. " ] }, { "cell_type": "code", "metadata": { "id": "4KOnamTU_0T_" }, "source": [ "def draw_geometries(geometries):\n", " graph_objects = []\n", "\n", " for geometry in geometries:\n", " geometry_type = geometry.get_geometry_type()\n", " \n", " if geometry_type == o3d.geometry.Geometry.Type.PointCloud:\n", " points = np.asarray(geometry.points)\n", " colors = None\n", " if geometry.has_colors():\n", " colors = np.asarray(geometry.colors)\n", " elif geometry.has_normals():\n", " colors = (0.5, 0.5, 0.5) + np.asarray(geometry.normals) * 0.5\n", " else:\n", " geometry.paint_uniform_color((1.0, 0.0, 0.0))\n", " colors = np.asarray(geometry.colors)\n", "\n", " scatter_3d = go.Scatter3d(x=points[:,0], y=points[:,1], z=points[:,2], mode='markers', marker=dict(size=1, color=colors))\n", " graph_objects.append(scatter_3d)\n", "\n", " if geometry_type == o3d.geometry.Geometry.Type.TriangleMesh:\n", " triangles = np.asarray(geometry.triangles)\n", " vertices = np.asarray(geometry.vertices)\n", " colors = None\n", " if geometry.has_triangle_normals():\n", " colors = (0.5, 0.5, 0.5) + np.asarray(geometry.triangle_normals) * 0.5\n", " colors = tuple(map(tuple, colors))\n", " else:\n", " colors = (1.0, 0.0, 0.0)\n", " \n", " mesh_3d = go.Mesh3d(x=vertices[:,0], y=vertices[:,1], z=vertices[:,2], i=triangles[:,0], j=triangles[:,1], k=triangles[:,2], facecolor=colors, opacity=0.50)\n", " graph_objects.append(mesh_3d)\n", " \n", " fig = go.Figure(\n", " data=graph_objects,\n", " layout=dict(\n", " scene=dict(\n", " xaxis=dict(visible=False),\n", " yaxis=dict(visible=False),\n", " zaxis=dict(visible=False)\n", " )\n", " )\n", " )\n", " fig.show()" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 1000 }, "id": "WG5EhO6R_5XD", "outputId": "98f9679a-d37a-4a96-a776-3c851e7ffe44" }, "source": [ "o3d.visualization.draw_geometries = draw_geometries # replace function\n", "o3d.visualization.draw_geometries([cloud])\n", "o3d.visualization.draw_geometries([mesh])" ], "execution_count": null, "outputs": [ { "output_type": "display_data", "data": { "text/html": [ "\n", "\n", "\n", "
\n", " \n", " \n", " \n", "
\n", " \n", "
\n", "\n", "" ] }, "metadata": { "tags": [] } }, { "output_type": "display_data", "data": { "text/html": [ "\n", "\n", "\n", "
\n", " \n", " \n", " \n", "
\n", " \n", "
\n", "\n", "" ] }, "metadata": { "tags": [] } } ] } ] }