ISO/IEC MPEG (JTC 1/SC29/WG11)、およびつい最近ではISO/IEC MPEG 3DG (JTC 1/SC29/WG 7)が、既存の手法の圧縮能力を潜在的に超える圧縮能力を有する点群コーディング技術の標準化を検討している。今や解消しており個々の作業部会に分割している、以前はMPEGと呼ばれたグループが、この領域における専門家によって提案される圧縮技術設計を評価するための3次元グラフィックスチーム(3DG)と呼ばれる共同的な取組みの中で、この探求活動において一緒に作業中である。
点群圧縮活動は、通常、2つの異なる手法にカテゴリー化される。第1の手法は「ビデオ点群圧縮」(V-PCC:Video point cloud compression)であり、ビデオ点群圧縮は、3Dオブジェクトをセグメント化すること、および(2Dフレームの中の「パッチ」として表される)複数の2D平面の中でセグメントを投影することを伴い、セグメントは、HEVCなどのレガシー2Dビデオコーデックによってさらにコーディングされる。第2の手法は「ジオメトリ点群圧縮」(G-PCC)であり、ジオメトリ点群圧縮は、3Dジオメトリ、すなわち、3D空間の中の点のセットの位置、および(3Dジオメトリに関連する点ごとの)関連する属性値を直接圧縮することを伴う。G-PCCは、カテゴリー1(静的な点群)およびカテゴリー3(動的に取得される点群)の両方における点群の圧縮に対処する。
点群は、3D空間の中の点のセットを含み、点に関連する属性を有してよい。属性は、たとえば、R/G/B、Y/Cb/Crなどの色情報、反射率情報、または他のそのような属性であってよい。点群は、光検出および測距(LIDAR:light detection and ranging)スキャナまたは3Dスキャナなどの様々なカメラまたはセンサーによってキャプチャされてよく、同じくコンピュータ生成されてもよい。点群データは、限定はしないが、建築(たとえば、モデリング)、グラフィックス(たとえば、視覚化およびアニメーションのための3Dモデル)、および自動車産業(たとえば、ナビゲーションの助けとなるために使用されるLIDARセンサー)を含む、様々な適用例において使用され得る。
点群データによって占有される3D空間は、仮想的な境界ボックスによって覆われてよい。境界ボックスの中の点の位置は、いくつかの精度によって表されてよい。したがって、1つまたは複数の点の位置は、精度に基づいて量子化され得る。最小レベルにおいて、境界ボックスはボクセル(voxel)に分割され、ボクセルは、単位立方体によって表される、空間の最小単位である。境界ボックスの中のボクセルは、0個、1個、または2個以上の点に関連付けられてよい。境界ボックスは、タイルと呼ばれることがある複数の立方体/立方形領域に分割されてよく、各タイルは、1つまたは複数のスライスにコーディングされてよい。スライスおよびタイルへの境界ボックスの区分は、各区分の中の点の数に基づいてよく、または特定の領域をタイルとしてコーディングすることなどの他の考慮事項に基づいてもよい。スライス領域は、ビデオコーデックにおける分割決定と類似の分割決定を使用してさらに区分されてよい。
G-PCCエンコーダおよびデコーダは、それぞれ、平面モードおよび角度モードと呼ばれることもある、平面コーディングモードおよび角度コーディングモードをサポートし得る。平面モードは、ノードが占有されるコーディングを改善し得る技法である。あるノードの占有されるすべての子ノードが平面に隣接し、かつ平面に直交する次元に対して増大する座標値に関連する平面の側部の上にあるとき、平面モードが使用され得る。たとえば、あるノードの占有されるすべての子ノードが、そのノードの中心点を通過する水平面の上方または下方にあるとき、そのノードのために平面モードが使用されてよく、あるノードの占有されるすべての子ノードが、そのノードの中心点を通過する垂直面の近くの側部またはより遠い側部の上にあるとき、そのノードのために平面モードが使用されてよい。あるノードに対して、G-PCCエンコーダは、その次元が平面モードを用いてコーディングされるかどうかを指定するために、x次元、y次元、およびz次元の各々に対してシンタックス要素を符号化してよく、平面モードを用いてコーディングされる次元ごとに、平面位置シンタックス要素(すなわち、平面位置を示すシンタックス要素)がそれぞれの次元のためにシグナリングされてよい。ある次元のための平面位置シンタックス要素は、その次元に直交する平面が第1の位置にあるのかそれとも第2の位置にあるのかを示す。平面が第1の位置にある場合、平面はノードの境界に相当する。平面が第2の位置にある場合、平面はノードの3D中心を通過する。より一般的には、平面が第1の位置にある場合、ノードの中の点は、第1の位置であるノードのその側部の上にあり、第2の位置の側部の上にはなく、平面が第2の位置にある場合、ノードの中の点は、第2の位置であるノードのその側部の上にあり、その位置の側部の上にはない。したがって、z次元に対して、G-PCCコーダは、点群の点の3次元位置を表す8分木のノードの中で、平面モードの垂直面位置をコーディングしてよい。
点群は、しばしば、LIDARセンサーまたは他のレーザーベースセンサーを使用してキャプチャされ得る。角度コーディングモードは、平面モードと一緒に随意に使用され、典型的なLIDARセンサーの中の感知しているレーザービームの位置および仰角の知識を採用することによって、垂直(たとえば、z)平面位置シンタックス要素のコーディングを改善する。さらに、角度コーディングモードは、推測型ダイレクトコーディングモード(IDCM:inferred direct coding mode)における垂直のz位置ビットのコーディングを改善するために随意に使用され得る。
G-PCCコーダはまた、ツリー内量子化をサポートし得る。ツリー内ジオメトリスケーリングは、コーディングツリーが構成されつつある間であってもジオメトリ位置を量子化(エンコーダ)およびスケーリング(デコーダ)するための手段を提供する。点群の中の各点は、特定の幾何学的位置に位置する。8分木コーディングでは、位置についての情報は、直接シグナリングされない場合があるが、むしろ、(ルートノードからリーフノードまでの)階層にわたる8分木占有が、点のジオメトリ位置を示すために使用され得る。エンコーダにおいて、点、というよりむしろ点の占有される位置は、8分木のリーフノードの中に配置される。8分木のサイズは、各次元における位置のビット深度に依存する。ルートノードから始めて、8個のオクタントの各々の占有が(異なる方法で)コーディングされる。ルートノードにおける占有は、事実上、3つの次元における点位置の最上位ビット(MSB)をコーディングする。このプロセスは、点の位置を示すリーフノードまで継続する。デコーダは、点の位置を決定するために、リーフノードまで上に各レベルにおける8分木ノードの占有を決定する、類似のプロセスに従う。
ジオメトリ量子化は、ビットストリームの中でシグナリングされる8分木の中の特定のノード深度において適用される。ノード深度は、概して、8分木構文解析における特定のレベルを指す。8分木しか考慮されない(QTBTを伴わない)単純な場合には、8分木が12レベルを有すると考える。ルートノードにおいて、各子ノードは211×211×211というサイズを有する。これらのノードの各々は、ノード深度1にあるものと見なされてよい。ルートノードの子ノードの各々の子たちは、210×210×210というサイズを有することになり、これらはノード深度2におけるノードと見なされ、以下同様である。単純な例では、ノード座標が12ビットであり、かつ量子化が適用されることになる深度が3である場合、ノード座標の最初の3つのMSB(位置のMSB部分と呼ばれる)は量子化されず、ノード座標の最後の9つのLSB(位置のLSB部分と呼ばれる)だけが量子化される。量子化に起因して、9つのLSBは、Nビットなどのもっと少数のビットに低減されてよく、ただし、Nは9以下である。このことは、再構成精度という犠牲を払ってビットレートのいくらかの低減をもたらし得る。結果ノード座標サイズは(≦12となる)N+3になる。同様にデコーダにおいて、N個のLSBがスケーリングされるとともに1<<(9-1)という最大値にクリッピングされ、そのことは、スケーリングされた値が元の点の9つのLSBビットを超えないことを保証する。3つのMSBとスケーリングされたLSBの9ビットとを接合することによって、スケーリングされた最終の位置が計算される。
点群フレームの通常のコーディングでは、角度モードがコーディング効率に相当な利得をもたらす。しかしながら、ツリー内量子化が有効化されると、角度モードの利得はかなり小さくなり、場合によっては損失も生み出す。角度モード(IDCM角度および平面角度)の場合、コンテキスト導出のために量子化ビットが使用され、量子化ビットは異なるスケール空間の中にあり、元の点と同じドメインの中にはない。このことは、角度モードとツリー内量子化の両方の有用性を低減し、したがって、同時に両方を有効化するのに有益でない場合がある。
本開示は、角度モードおよびツリー内量子化が一緒に使用されるとき、ライダー原点に関してノード/点の位置を導出するために、スケーリングされた値xSを点/位置座標値xから導出するための技法を説明する。より詳細には、座標値を表す量子化された値をクリッピングを用いずにスケーリングすることによって、G-PCCデコーダは、角度モードからのコーディング利得を達成するのに十分な確度を有する元の点値と同じスケール空間の中に、スケーリングされた値を入れる方法で、原点位置に対する座標位置を表すスケーリングされた値を決定し得る。
本開示は、G-PCCエンコーダおよび/またはG-PCCデコーダを総称的に指すためにG-PCCコーダという用語を使用する。その上、復号に関して本開示で説明するいくつかの技法はまた、符号化に適用されてもよく、逆も同様である。たとえば、しばしば、G-PCCエンコーダおよびG-PCCデコーダは、同じプロセスまたは相反のプロセスを実行するように構成される。また、G-PCCエンコーダは、通常、どのように符号化すべきかを決定するプロセスの一部として復号を実行する。
図1は、本開示の技法を実行し得る例示的な符号化および復号システム100を示すブロック図である。本開示の技法は、概して、点群データをコーディング(符号化および/または復号)すること、すなわち、点群圧縮をサポートすることを対象とする。一般に、点群データは、点群を処理するための任意のデータを含む。コーディングは、点群データを圧縮および/または圧縮解除する際に効果的であり得る。
図1に示すように、システム100は、ソースデバイス102および宛先デバイス116を含む。ソースデバイス102は、宛先デバイス116によって復号されるべき符号化点群データを提供する。詳細には、図1の例では、ソースデバイス102は、コンピュータ可読媒体110を介して宛先デバイス116に点群データを提供する。ソースデバイス102および宛先デバイス116は、デスクトップコンピュータ、ノートブック(すなわち、ラップトップ)コンピュータ、タブレットコンピュータ、セットトップボックス、スマートフォンなどの電話ハンドセット、テレビジョン、カメラ、ディスプレイデバイス、デジタルメディアプレーヤ、ビデオゲーミングコンソール、ビデオストリーミングデバイス、地上車両または海上車両、宇宙船、航空機、ロボット、LIDARデバイス、衛星などを含む、幅広いデバイスのうちのいずれかを備えてよい。場合によっては、ソースデバイス102および宛先デバイス116は、ワイヤレス通信のために装備され得る。
図1の例では、ソースデバイス102は、データソース104、メモリ106、G-PCCエンコーダ200、および出力インターフェース108を含む。宛先デバイス116は、入力インターフェース122、G-PCCデコーダ300、メモリ120、およびデータコンシューマ118を含む。本開示によれば、ソースデバイス102のG-PCCエンコーダ200および宛先デバイス116のG-PCCデコーダ300は、G-PCCにおける角度モードおよびツリー内量子化に関係する本開示の技法を適用するように構成され得る。
したがって、ソースデバイス102は符号化デバイスの一例を表し、宛先デバイス116は復号デバイスの一例を表す。他の例では、ソースデバイス102および宛先デバイス116は、他の構成要素または構成を含んでよい。たとえば、ソースデバイス102は、内部ソースまたは外部ソースからデータ(たとえば、点群データ)を受信し得る。同様に、宛先デバイス116は、同じデバイスの中にデータコンシューマを含むのではなく、外部のデータコンシューマとインターフェースしてもよい。
図1に示すようなシステム100は一例にすぎない。一般に、他のデジタル符号化および/または復号デバイスが、G-PCCにおける角度モードおよびツリー内量子化に関係する本開示の技法を実行することがある。ソースデバイス102および宛先デバイス116は、ソースデバイス102が宛先デバイス116への送信のためにコード化データを生成するようなデバイスの例にすぎない。本開示は、データのコーディング(符号化および/または復号)を実行するデバイスを「コーディング」デバイスと呼ぶ。したがって、G-PCCエンコーダ200およびG-PCCデコーダ300は、コーディングデバイス、具体的には、それぞれ、エンコーダおよびデコーダの例を表す。いくつかの例では、ソースデバイス102および宛先デバイス116は、ソースデバイス102および宛先デバイス116の各々が符号化構成要素および復号構成要素を含むように実質的に対称的に動作し得る。したがって、システム100は、たとえば、ストリーミング、再生、ブロードキャスト、電話、ナビゲーション、および他の適用例のために、ソースデバイス102と宛先デバイス116との間の一方向送信または双方向送信をサポートし得る。
一般に、データソース104は、データ(すなわち、未加工の符号化されていない点群データ)のソースを表し、データの逐次的な一連の「フレーム」をG-PCCエンコーダ200に提供してよく、G-PCCエンコーダ200はフレームのためのデータを符号化する。ソースデバイス102のデータソース104は、様々なカメラもしくはセンサー、たとえば、3Dスキャナもしくは光検出および測距(LIDAR)デバイス、1つもしくは複数のビデオカメラ、以前キャプチャされたデータを含むアーカイブ、ならびに/またはデータコンテンツプロバイダからデータを受信するためのデータフィードインターフェースのうちのいずれかなどの、点群キャプチャデバイスを含んでよい。代替または追加として、点群データは、スキャナ、カメラ、センサー、または他のデータからコンピュータ生成されてよい。たとえば、データソース104は、コンピュータグラフィックスベースのデータをソースデータとして生成してよく、またはライブデータ、アーカイブされたデータ、およびコンピュータ生成されたデータの組合せを作り出してもよい。各場合において、G-PCCエンコーダ200は、キャプチャされたデータ、事前にキャプチャされたデータ、またはコンピュータ生成されたデータを符号化する。G-PCCエンコーダ200は、受信された順序(「表示順序」と呼ばれることがある)からコーディング用のコーディング順序にフレームを並べ替え得る。G-PCCエンコーダ200は、符号化データを含む1つまたは複数のビットストリームを生成し得る。ソースデバイス102は、次いで、たとえば、宛先デバイス116の入力インターフェース122による受信および/または取出しのために、出力インターフェース108を介して符号化データをコンピュータ可読媒体110上に出力し得る。
ソースデバイス102のメモリ106および宛先デバイス116のメモリ120は、汎用メモリを表してよい。いくつかの例では、メモリ106およびメモリ120は、未加工データ、たとえば、データソース104からの未加工データ、およびG-PCCデコーダ300からの未加工の復号データを記憶し得る。追加または代替として、メモリ106およびメモリ120は、たとえば、それぞれ、G-PCCエンコーダ200およびG-PCCデコーダ300によって実行可能なソフトウェア命令を記憶し得る。メモリ106およびメモリ120は、この例ではG-PCCエンコーダ200およびG-PCCデコーダ300とは別々に示されるが、G-PCCエンコーダ200およびG-PCCデコーダ300がまた、機能的に類似のまたは均等な目的のために内部メモリを含み得ることを理解されたい。さらに、メモリ106およびメモリ120は、たとえば、G-PCCエンコーダ200から出力されG-PCCデコーダ300に入力される、符号化データを記憶し得る。いくつかの例では、メモリ106およびメモリ120の部分は、たとえば、未加工の復号データおよび/または符号化データを記憶するための、1つまたは複数のバッファとして割り振られてよい。たとえば、メモリ106およびメモリ120は、点群を表すデータを記憶し得る。
コンピュータ可読媒体110は、符号化データをソースデバイス102から宛先デバイス116にトランスポートすることが可能な、任意のタイプの媒体またはデバイスを表してよい。一例では、コンピュータ可読媒体110は、たとえば、無線周波数ネットワークまたはコンピュータベースのネットワークを介して、ソースデバイス102が符号化データを宛先デバイス116へリアルタイムで直接送信することを可能にする、通信媒体を表す。ワイヤレス通信プロトコルなどの通信規格に従って、出力インターフェース108は、符号化データを含む送信信号を変調してよく、入力インターフェース122は、受信された送信信号を復調してよい。通信媒体は、無線周波数(RF)スペクトル、または1つもしくは複数の物理伝送線路などの、任意のワイヤレス通信媒体または有線通信媒体を備えてよい。通信媒体は、ローカルエリアネットワーク、ワイドエリアネットワーク、またはインターネットなどのグローバルネットワークなどの、パケットベースのネットワークの一部を形成し得る。通信媒体は、ルータ、スイッチ、基地局、またはソースデバイス102から宛先デバイス116への通信を容易にするために有用であり得る任意の他の機器を含んでよい。
いくつかの例では、ソースデバイス102は、符号化データを出力インターフェース108から記憶デバイス112に出力し得る。同様に、宛先デバイス116は、入力インターフェース122を介して記憶デバイス112からの符号化データにアクセスし得る。記憶デバイス112は、ハードドライブ、ブルーレイディスク、DVD、CD-ROM、フラッシュメモリ、揮発性メモリもしくは不揮発性メモリ、または符号化データを記憶するための任意の他の好適なデジタル記憶媒体などの、分散されるかまたはローカルにアクセスされる様々なデータ記憶媒体のうちのいずれかを含んでよい。
いくつかの例では、ソースデバイス102は、ソースデバイス102によって生成された符号化データを記憶し得るファイルサーバ114または別の中間記憶デバイスに、符号化データを出力してよい。宛先デバイス116は、ストリーミングまたはダウンロードを介して、ファイルサーバ114からの記憶されたデータにアクセスし得る。ファイルサーバ114は、符号化データを記憶するとともにその符号化データを宛先デバイス116へ送信することが可能な、任意のタイプのサーバデバイスであってよい。ファイルサーバ114は、(たとえば、ウェブサイト用の)ウェブサーバ、ファイル転送プロトコル(FTP)サーバ、コンテンツ配信ネットワークデバイス、またはネットワーク接続ストレージ(NAS)デバイスを表してよい。宛先デバイス116は、インターネット接続を含む任意の標準データ接続を通じてファイルサーバ114からの符号化データにアクセスし得る。これは、ワイヤレスチャネル(たとえば、Wi-Fi接続)、有線接続(たとえば、デジタル加入者回線(DSL)、ケーブルモデムなど)、またはファイルサーバ114上に記憶された符号化データにアクセスするのに適した両方の組合せを含んでよい。ファイルサーバ114および入力インターフェース122は、ストリーミング送信プロトコル、ダウンロード送信プロトコル、またはそれらの組合せに従って動作するように構成され得る。
出力インターフェース108および入力インターフェース122は、ワイヤレス送信機/受信機、モデム、有線ネットワーキング構成要素(たとえば、Ethernetカード)、様々なIEEE 802.11規格のうちのいずれかに従って動作するワイヤレス通信構成要素、または他の物理構成要素を表してよい。出力インターフェース108および入力インターフェース122がワイヤレス構成要素を備える例では、出力インターフェース108および入力インターフェース122は、4G、4G-LTE(ロングタームエボリューション)、LTEアドバンスト、5Gなどのセルラー通信規格に従って符号化データなどのデータを転送するように構成され得る。出力インターフェース108がワイヤレス送信機を備えるいくつかの例では、出力インターフェース108および入力インターフェース122は、IEEE 802.11仕様、IEEE 802.15仕様(たとえば、ZigBee(商標))、Bluetooth(商標)規格などの他のワイヤレス規格に従って符号化データなどのデータを転送するように構成され得る。いくつかの例では、ソースデバイス102および/または宛先デバイス116は、それぞれのシステムオンチップ(SoC)デバイスを含んでよい。たとえば、ソースデバイス102は、G-PCCエンコーダ200および/または出力インターフェース108にあるとされる機能性を実行するためのSoCデバイスを含んでよく、宛先デバイス116は、G-PCCデコーダ300および/または入力インターフェース122にあるとされる機能性を実行するためのSoCデバイスを含んでよい。
本開示の技法は、自律車両の間の通信、スキャナ、カメラ、センサーと、ローカルサーバもしくはリモートサーバなどの処理デバイスとの間の通信、地理的マッピング、または他の適用例などの、様々な適用例のうちのいずれかをサポートする符号化および復号に適用され得る。
宛先デバイス116の入力インターフェース122は、コンピュータ可読媒体110(たとえば、通信媒体、記憶デバイス112、ファイルサーバ114など)から符号化ビットストリームを受信する。符号化ビットストリームは、コード化ユニット(たとえば、スライス、ピクチャ、ピクチャのグループ、シーケンスなど)の特性および/または処理を記述する値を有するシンタックス要素などの、G-PCCデコーダ300によって同じく使用される、G-PCCエンコーダ200によって定義されるシグナリング情報を含んでよい。データコンシューマ118は、復号データを使用する。たとえば、データコンシューマ118は、物理的な物体のロケーションを決定するために復号データを使用し得る。いくつかの例では、データコンシューマ118は、点群に基づいて像を提示するためのディスプレイを備えてよい。
G-PCCエンコーダ200およびG-PCCデコーダ300は各々、1つまたは複数のマイクロプロセッサ、デジタル信号プロセッサ(DSP)、特定用途向け集積回路(ASIC)、フィールドプログラマブルゲートアレイ(FPGA)、個別論理、ソフトウェア、ハードウェア、ファームウェア、またはそれらの任意の組合せなどの、様々な好適なエンコーダ回路構成および/またはデコーダ回路構成のうちのいずれかとして実装されてよい。技法が部分的にソフトウェアで実装されるとき、デバイスは、好適な非一時的コンピュータ可読媒体の中にソフトウェア用の命令を記憶してよく、本開示の技法を実行するために1つまたは複数のプロセッサを使用してハードウェアにおいて命令を実行してよい。G-PCCエンコーダ200およびG-PCCデコーダ300の各々は、1つまたは複数のエンコーダまたはデコーダの中に含まれてよく、それらのいずれも、それぞれのデバイスの中で複合エンコーダ/デコーダ(コーデック)の一部として統合されてよい。G-PCCエンコーダ200および/またはG-PCCデコーダ300を含むデバイスは、1つまたは複数の集積回路、マイクロプロセッサ、および/または他のタイプのデバイスを備えてよい。
G-PCCエンコーダ200およびG-PCCデコーダ300は、コーディング規格、すなわち、ジオメトリ点群圧縮(G-PCC)規格に従って動作し得る。エンコーダ200およびデコーダ300はG-PCCエンコーダ200およびG-PCCデコーダ300として説明されるが、エンコーダ200およびデコーダ300は、G-PCC規格に従って動作することへの限定と見なされるべきでない。いくつかの例では、エンコーダ200およびデコーダ300は、ビデオ点群圧縮(V-PCC)規格に従って動作してよい。本開示は、概して、データを符号化または復号するプロセスを含めるように、ピクチャのコーディング(たとえば、符号化および復号)に言及することがある。符号化ビットストリームは、一般に、コーディング決定(たとえば、コーディングモード)を表すシンタックス要素のための一連の値を含む。
本開示は、概して、シンタックス要素などのいくつかの情報を「シグナリングすること」に言及することがある。「シグナリング」という用語は、一般に、符号化データを復号するために使用されるシンタックス要素および/または他のデータのための値の通信を指すことがある。すなわち、G-PCCエンコーダ200は、ビットストリームの中でシンタックス要素のための値をシグナリングし得る。一般に、シグナリングとは、ビットストリームの中で値を生成することを指す。上述のように、ソースデバイス102は、実質的にリアルタイムで、または宛先デバイス116によって後で取り出すためにシンタックス要素を記憶デバイス112に記憶するときに行われることがあるようなリアルタイムではなく、ビットストリームを宛先デバイス116にトランスポートし得る。
上記で説明したように、ISO/IEC MPEG (JTC1/SC29/WG11)は、現行の手法の圧縮能力を大幅に上回る圧縮能力を有する点群コーディング技術の規格化に対する潜在的な必要性を検討中であり、規格を作成することを目指している。そのグループは、この分野におけるそれらの専門家によって提案された圧縮技術設計を評価するために、3次元グラフィックスチーム(3DG)と呼ばれる共同的な取組みの中で、この探求活動において一緒に作業中である。
点群圧縮活動は、2つの異なる手法にカテゴリー化される。第1の手法は「ビデオ点群圧縮」(V-PCC)であり、ビデオ点群圧縮は、3Dオブジェクトをセグメント化し、(2Dフレームの中の「パッチ」として表される)複数の2D平面の中でセグメントを投影し、セグメントは、高効率ビデオコーディング(HEVC)(ITU-T H.265)コーデックなどのレガシー2Dビデオコーデックによってさらにコーディングされる。第2の手法は「ジオメトリベース点群圧縮」(G-PCC)であり、ジオメトリベース点群圧縮は、3Dジオメトリ、すなわち、3D空間の中の点のセットの位置、および(3Dジオメトリに関連する点ごとの)関連する属性値を直接圧縮する。G-PCCは、カテゴリー1(静的な点群)およびカテゴリー3(動的に取得される点群)の両方における点群の圧縮に対処する。G-PCC規格の最近のドラフトが、G-PCC DIS、ISO/IEC JTC1/SC29/WG11 w19088、ブリュッセル、ベルギー、2020年1月において入手可能であり、コーデックの説明が、G-PCC Codec Description v6、ISO/IEC JTC1/SC29/WG11 w19091、ブリュッセル、ベルギー、2020年1月において入手可能である。
点群は、3D空間の中の点のセットを含み、点に関連する属性を有してよい。属性は、R、G、B、もしくはY、Cb、Crなどの色情報、または反射率情報、あるいは他の属性であってよい。点群は、LIDARセンサーおよび3Dスキャナなどの様々なカメラまたはセンサーによってキャプチャされてよく、同じくコンピュータ生成されてもよい。点群データは、限定はしないが、建築(モデリング)、グラフィックス(視覚化およびアニメーションのための3Dモデル)、および自動車産業(ナビゲーションの助けとなるために使用されるLIDARセンサー)を含む、様々な適用例において使用される。
点群データによって占有される3D空間は、仮想的な境界ボックスによって覆われてよい。境界ボックスの中の点の位置は、いくつかの精度によって表されてよく、したがって、1つまたは複数の点の位置は、精度に基づいて量子化され得る。最小レベルにおいて、境界ボックスはボクセルに分割され、ボクセルは、単位立方体によって表される、空間の最小単位である。境界ボックスの中のボクセルは、0個、1個、または2個以上の点に関連付けられてよい。境界ボックスは、タイルと呼ばれることがある複数の立方体/立方形領域に分割されてよい。各タイルは、1つまたは複数のスライスにコーディングされてよい。スライスおよびタイルへの境界ボックスの区分は、各区分の中の点の数に基づいてよく、または他の考慮事項(たとえば、特定の領域がタイルとしてコーディングされてよい)に基づいてもよい。スライス領域は、ビデオコーデックにおける分割決定と類似の分割決定を使用してさらに区分されてよい。
図2は、G-PCCエンコーダ200の概要を提供する。図3は、G-PCCデコーダ300の概要を提供する。図示のモジュールは論理的であり、G-PCCコーデックの参照実装形態、すなわち、ISO/IEC MPEG (JTC1/SC29/WG11)によって検討されたTMC13テストモデルソフトウェアにおける実装済みのコードに必ずしも1対1で対応するとは限らない。
G-PCCエンコーダ200とG-PCCデコーダ300の両方の中で、点群位置が最初にコーディングされる。属性コーディングは、復号されるジオメトリに依存する。図2および図3では、表面近似分析ユニット212、表面近似合成ユニット310、ならびにRAHTユニット218および314は、カテゴリー1データのために一般に使用されるオプションを表し、LOD生成ユニット220および316、リフティングユニット222、ならびに逆リフティングユニット318は、カテゴリー3データのために一般に使用されるオプションを表す。すべての他のユニットが、カテゴリー1とカテゴリー3との間で共通であってよい。
カテゴリー3データの場合、圧縮されたジオメトリは、通常、個々のボクセルのルートから全面的に下方へリーフレベルまでの8分木として表される。カテゴリー1データの場合、圧縮されたジオメトリは、通常、刈り込み8分木(すなわち、ボクセルよりも大きいブロックの、ルートから下方にリーフレベルまでの8分木)に、刈り込み8分木の各リーフ内の表面を近似するモデルを加えたものによって表される。このようにして、カテゴリー1データとカテゴリー3データの両方が、8分木コーディングメカニズムを共有し、カテゴリー1データは、追加として、表面モデルを用いて各リーフ内のボクセルを近似してよい。使用される表面モデルは、ブロックごとに1~10個の三角形を備える三角測量であり、三角形スープが得られる。したがって、カテゴリー1ジオメトリコーデックは、Trisoupジオメトリコーデックと呼ばれ、カテゴリー3ジオメトリコーデックは、8分木ジオメトリコーデックと呼ばれる。
8分木の各ノードにおいて、その子ノード(最大8個のノード)のうちの1つまたは複数に対して占有がシグナリングされる(推測されないとき)。(a)現在の8分木ノードと面を共有するノード、(b)現在の8分木ノードと面、縁部、または頂点を共有するノードなどを含む、複数の近傍が指定される。各近傍内で、ノードおよび/またはその子たちの占有が、現在のノードまたはその子たちの占有を予測するために使用され得る。8分木のいくつかのノードの中の過疎な点に対して、コーデックはまた、点の3D位置が直接符号化されるダイレクトコーディングモードをサポートする。ダイレクトモードがシグナリングされることを示すために、フラグがシグナリングされてよい。最低レベルにおいて、8分木ノード/リーフノードに関連する点の数もコーディングされてよい。
ジオメトリがコーディングされると、ジオメトリ点に対応する属性がコーディングされる。再構成/復号される1つのジオメトリ点に対応する複数の属性点があるとき、再構成される点を表す属性値が導出され得る。
G-PCCには、3つの属性コーディング方法、すなわち、領域適応階層変換(RAHT:Region Adaptive Hierarchical Transform)コーディング、補間ベース階層最近傍予測(予測変換)、および更新/リフティングステップ(リフティング変換)を用いた補間ベース階層最近傍予測がある。RAHTおよびリフティングは、通常、カテゴリー1データのために使用され、予測は、通常、カテゴリー3データのために使用される。しかしながら、いずれの方法も任意のデータのために使用されてよく、単にG-PCCにおけるジオメトリコーデックを用いるように、点群をコーディングするために使用される属性コーディング方法が、ビットストリームの中で指定される。
属性のコーディングは、ある詳細レベル(LOD:level-of-detail)で行われてよく、各詳細レベルを用いて、点群属性のもっと細かい表現が取得され得る。各詳細レベルは、近傍ノードからの距離メトリックに基づいて、またはサンプリング距離に基づいて指定されてよい。
G-PCCエンコーダ200において、属性のためのコーディング方法の出力として取得された残差が量子化される。量子化された残差は、コンテキスト適応型算術コーディングを使用してコーディングされ得る。
図2の例では、G-PCCエンコーダ200は、座標変換ユニット202、色変換ユニット204、ボクセル化ユニット206、属性転送ユニット208、8分木分析ユニット210、表面近似分析ユニット212、算術符号化ユニット214、ジオメトリ再構成ユニット216、RAHTユニット218、LOD生成ユニット220、リフティングユニット222、係数量子化ユニット224、および算術符号化ユニット226を含んでよい。
図2の例に示すように、G-PCCエンコーダ200は、位置のセットおよび属性のセットを受信し得る。位置は、点群の中の点の座標を含んでよい。属性は、点群の中の点に関連する色などの、点群の中の点についての情報を含んでよい。
座標変換ユニット202は、座標を初期ドメインから変換ドメインに変換するように、点の座標に変換を適用してよい。本開示は、変換された座標を変換座標と呼ぶことがある。色変換ユニット204は、属性の色情報を異なるドメインに変換するための変換を適用してよい。たとえば、色変換ユニット204は、色情報をRGB色空間からYCbCr色空間に変換してよい。
さらに、図2の例では、ボクセル化ユニット206は、変換座標をボクセル化してよい。変換座標のボクセル化は、量子化、および点群のいくつかの点を除去することを含んでよい。言い換えれば、点群の複数の点が単一の「ボクセル」内に包含されてよく、ボクセルは、その後、いくつかの観点において1つの点として扱われてよい。さらに、8分木分析ユニット210が、ボクセル化された変換座標に基づいて8分木を生成し得る。追加として、図2の例では、表面近似分析ユニット212が点を分析して、点のセットの表面表現を潜在的に決定し得る。算術符号化ユニット214は、8分木、および/または表面近似分析ユニット212によって決定された表面の情報を表す、シンタックス要素をエントロピー符号化し得る。G-PCCエンコーダ200は、これらのシンタックス要素をジオメトリビットストリームの中で出力し得る。
ジオメトリ再構成ユニット216は、8分木、表面近似分析ユニット212によって決定された表面を示すデータ、および/または他の情報に基づいて、点群の中の点の変換座標を再構成し得る。ジオメトリ再構成ユニット216によって再構成される変換座標の数は、ボクセル化および表面近似のために、点群の点の元の数とは異なる場合がある。本開示は、得られた点を再構成点と呼ぶことがある。属性転送ユニット208は、点群の元の点の属性を、点群の再構成点に転送し得る。
さらに、RAHTユニット218は、再構成点の属性にRAHTコーディングを適用してよい。代替または追加として、LOD生成ユニット220およびリフティングユニット222が、それぞれ、LOD処理およびリフティングを再構成点の属性に適用してよい。RAHTユニット218およびリフティングユニット222は、属性に基づいて係数を生成し得る。係数量子化ユニット224は、RAHTユニット218またはリフティングユニット222によって生成された係数を量子化し得る。算術符号化ユニット226は、量子化された係数を表すシンタックス要素に算術コーディングを適用し得る。G-PCCエンコーダ200は、これらのシンタックス要素を属性ビットストリームの中で出力してよい。
図3の例では、G-PCCデコーダ300は、ジオメトリ算術復号ユニット302、属性算術復号ユニット304、8分木合成ユニット306、逆量子化ユニット308、表面近似合成ユニット310、ジオメトリ再構成ユニット312、RAHTユニット314、LOD生成ユニット316、逆リフティングユニット318、逆座標変換ユニット320、および逆色変換ユニット322を含んでよい。
G-PCCデコーダ300は、ジオメトリビットストリームおよび属性ビットストリームを取得し得る。G-PCCデコーダ300のジオメトリ算術復号ユニット302は、ジオメトリビットストリームの中のシンタックス要素に算術復号(たとえば、コンテキスト適応型バイナリ算術コーディング(CABAC)または他のタイプの算術復号)を適用し得る。同様に、属性算術復号ユニット304は、属性ビットストリームの中のシンタックス要素に算術復号を適用し得る。
8分木合成ユニット306は、ジオメトリビットストリームから構文解析されたシンタックス要素に基づいて8分木を合成し得る。ジオメトリビットストリームの中で表面近似が使用される事例では、表面近似合成ユニット310は、ジオメトリビットストリームから構文解析されたシンタックス要素に基づいて、かつ8分木に基づいて、表面モデルを決定し得る。
さらに、ジオメトリ再構成ユニット312は、再構成を実行して点群の中の点の座標を決定し得る。逆座標変換ユニット320は、点群の中の点の再構成座標(位置)を変換ドメインから初期ドメインに戻して変換するために、再構成座標に逆変換を適用し得る。
追加として、図3の例では、逆量子化ユニット308は属性値を逆量子化し得る。属性値は、属性ビットストリームから取得されたシンタックス要素(たとえば、属性算術復号ユニット304によって復号されたシンタックス要素を含む)に基づいてよい。
属性値がどのように符号化されるのかに応じて、RAHTユニット314は、逆量子化された属性値に基づいて、点群の点にとっての色値を決定するために、RAHTコーディングを実行し得る。代替として、LOD生成ユニット316および逆リフティングユニット318が、詳細レベルベースの技法を使用して、点群の点にとっての色値を決定してよい。
さらに、図3の例では、逆色変換ユニット322は、色値に逆色変換を適用し得る。逆色変換は、G-PCCエンコーダ200の色変換ユニット204によって適用される色変換の逆であってよい。たとえば、色変換ユニット204は、色情報をRGB色空間からYCbCr色空間に変換してよい。それに応じて、逆色変換ユニット322は、色情報をYCbCr色空間からRGB色空間に変換してよい。
G-PCCエンコーダ200およびG-PCCデコーダ300によって実行される動作を理解するのを支援するために、図2および図3の様々なユニットが図示される。ユニットは、固定機能回路、プログラマブル回路、またはそれらの組合せとして実装され得る。固定機能回路は、特定の機能性を提供する回路を指し、実行され得る動作に対して事前設定される。プログラマブル回路は、様々なタスクを実行するようにプログラムされ得る回路を指し、実行され得る動作においてフレキシブルな機能性を提供する。たとえば、プログラマブル回路は、ソフトウェアまたはファームウェアの命令によって規定される方式でプログラマブル回路を動作させるソフトウェアまたはファームウェアを実行し得る。固定機能回路は、(たとえば、パラメータを受信するかまたはパラメータを出力するための)ソフトウェア命令を実行し得るが、固定機能回路が実行する動作のタイプは概して不変である。いくつかの例では、ユニットのうちの1つまたは複数は、異なる回路ブロック(固定機能またはプログラマブル)であってよく、いくつかの例では、ユニットのうちの1つまたは複数は集積回路であってよい。
G-PCCエンコーダ200およびG-PCCデコーダ300は、平面コーディングモード、角度コーディングモード、および方位コーディングモードを使用して点群データをコーディングするように構成され得る。平面コーディングモードは、ジュネーブ、スイスでの第128回MPEG会合において採択された。平面コーディングモードは、各ノード位置において3つの次元x、y、およびzの各々に適用され得る。あるノード点において特定の次元(たとえば、z)に対して平面コーディングモードが指定されるとき、平面コーディングモードは、図4に関して以下で説明するように、そのノードのすべての子たちがz半平面のうちの1つしか占有しないことを示す。x次元およびy次元において類似の例示(たとえば、技法)が平面モードに適用される。
角度コーディングモードは、ブリュッセル、ベルギーでの第129回MPEG会合において採択された。以下の説明は、元のMPEG寄与文書、Sebastien Lasserre、Jonathan Taquet、「[GPCC][CE 13.22 related] An improvement of the planar coding mode」、ISO/IEC JTC1/SC29/WG11 MPEG/m50642、ジュネーブ、スイス、2019年10月、およびw19088に基づく。角度コーディングモードは、(たとえば、Sebastien Lasserre、David Flynn、「[GPCC] Planar mode in octree-based geometry coding」、ISO/IEC JTC1/SC29/WG11 MPEG/m48906、イェーテボリ、スウェーデン、2019年7月に記載されるように)平面モードと一緒に随意に使用され、典型的なLIDARセンサーの中の感知しているレーザービームの位置および仰角の知識を採用することによって、垂直(z)平面位置シンタックス要素のコーディングを改善する(たとえば、Sebastien Lasserre、Jonathan Taquet、「[GPCC] CE 13.22 report on angular mode」、ISO/IEC JTC1/SC29/WG11 MPEG/m51594、ブリュッセル、ベルギー、2020年1月を参照)。
方位コーディングモードは、第130回MPEG遠隔会議会合において採択された。方位コーディングモードは角度モードと類似であり、平面モードの(x)および(y)平面位置シンタックス要素のコーディングに角度モードを拡張し、IDCMにおけるx位置ビットまたはy位置ビットのコーディングを改善する。方位モードは、各レーザーの方位のサンプリング情報(たとえば、1回転の中でレーザーが取得し得る点の数)を使用する。本開示では、「角度モード」という用語はまた、以下で説明するように方位モードを指すことがある。
図4は、垂直方向における例示的な平面占有を示す概念図である。図4の例では、ノード400が8個の子ノードに区分される。子ノード402A~402Hは、占有されても占有されなくてもよい。図4の例では、占有される子ノードは影付きである。1つまたは複数の子ノード402A~402Dが占有され、かつ子ノード402E~402Hのいずれも占有されないとき、G-PCCエンコーダ200は、占有されるすべての子ノードがノード400の最小z座標の平面の正の側部(すなわち、増大するz座標の側部)の上で隣接することを示すために、0という値を有する平面位置シンタックス要素をシグナリングしてよい。1つまたは複数の子ノード402E~402Hが占有され、かつ子ノード402A~402Dのいずれも占有されないとき、G-PCCエンコーダ200は、占有されるすべての子ノードがノード400の中間点z座標の平面の正の側部の上で隣接することを示すために、1という値を有する平面位置シンタックス要素をシグナリングしてよい。このようにして、平面位置シンタックス要素は、ノード400の中の平面モードの垂直面位置を示してよい。
角度コーディングモードはまた、IDCMにおける垂直のz位置ビットのコーディングを改善するために随意に使用され得る(Sebastien Lasserre、Jonathan Taquet、「[GPCC] CE 13.22 report on angular mode」、ISO/IEC JTC1/SC29/WG11 MPEG/m51594、ブリュッセル、ベルギー、2020年1月)。IDCMは、ノード内の複数の点の位置がノード内の1つの点に対して明示的に(たとえば、直接)シグナリングされるモードである。角度コーディングモードでは、点の位置がノードの原点に対してシグナリングされてよく、たとえば、レーザー特性を使用してキャプチャされた点の関係が、位置を効果的に圧縮するために使用される。
角度コーディングモードはまた、LIDARシステムなどの距離測定システムによって生成されるデータに基づいて点群が生成されるときに使用されてよい。LIDARシステムは、原点に対して異なる角度で垂直面の中でアレイ化されたレーザーのセットを含んでよい。LIDARシステムは、垂直軸の周りを回転してよい。LIDARシステムは、戻されるレーザー光を使用して点群の中の点の距離および位置を決定し得る。LIDARシステムのレーザーによって放射されるレーザービームは、パラメータのセットによって特徴づけられてよい。
以下の説明では、レーザー、レーザービーム、レーザーセンサー、もしくはセンサー、または他の類似の用語は、時間の表示を潜在的に含む距離尺度および空間的方位を戻すことができる任意のセンサー、たとえば、典型的なLIDARセンサーを表してよい。
G-PCCエンコーダ200またはG-PCCデコーダ300は、ジオメトリパラメータセットなどのパラメータセットの中でシグナリングされるレーザー候補のセットの中からレーザーインデックスを選択することによって、ノードの中の平面モードの垂直面位置をコーディング(たとえば、それぞれ、符号化または復号)してよく、選択されるレーザーインデックスは、ノードと交差するかまたはノードの中心の最も近くにあるレーザービームを示す。ノードとのレーザービームの交差点または近接は、平面モードの垂直面位置を算術的にコーディングために使用されるコンテキストインデックス(たとえば、下記のcontextAngle、contextAnglePhiX、またはcontextAnglePhiY)を決定する。
したがって、いくつかの例では、G-PCCコーダ(たとえば、G-PCCエンコーダ200またはG-PCCデコーダ300)は、点群の中の点の3次元位置を表す8分木のノードの中で平面モードの垂直面位置をコーディングし得る。説明を簡単にするために、本開示は、G-PCCコーダがコーディングしているノードを現在のノードと呼ぶことがある。平面モードの垂直面位置をコーディングすることの一部として、G-PCCコーダは、レーザー候補のセットの中のレーザー候補のレーザーインデックスを決定し得る。決定されるレーザーインデックスは、現在のノードの最も近くにあるかまたはそれと交差するレーザービームを示す。レーザー候補のセットは、LIDARアレイの中のレーザーの各々を含んでよい。いくつかの例では、レーザー候補のセットは、ジオメトリパラメータセットなどのパラメータセットの中で示されてよい。追加として、垂直面位置をコーディングすることの一部として、G-PCCコーダは、現在のノードとのレーザービームの交差点または近接に基づいてコンテキストインデックスを決定する。たとえば、G-PCCコーダは、レーザービームが第1の距離しきい値の上方にあるのか、第1の距離しきい値と第2の距離しきい値との間にあるのか、第2の距離しきい値と第3の距離しきい値との間にあるのか、それとも第3の距離しきい値の下方にあるのかに基づいて、コンテキストインデックスを決定し得る。さらに、垂直面位置をコーディングすることの一部として、G-PCCコーダは、決定されたコンテキストインデックスによって示されるコンテキストを使用して平面モードの垂直面位置を算術的にコーディングする。
現在のノードの中の平面モードの垂直面位置が、角度モードを使用してコーディングされるのに適格であるかどうかを決定するための、適格性条件があり得る。垂直面位置が、角度モードを使用してコーディングされるのに適格でない場合、平面モードの垂直面位置は、センサー情報を採用することなくコーディングされてよい。いくつかの例では、適格性条件は、ただ1つのレーザービームが現在のノードと交差するかどうかを決定し得る。言い換えれば、ただ1つのレーザービーム(すなわち、2つ以上でないレーザービーム)が現在のノードと交差する場合、現在のノードの垂直面位置は角度モードを使用してコーディングされるのに適格であり得る。いくつかの例では、適格性条件は、レーザー候補のセットのうちのレーザー間の最小角度差を決定し得る。言い換えれば、現在のノードを囲む角度がレーザービーム間の最小角度よりも小さい場合、現在のノードは、角度モードを使用してコーディングされるのに適格であり得る。現在のノードを囲む角度とは、ノードの遠くの下部隅角を通過するラインとノードの近くの上部隅角を通過するラインとの間でレーザー原点から測定される角度である。現在のノードを囲む角度がレーザービーム間の最小角度差よりも小さいとき、多くとも1つのレーザービームがノードと交差する。いくつかの例では、適格性条件は、垂直ノード寸法が最小角度差よりも小さい(または、それに等しい)ようなものである。言い換えれば、ノードの垂直寸法が、現在のノードの、レーザー原点に最も近い垂直エッジにおいて最小角度差によって分離される、レーザービーム間の垂直距離以下である場合、現在のノードは、角度モードを使用してコーディングされるのに適格であり得る。
上述のように、G-PCCコーダは、現在のノードと交差するかまたは現在のノードに最も近いレーザービームのレーザーインデックスを選択してよい。いくつかの例では、G-PCCコーダは、現在のノードの中のマーカー点に最も近いレーザービームを選択することによって、現在のノードと交差するかまたは現在のノードに最も近いレーザーのインデックスを決定し得る。いくつかの例では、現在のノードの中のマーカー点は、現在のノードのすべての3つの次元(たとえば、立方体/立方形次元)の半分における座標を有する、現在のノードの中心点であってよい。他の例では、現在のノードの中のマーカー点は、ノード内、またはノード側部、またはノード縁部、またはノード隅角における任意の点などの、現在のノードの一部である任意の他の点であってよい。
G-PCCコーダは、候補レーザーの角度差を比較することに基づいて、レーザーがマーカー点の近くにあるかどうかを決定し得る。たとえば、G-PCCコーダは、レーザービームの角度とマーカー点の角度との間の差分を比較してよい。レーザービームの角度は、水平面(z=0)とレーザービームの方向との間にあるものとして規定され得る。マーカー点の角度は、水平面とマーカー点への仮想的なビームの方向との間にあるものとして規定され得る。この場合の原点は、センサーまたはレーザーの中心と一緒に置かれてよい。代替として、いくつかの例では、数学関数またはタンジェントなどの三角関数が、比較の前に角度に適用され得る。
いくつかの例では、G-PCCコーダは、レーザーがマーカー点の近くにあるかどうかを、垂直座標差の比較に基づいて決定し得る。たとえば、G-PCCコーダは、センサー原点に関するマーカー点の垂直座標(たとえば、マーカー点のz座標)と、ノートとのレーザー交差点またはノードへの近接の垂直座標とを、比較してよい。G-PCCコーダは、水平面とレーザー方向との間の角度のタンジェントを、マーカー点の(x,y)座標に基づいてユークリッド距離をとることによって算出される距離で乗算することによって(三角法)、ノードとのレーザー交差点の垂直座標を取得し得る。
いくつかの例では、G-PCCコーダは、レーザービームとマーカー点との相対位置に基づいて、垂直面位置シンタックス要素をコーディングするために使用すべきコンテキストインデックスを決定し得る。たとえば、G-PCCコーダは、レーザービームがマーカー点の上方にある場合、コンテキストインデックスが第1のコンテキストインデックスであることを決定してよく、レーザービームがマーカー点の下方にある場合、コンテキストインデックスが第2のコンテキストインデックスであることを決定してよい。G-PCCコーダは、たとえば、角度差を比較すること、角度値のタンジェントの差分を比較すること、または垂直座標差を比較することによって、ノードと交差するかまたはノードに最も近いレーザービームインデックスを決定するのと同様の方式で、レーザービームがマーカー点の上方にあるのかそれとも下方にあるのかを決定し得る。
いくつかの例では、コンテキストインデックスを決定することの一部として、G-PCCコーダは距離しきい値を決定し得る。G-PCCコーダは、レーザービームとマーカー点との間の距離を比較するために距離しきい値を使用してよい。距離しきい値は、現在のノード内の距離範囲を区間に分割し得る。区間は、長さが等しくても等しくなくてもよい。レーザービームが、距離区間によって決定される距離範囲内にある場合、複数の区間の各区間は、コンテキストインデックスに対応し得る。いくつかの例では、3つのコンテキストインデックスに対応する3つの距離区間を規定する、マーカー点の上方および下方の等しい距離オフセットによって決定される2つの距離しきい値がある。G-PCCコーダは、(たとえば、角度差を比較すること、角度値のタンジェントの差分を比較すること、または垂直座標差を比較することによって)ノードと交差するかまたはノードに最も近いレーザーのレーザービームインデックスを決定するのと同様の方式で、レーザービームが区間に属するかどうかを決定し得る。
センサー情報を採用する上記の原理は、ノード内の平面モードの垂直の(Z)平面位置シンタックス要素をコーディングすることに限定されないが、類似の原理がまた、ノード内の平面モードのXまたはY平面位置シンタックス要素をコーディングすることに適用され得る。平面モードのXまたはY平面位置モードは、ノード内の点分布をコーディングするためにより適切な場合、エンコーダによって選ばれてよい。たとえば、占有される子ノードがすべて、X方向に方向づけられた平面の片側にある場合、ノード内の点分布をコーディングするためにX平面位置シンタックス要素が使用されてよい。占有される子ノードがすべて、Y方向に方向づけられた平面の片側にある場合、ノード内の点分布をコーディングするためにY平面位置シンタックス要素が使用されてよい。追加として、X、Y、またはZ方向に方向づけられた2つ以上の平面の組合せが、子ノードの占有を示すために使用されてよい。
G-PCCコーダは、一例として、レーザービームがマーカー点の上方にあるのかそれとも下方にあるのか(すなわち、マーカー点の上方に位置するのかそれとも下方に位置するのか)に基づいて、2つのコンテキストの中からコンテキストを決定してよい。この例では、マーカー点はノードの中心である。このことが図5に示される。より詳細には、図5は、コンテキストインデックスがノード504のマーカー点502の上方または下方のレーザービーム位置500A、500Bに基づいて決定される一例の概念図である。したがって、図5の例では、レーザービーム位置500Aに関して示すように、ノード504と交差するレーザーがマーカー点502の上方にある場合、G-PCCコーダは、第1のコンテキストインデックス(たとえば、Ctx=0)を選択する。図5の例では、マーカー点502はノード504の中心に位置する。レーザービーム位置500Bに関して示すように、ノード504と交差するレーザーがマーカー点502の下方にある場合、G-PCCコーダは、第2のコンテキストインデックス(たとえば、Ctx=1)を選択する。
いくつかの例では、G-PCCコーダは、レーザービームが2つの距離しきい値の上方もしくは下方または距離しきい値の中間に位置することに基づいて、3つのコンテキストを決定する。この例では、マーカー点はノードの中心である。このことが図6に示される。より詳細には、図6は、ノード600のための例示的な3コンテキストインデックス決定を示す概念図である。図6では、距離区間しきい値が、細かい点線602A、602Bを用いて示される。レーザービームは実線604A、604Bを用いて示される。これらのレーザービームの各々がレーザー候補であってよい。中心点606(マーカー点)は白い円を用いて示される。したがって、図6の例では、(ライン604Aに対応するレーザーなどの)レーザーがライン602Aの上方にある場合、G-PCCコーダは、コンテキストインデックスctx1を選択する。レーザーがライン602A、602Bの間にある場合、G-PCCコーダは、コンテキストインデックスctx0を選択してよい。(ライン604Bに対応するレーザーなどの)レーザーがライン602Bの下方にある場合、G-PCCコーダは、コンテキストインデックスctx2を選択してよい。
いくつかの例では、G-PCCコーダは、角度モードが使用される場合には、平面モードの垂直面位置をコーディングするために4つのコンテキストを使用する。そのような例では、G-PCCコーダは、4つの区間内のレーザービームの位置に基づいてコンテキストインデックスを決定し得る。この例が図7に示される。図7は、細かい点線によって分離される区間を用いてレーザービーム位置(実線矢印)に基づいて平面モードの垂直面位置をコーディング(角度モード)するための例示的なコンテキストインデックス決定を示す概念図である。図7の例では、ライン700A、700B、および700Cは、距離区間しきい値に対応する。さらに、図7の例では、マーカー点702はノード704の中心に位置する。ライン706は、ノード704と交差するレーザービームに対応する。ライン706がライン700Aの上方にあるので、G-PCCコーダは、垂直面位置をコーディングする際の使用のためにコンテキストインデックスctx2を選択してよい。
図8Aは、垂直面位置を符号化するための例示的な動作を示すフローチャートである。G-PCCエンコーダ200は、点群を符号化することの一部として図8Aの動作を実行し得る。
図8Aの例では、G-PCCエンコーダ200(たとえば、G-PCCエンコーダ200(図2)の算術符号化ユニット214)は、点群データによって表される点群の中の点の3次元位置を表す木(たとえば、8分木)のノードの中の平面モードの垂直面位置を符号化してよい(800)。言い換えれば、G-PCCエンコーダ200は垂直面位置を符号化してよい。
平面モードの垂直面位置を符号化することの一部として、G-PCCエンコーダ200(たとえば、算術符号化ユニット214)は、レーザー候補のセットの中のレーザー候補のレーザーインデックスを決定してよく、決定されるレーザーインデックスは、ノードと交差するレーザービームを示す(802)。G-PCCエンコーダ200は、本開示の中の他の場所で提供される例のうちのいずれかに従ってレーザーインデックスを決定してよい。
追加として、G-PCCエンコーダ200(たとえば、算術符号化ユニット214)は、レーザービームが第1の距離しきい値の上方にあるのか、第1の距離しきい値と第2の距離しきい値との間にあるのか、第2の距離しきい値と第3の距離しきい値との間にあるのか、それとも第3の距離しきい値の下方にあるのかに基づいて、コンテキストインデックスを決定してよい(804)。たとえば、図7の例では、G-PCCエンコーダ200は、レーザービームが(ライン700Aに対応する)第1の距離しきい値の上方にあるのか、第1の距離しきい値と(ライン700Bに対応する)第2の距離しきい値との間にあるのか、第2の距離しきい値と(ライン700Cに対応する)第3の距離しきい値との間にあるのか、それとも第3の距離しきい値の下方にあるのかに基づいて、コンテキストインデックスを決定してよい。いくつかの例では、第1、第2、および第3の距離しきい値に対するレーザービームの位置を決定するために、G-PCCエンコーダ200は、ノードの中心を通過するラインの角度のタンジェントをレーザービームの角度のタンジェントから減算することによって、レーザー差分角度(たとえば、下記のthetaLaserDelta)を決定してよく、シフト値をレーザー差分角度から減算することによって、上部角度差(たとえば、下記のDeltaTop)を決定してよく、レーザー差分角度にシフト値を加算することによって、下部角度差(たとえば、下記のDeltaBot)を決定してよい。
G-PCCエンコーダ200は、レーザー差分角度が0以上である(たとえば、thetaLaserDelta≧0)かどうかを決定する第1の比較を実行してよい。G-PCCエンコーダ200は、レーザー差分角度が0以上であるかどうかに基づいてコンテキストインデックスを0または1に設定してよい(たとえば、contextAngular[Child] = thetaLaserDelta≧0 ? 0 : 1)。追加として、G-PCCエンコーダ200は、上部角度差が0以上であるかどうかを決定する第2の比較(たとえば、DeltaTop≧0)を実行してよい。上部角度差が0以上であるとき、レーザービームは第1の距離しきい値の上方にある。G-PCCエンコーダ200はまた、下部角度差が0よりも小さいかどうかを決定する第3の比較(たとえば、DeltaBottom<0)を実行してよい。下部角度差が0よりも小さいとき、レーザービームは第3の距離しきい値の下方にある。G-PCCエンコーダ200は、上部角度差が0以上であることに基づいて(たとえば、if (DeltaTop ≧ 0) contextAngular[Child] += 2)、または下部角度差が0よりも小さいことに基づいて(たとえば、else if (DeltaBottom < 0) contextAngular[Child] += 2)、コンテキストインデックスを2だけインクリメントしてよい。
G-PCCエンコーダ200(たとえば、G-PCCエンコーダ200の算術符号化ユニット214)は、決定されたコンテキストインデックスによって示されるコンテキストを使用して、平面モードの垂直面位置を算術的に符号化してよい(806)。たとえば、G-PCCエンコーダ200は、垂直面位置を示すシンタックス要素に対してCABAC符号化を実行してよい。
図8Bは、垂直面位置を復号するための例示的な動作を示すフローチャートである。G-PCCデコーダ300は、点群データによって表される点群を再構成することの一部として図8Bの動作を実行し得る。図8Bの例では、G-PCCデコーダ300(たとえば、図3のジオメトリ算術復号ユニット302)は、点群の中の点の3次元位置を表す木(たとえば、8分木)のノードの中の平面モードの垂直面位置を復号してよい(850)。言い換えれば、G-PCCデコーダ300は垂直面位置を復号してよい。
平面モードの垂直面位置を復号することの一部として、G-PCCデコーダ300(たとえば、ジオメトリ算術復号ユニット302)は、レーザー候補のセットの中のレーザー候補のレーザーインデックスを決定してよく、決定されるレーザーインデックスは、ノードと交差するかまたはノードの最も近くにあるレーザービームを示す(852)。G-PCCデコーダ300は、本開示の中の他の場所で提供される例のうちのいずれかに従ってレーザーインデックスを決定してよい。
追加として、G-PCCデコーダ300は、レーザービームが第1の距離しきい値の上方にあるのか、第1の距離しきい値と第2の距離しきい値との間にあるのか、第2の距離しきい値と第3の距離しきい値との間にあるのか、それとも第3の距離しきい値の下方にあるのかに基づいて、コンテキストインデックス(contextAngular)を決定してよい(854)。G-PCCデコーダ300は、上記で説明したような、G-PCCエンコーダ200と同じ方法で、コンテキストインデックスを決定してよい。
G-PCCデコーダ300(たとえば、G-PCCデコーダ300のジオメトリ算術復号ユニット302)は、決定されたコンテキストインデックスによって示されるコンテキストを使用して、平面モードの垂直面位置を算術的に復号してよい(856)。たとえば、G-PCCデコーダ300は、垂直面位置を示すシンタックス要素に対してCABAC復号を実行してよい。いくつかの例では、G-PCCデコーダ300は、垂直面位置に基づいて点群の中の1つまたは複数の点の位置を決定してよい。たとえば、G-PCCデコーダ300は、ノードの占有された子ノードのロケーションを垂直面位置に基づいて決定してよい。G-PCCデコーダ300は、次いで、占有された子ノードを処理して、占有された子ノード内の点の位置を決定してよく、占有されていない子ノードに対してさらなる処理を実行する必要がなくてよい。
G-PCCコーダ(たとえば、G-PCCエンコーダ200またはG-PCCデコーダ300)は、部分的にはレーザー候補のセットの中からレーザーインデックスを選択することによって、ノード内でオフセットされた、IDCMの垂直の点位置をコーディング(すなわち、符号化または復号)してよい。レーザー候補のセットは、ジオメトリパラメータセットなどのパラメータセットの中でシグナリングされてよく、選択されるレーザーインデックスは、ノードと交差するレーザービームを示す。レーザー候補のセットは、LIDARアレイの中のレーザーに対応し得る。G-PCCコーダは、ノードとのレーザービームの交差点に基づいてオフセットされた、IDCMの垂直の点位置からのビン(ビット)を算術的にコーディングするためのコンテキストインデックスを決定してよい。
上記で紹介したように、G-PCCエンコーダ200およびG-PCCデコーダ300は、角度モードに対するコンテキスト導出を実行するように構成され得る。3つの座標x、y、およびzに対する平面モードコンテキスト導出が以下で説明される。xy平面の中でLIDARレーザーが回転しているので、x座標およびy座標の処理は互いに類似であってよく、z座標の処理とは異なってよい。他の例では、2つの異なる平面が、第3の異なる平面と類似であってよい。
ノードの位置およびノードの中間点を決定するために、G-PCCエンコーダ200およびG-PCCデコーダ300は、以下に記載するような変数absPosおよびmidNodeを導出してよく、child.posおよびchildSizeLog2は、それぞれ、現在のノードの位置およびサイズを指す。
{
Vec3<int64_t> absPos = {child.pos[0] << childSizeLog2[0],
child.pos[1] << childSizeLog2[1],
child.pos[2] << childSizeLog2[2]};
//適格性
Vec3<int64_t> midNode = {1 << (childSizeLog2[0] ? childSizeLog2[0] - 1 : 0),
1 << (childSizeLog2[1] ? childSizeLog2[1] - 1 : 0),
1 << (childSizeLog2[2] ? childSizeLog2[2] - 1 : 0)};
(2つ以上のレーザーがノードを通過し得るときである)ノードサイズが大きすぎるとき、G-PCCエンコーダ200、したがって、G-PCCデコーダ300は、角度モードを無効化する。G-PCCエンコーダ200は、ノードの中央の距離における2つの隣接するレーザーの間の最短距離の推定値(deltaAngle)を算出し、その推定値をノードサイズと比較する。現在のノードがしきい値よりも大きいとき、G-PCCエンコーダ200は角度モードを無効化する。変数headPosは、LIDARヘッドの位置を指し、LIDAR原点に関して座標xLidar/yLidar/zLidarを発見するために次のように使用され得る。
uint64_t xLidar =
std::abs(((absPos[0] - headPos[0] + midNode[0]) << 8) - 128);
uint64_t yLidar =
std::abs(((absPos[1] - headPos[1] + midNode[1]) << 8) - 128);
uint64_t rL1 = (xLidar + yLidar) >> 1;
uint64_t deltaAngleR = deltaAngle * rL1;
if (deltaAngleR <= (midNode[2] << 26))
return -1;
次のステップにおいて、G-PCCエンコーダ200は、z方向(zLidar)におけるノードの中央の角度高度theta32を算出し、ノード中心の最も近くにあるレーザーのインデックスlaserIndexを次のように推定する。
//rの逆元を決定する(1/sqrt(r2) = irsqrt(r2))
uint64_t r2 = xLidar * xLidar + yLidar * yLidar;
uint64_t rInv = irsqrt(r2);
//未補正のthetaを決定する
int64_t zLidar = ((absPos[2] - headPos[2] + midNode[2]) << 1) - 1;
int64_t theta = zLidar * rInv;
int theta32 = theta >= 0 ? theta >> 15 : -((-theta) >> 15);
//レーザーを決定する
int laserIndex = int(child.laserIndex);
if (laserIndex == 255 || deltaAngleR <= (midNode[2] << (26 + 2))) {
auto end = thetaLaser + numLasers - 1;
auto it = std::upper_bound(thetaLaser + 1, end, theta32);
if (theta32 - *std::prev(it) <= *it - theta32)
--it;
laserIndex = std::distance(thetaLaser, it);
child.laserIndex = uint8_t(laserIndex);
}
最も近いレーザーが推定されると、G-PCCエンコーダ200は、x座標およびy座標の平面モードに対するコンテキストを推定する。いくつかの例では、G-PCCエンコーダ200は、xおよびyのうちのただ一方に対するコンテキストのみを決定し、角度平面モードを用いて一方の座標がコーディングされるとき、他方の座標は平面コーディングされない。レーザーごとに、コーディング/予測された最後の方位がphiBufferの中に記憶される。レーザーの速度(入力パラメータ)に基づいて、G-PCCエンコーダ200は、方位の予測を更新し、更新された方位予測、ノード原点の方位を比較することによってコンテキストを決定し、次いで、最も近いレーザーが現在のノードのどの部分を通過するのかをチェックし、そのことは、x/y次元に対する6個のコンテキストのうちの1つを推定するために、次のように使用され得る。
// -- PHI --
//角度
int posx = absPos[0] - headPos[0];
int posy = absPos[1] - headPos[1];
int phiNode = iatan2(posy + midNode[1], posx + midNode[0]);
int phiNode0 = iatan2(posy, posx);
//予測子を発見する
int predPhi = phiBuffer[laserIndex];
if (predPhi == 0x80000000)
predPhi = phiNode;
//予測子を使用する
if (predPhi != 0x80000000) {
//基本シフト予測子
int Nshift =
((predPhi - phiNode) * phiZi.invDelta(laserIndex) + 536870912) >> 30;
predPhi -= phiZi.delta(laserIndex) * Nshift;
//ctx方位xまたはy
int angleL = phiNode0 - predPhi;
int angleR = phiNode - predPhi;
int contextAnglePhi =
(angleL >= 0 && angleR >= 0) || (angleL < 0 && angleR < 0) ? 2 : 0;
angleL = std::abs(angleL);
angleR = std::abs(angleR);
if (angleL > angleR) {
contextAnglePhi++;
int temp = angleL;
angleL = angleR;
angleR = temp;
}
if (angleR > (angleL << 2))
contextAnglePhi += 4;
if (std::abs(posx) <= std::abs(posy))
*contextAnglePhiX = contextAnglePhi;
else
*contextAnglePhiY = contextAnglePhi;
}
z次元のコンテキストの場合、3つのしきい値、すなわち、theta32、theta32-zShift、およびtheta32+zShiftが選ばれる。最も近いレーザーの仰角thetaLaser[laserIndex]を3つのしきい値と比較することによって、G-PCCエンコーダ200は、z座標の平面モードに対する4個のコンテキストのうちの1つを次のように導出する。
// -- THETA --
int thetaLaserDelta = thetaLaser[laserIndex] - theta32;
int64_t hr = zLaser[laserIndex] * rInv;
thetaLaserDelta += hr >= 0 ? -(hr >> 17) : ((-hr) >> 17);
int64_t zShift = (rInv << childSizeLog2[2] )>> 20;
int thetaLaserDeltaBot = thetaLaserDelta + zShift;
int thetaLaserDeltaTop = thetaLaserDelta - zShift;
int contextAngle = thetaLaserDelta >= 0 ? 0 : 1;
if (thetaLaserDeltaTop >= 0)
contextAngle += 2;
else if (thetaLaserDeltaBot < 0)
contextAngle += 2;
return contextAngle;
}
上記で紹介したように、G-PCCエンコーダ200およびG-PCCデコーダ300はまた、IDCMモードコンテキストを決定するように構成され得る。IDCMとは、ノード内の点の位置がそのノード内の8分木構造を使用せずにコーディングされる、G-PCCにおけるモードを指す。IDCMは、たとえば、疎なノードまたは異常値を有する点群にとって有益であり得、ここで、そのような場合の点の座標をコーディングすることは、完全な8分木構造を有する点をコーディングすることよりも安価であり得る。G-PCCでは、1つまたは2つの異なる位置しかノード内でIDCMノードとしてコーディングされ得ない。
角度モードが使用されるとき、G-PCCエンコーダ200は、位置に対応するビットをレーザーパラメータに基づいてコンテキストコーディングし得る。角度IDCMモードでコーディングされたビットに対するコンテキストが導出される例示的な方法が以下で説明される。以下の説明は、G-PCCエンコーダ200および/またはG-PCCデコーダ300によって実行され得る技法を説明する。
G-PCCエンコーダ200およびG-PCCデコーダ300は、nodePositionおよびレーザーインデックスを決定するように構成され得る。上述のように、IDCMでは、ノードの中の最大2つの異なる位置が符号化され得る。第1のステップは、最大2つの位置を占有する点の数を決定することであってよく、そのことは次のように行われてよい。
int numPoints = 1;
bool numPointsGt1 = _arithmeticDecoder->decode(_ctxNumIdcmPointsGt1);
numPoints += numPointsGt1;
int numDuplicatePoints = 0;
if (!geom_unique_points_flag && !numPointsGt1) {
numDuplicatePoints = !_arithmeticDecoder->decode(_ctxSinglePointPerBlock);
if (numDuplicatePoints) {
bool singleDup = _arithmeticDecoder->decode(_ctxSingleIdcmDupPoint);
if (!singleDup)
numDuplicatePoints +=
1 + _arithmeticDecoder->decodeExpGolomb(0, _ctxPointCountPerBlock);
}
}
次のステップのために、G-PCCエンコーダ200およびG-PCCデコーダ300は、現在のノードに平面モードが適用されるかどうかをチェックするように構成され得る。平面モードが適用される場合、対応する座標のMSBが別々に(平面)シグナリングされてよく、事実上、残りのビットだけがコーディングされる。平面モードを使用する、MSBのコーディングは、IDCMコーディングの前に実行されてよい。ノードサイズが、次のようにeffectiveNodeSizeLog2からnodeSizeLog2Remに更新される。
//平面の後にノードサイズを更新し、平面からの位置の上位部分を決定する
Vec3<int32_t> deltaPlanar{0, 0, 0};
Vec3<int> nodeSizeLog2Rem = nodeSizeLog2;
for (int k = 0; k < 3; k++)
if (nodeSizeLog2Rem[k] > 0 && (planar.planarMode & (1 << k))) {
deltaPlanar[k] |= (planar.planePosBits & (1 << k) ? 1 : 0);
nodeSizeLog2Rem[k]--;
}
次のステップのために、G-PCCエンコーダ200およびG-PCCデコーダ300は、以下に示すように、LIDAR原点ヘッドポストに関してノードの位置posNodeLidarを計算する。x位置およびy位置は、このノードの中の位置のx座標またはy座標がコンテキストコーディングされるべきかどうかを決定するために使用されるが、他の位置はバイパスコーディングされる。
Vec3<bool> directIdcm = !angularIdcm;
point_t posNodeLidar;
if (angularIdcm) {
posNodeLidar =
point_t(
node.pos[0] << nodeSizeLog2[0], node.pos[1] << nodeSizeLog2[1],
node.pos[2] << nodeSizeLog2[2])
- headPos;
bool codeXorY = std::abs(posNodeLidar[0]) <= std::abs(posNodeLidar[1]);
directIdcm.x() = !codeXorY;
directIdcm.y() = codeXorY;
}
2つ以上の点がコーディングされるとき、G-PCCエンコーダ200およびG-PCCデコーダ300は点に順序付けし、そのことは、点位置をコーディングするために必要とされるビット数をさらに低減する。このことは、x位置またはy位置またはz位置の1つまたは複数のMSBをコーディングすることによって達成され、その結果、コーディングされるために残っているビット数(nodeSizeLog2Rem)がさらに低減され得る。
//順序付けされていない2つの点を復号する
Vec3<int32_t> deltaPos[2];
deltaPos[0] = deltaPlanar;
deltaPos[1] = deltaPlanar;
if (numPoints == 2 && joint_2pt_idcm_enabled_flag)
decodeOrdered2ptPrefix(directIdcm, nodeSizeLog2Rem, deltaPos);
(点の平面コーディングおよびジョイントコーディングに起因して)いくつかのビットがすでにコーディングされているので、G-PCCエンコーダ200およびG-PCCデコーダ300は、更新されたノード位置の中間点を計算してよく、この中間点を使用して、ノードの中間点を通過する最も近くのレーザーを次のように決定してよい。
if (angularIdcm) {
for (int idx = 0; idx < 3; ++idx) {
int N = nodeSizeLog2[idx] - nodeSizeLog2Rem[idx];
for (int mask = N ? 1 << (N - 1) : 0; mask; mask >>= 1) {
if (deltaPos[0][idx] & mask)
posNodeLidar[idx] += mask << nodeSizeLog2Rem[idx];
}
if (nodeSizeLog2Rem[idx])
posNodeLidar[idx] += 1 << (nodeSizeLog2Rem[idx] - 1);
}
node.laserIndex = findLaser(posNodeLidar, thetaLaser, numLasers);
}
角度モードが有効化される場合、G-PCCエンコーダ200およびG-PCCデコーダ300は、すでにコーディングされていない位置のビットをコンテキストコーディングしてよい。たとえば、xおよびyのうちの一方のビットがコンテキストコーディングされてよく、他方はバイパスコーディングされてよいが、zのビットは以下で説明するようにコンテキストコーディングされる。そうでない場合、残りのすべてのビットはバイパスコーディングされてよい。
Vec3<int32_t> pos;
for (int i = 0; i < numPoints; i++) {
if (angularIdcm) {
*(outputPoints++) = pos = decodePointPositionAngular(
nodeSizeLog2, nodeSizeLog2Rem, node, planar, headPos, zLaser,
thetaLaser, deltaPos[i]);
} else
*(outputPoints++) = pos =
decodePointPosition(nodeSizeLog2Rem, deltaPos[i]);
}
G-PCCエンコーダ200およびG-PCCデコーダ300は、角度IDCMに対するコンテキストを決定するように構成され得る。レーザーパラメータに基づいてIDCMノード位置に対するコンテキストを決定することが、ここで説明される。
G-PCCエンコーダ200およびG-PCCデコーダ300は、LIDARヘッド位置ヘッドポストに関してノード位置posXyzを計算してよく、そのことは再び、どの座標(xまたはy)がコンテキストコーディングされるべきかを決定するために使用され得る。posXyz[1]≧posXyz[0]である(すなわち、絶対y座標値がより大きい)場合、G-PCCエンコーダ200およびG-PCCデコーダ300は、y座標ビットをバイパスコーディングしてよく、x座標ビットをコンテキストコーディングしてよい。そうでない(すなわち、絶対y座標値が絶対x座標よりも小さい)場合、G-PCCエンコーダ200およびG-PCCデコーダ300は、x座標ビットをバイパスコーディングしてよく、y座標ビットをコンテキストコーディングしてよい。各ビットがコーディングされるにつれて、更新済みのノードposXyzが計算される。
{
Vec3<int32_t> delta = deltaPlanar;
Vec3<int> posXyz = {(child.pos[0] << nodeSizeLog2[0]) - headPos[0],
(child.pos[1] << nodeSizeLog2[1]) - headPos[1],
(child.pos[2] << nodeSizeLog2[2]) - headPos[2]};
// -- PHI --
//直接xまたはyをコーディングし、ノードのphiを算出する
bool codeXorY = std::abs(posXyz[0]) <= std::abs(posXyz[1]);
if (codeXorY) { //yをダイレクトコーディングする
if (nodeSizeLog2AfterPlanar[1])
for (int i = nodeSizeLog2AfterPlanar[1]; i > 0; i--) {
delta[1] <<= 1;
delta[1] |= _arithmeticDecoder->decode();
}
posXyz[1] += delta[1];
posXyz[0] += delta[0] << nodeSizeLog2AfterPlanar[0];
} else { // xをダイレクトコーディングする
if (nodeSizeLog2AfterPlanar[0])
for (int i = nodeSizeLog2AfterPlanar[0]; i > 0; i--) {
delta[0] <<= 1;
delta[0] |= _arithmeticDecoder->decode();
}
posXyz[0] += delta[0];
posXyz[1] += delta[1] << nodeSizeLog2AfterPlanar[1];
}
次のステップでは、G-PCCエンコーダ200およびG-PCCデコーダ300は、平面モードコンテキストに関して上記で説明した方式で導出されたレーザーインデックス、およびビットストリームの中に含まれるレーザーインデックス残差を使用して、点に対するレーザーインデックスを計算する。
//予測子を発見する
int phiNode = iatan2(posXyz[1], posXyz[0]);
int laserNode = int(child.laserIndex);
//レーザー残差
int laserIndex = laserNode + decodeThetaRes();
G-PCCエンコーダ200およびG-PCCデコーダ300は、更新されたこのlaserIndexを使用して、方位(phi)に対する予測を決定し、それはバッファ_phiBufferの中に記憶される。方位範囲の中で一様に点をサンプリングするようにレーザーが近似されるので、G-PCCエンコーダ200およびG-PCCデコーダ300は、phiZi.deltaを使用して方位値における最小差分を示してよい。したがって、予測されるphi値からスキップされている場合がある点の数がnShiftとして計算され、予測されるphi値が更新される。
int predPhi = _phiBuffer[laserIndex];
if (predPhi == 0x80000000)
predPhi = phiNode;
//基本シフト予測子
int nShift =
((predPhi - phiNode) * _phiZi.invDelta(laserIndex) + 536870912) >> 30;
predPhi -= _phiZi.delta(laserIndex) * nShift;
コンテキストコーディングされるxとyとの間の座標に対して、G-PCCデコーダ300は、(コンテキストコーディングされている)残りのnodeSizeLog2AfterPlanar[0]ビットを復号する。ビットごとに、G-PCCデコーダ300は、各ビットが復号されるにつれてposXYを更新することによりノード位置を更新することによって、更新されたコンテキスト値を決定する。G-PCCデコーダ300がまた、ノード位置が更新されるとき、予測されるphi値を再算出する。ノード位置の方位、コンテキストコーディングされる方向(すなわち、xまたはy)においてノードサイズの半分だけオフセットされた位置の方位、および予測される方位を比較して、6個(または、8個)のコンテキストのうちの1つが選ばれる。位置がコーディングされると、ノードの方位phiNodeがバッファの中に記憶される。
//xまたはyを選ぶ
int* posXY = codeXorY ? &posXyz[0] : &posXyz[1];
int idx = codeXorY ? 0 : 1;
//xまたはyを方位コーディングする
int mask2 = codeXorY
? (nodeSizeLog2AfterPlanar[0] > 0 ? 1 << (nodeSizeLog2AfterPlanar[0] - 1)
: 0)
: (nodeSizeLog2AfterPlanar[1] > 0 ? 1 << (nodeSizeLog2AfterPlanar[1] - 1)
: 0);
for (; mask2; mask2 >>= 1) {
//角度左および右
int phiR = codeXorY ? iatan2(posXyz[1], posXyz[0] + mask2)
: iatan2(posXyz[1] + mask2, posXyz[0]);
int phiL = phiNode;
//ctx方位
int angleL = phiL - predPhi;
int angleR = phiR - predPhi;
int contextAnglePhi =
(angleL >= 0 && angleR >= 0) || (angleL < 0 && angleR < 0) ? 2 : 0;
angleL = std::abs(angleL);
angleR = std::abs(angleR);
if (angleL > angleR) {
contextAnglePhi++;
int temp = angleL;
angleL = angleR;
angleR = temp;
}
if (angleR > (angleL << 1))
contextAnglePhi += 4;
//エントロピーコーディング
bool bit = _arithmeticDecoder->decode(
_ctxPlanarPlaneLastIndexAngularPhiIDCM[contextAnglePhi]);
delta[idx] <<= 1;
if (bit) {
delta[idx] |= 1;
*posXY += mask2;
phiNode = phiR;
predPhi = _phiBuffer[laserIndex];
if (predPhi == 0x80000000)
predPhi = phiNode;
//基本シフト予測子
int nShift =
((predPhi - phiNode) * _phiZi.invDelta(laserIndex) + 536870912) >> 30;
predPhi -= _phiZi.delta(laserIndex) * nShift;
}
}
//バッファphiを更新する
_phiBuffer[laserIndex] = phiNode;
x位置およびy位置がコーディングされると、上記で説明したように複数のビットに対する一般化を用いて、(平面モードコンテキストに関して上記で説明した)z方向における平面モードビットに対するコンテキストの導出と同様に、z座標がコーディングされる。各z座標ビットがコーディングされるにつれて、G-PCCデコーダ300は、更新済みのノード位置、およびz方向においてノードサイズの半分だけの、ノード位置からのオフセットであるz値を用いて、次のビットに対するコンテキストを再計算する(posXyz[2] + maskz)。再び、G-PCCデコーダ300は、4個のコンテキストのうちの1つを選んでz座標ビットをコーディングする。
// -- THETA --
int maskz =
nodeSizeLog2AfterPlanar[2] > 0 ? 1 << (nodeSizeLog2AfterPlanar[2] - 1) : 0;
if (!maskz)
return delta;
int posz0 = posXyz[2];
posXyz[2] += delta[2] << nodeSizeLog2AfterPlanar[2];
//xおよびyが知られているので、
//rが同じく知られておりzに対するビットに依存しない
uint64_t xLidar = (int64_t(posXyz[0] ) << 8) - 128;
uint64_t yLidar = (int64_t(posXyz[1] ) << 8) - 128;
uint64_t r2 = xLidar * xLidar + yLidar * yLidar;
int64_t rInv = irsqrt(r2);
//角度を使用してzに対するビットをコーディングする。適格性は暗黙的である。レーザーが知られている。
int64_t hr = zLaser[laserIndex] * rInv;
int fixedThetaLaser =
thetaLaser[laserIndex] + int(hr >= 0 ? -(hr >> 17) : ((-hr) >> 17));
int zShift = (rInv << nodeSizeLog2AfterPlanar[2]) >> 18;
for (int bitIdxZ = nodeSizeLog2AfterPlanar[2]; bitIdxZ > 0;
bitIdxZ--, maskz >>= 1, zShift >>= 1) {
//未補正のthetaを決定する
int64_t zLidar = ((posXyz[2] + maskz) << 1) - 1;
int64_t theta = zLidar * rInv;
int theta32 = theta >= 0 ? theta >> 15 : -((-theta) >> 15);
int thetaLaserDelta = fixedThetaLaser - theta32;
int thetaLaserDeltaBot = thetaLaserDelta + zShift;
int thetaLaserDeltaTop = thetaLaserDelta - zShift;
int contextAngle = thetaLaserDelta >= 0 ? 0 : 1;
if (thetaLaserDeltaTop >= 0)
contextAngle += 2;
else if (thetaLaserDeltaBot < 0)
contextAngle += 2;
delta[2] <<= 1;
delta[2] |= _arithmeticDecoder->decode(
_ctxPlanarPlaneLastIndexAngularIdcm[contextAngle]);
posXyz[2] = posz0 + (delta[2] << (bitIdxZ - 1));
}
return delta;
}
G-PCCエンコーダ200およびG-PCCデコーダ300は、ツリー内量子化を使用するように構成され得る。ツリー内ジオメトリスケーリングは、コーディングツリーが構成されつつある間であってもジオメトリ位置を(たとえば、G-PCCエンコーダ200において)量子化し(たとえば、G-PCCデコーダ300において)スケーリングするための手段を提供する。現在のドラフトテキストでは、位置の量子化ステップサイズおよびスケーリングは次のように適用される。
シフト値(sh)が次のように計算される。
qpScaled = qp << qpDivFactorLog2
sh = qpScaled >> 3
スケーリングプロセスは次のように規定される。
scaled_x = (x * ( 8 + qpScaled % 8 ) << sh + 4 ) >> 3
G-PCCエンコーダ200およびG-PCCデコーダ300は、(ビットストリームの中でシグナリングされる)8分木の中で、特定のノード深度におけるジオメトリ量子化を適用する。単純な例では、ノード座標が12ビットであり、かつ量子化が適用されるべき深度が3である場合、位置のMSB部分と呼ばれる、ノード座標の最初の3つのMSBは量子化されない。位置のLSB部分と呼ばれる、ノード座標の最後の9つのLSBだけが量子化される。量子化に起因して、9つのLSBは、本明細書でNと呼ぶもっと少数のビットに低減されてよく、Nは9よりも小さい。この量子化は、再構成精度という犠牲を払ってビットレートのいくらかの低減をもたらす。得られるノード座標サイズは(≦12となる)N+3になる。
同様に、G-PCCデコーダ300において、N個のLSBがスケーリングされるとともに1<<(9-1)という最大値にクリッピングされ、そのことは、スケーリングされた値が元の点の9つのLSBビットを超えないことを保証する。3つのMSBとスケーリングされたLSBの9ビットとを接合することによって、スケーリングされた最終の位置が計算される。
加えて、ステップサイズの倍増ごとに規定され得るQPの最小数を決定するqpスケール係数もシグナリングされる。G-PCCでは、この係数は値0、1、2、および3をとってよい。
様々な値のqpDivFactorLog2に対するステップサイズの倍増ごとのQP点の数が、下の表の中で指定される。
すべてのqpDivFactorLog2値に対して、ステップサイズ導出は、ステップサイズの倍増に対して8つのQP点として、スケーリングプロセスと同じに保たれ、ステップサイズ導出は、シフトビットの計算およびスケーリングプロセスの前にQP値を調整することによって行われる。
既存の技法は、いくつかの潜在的な問題を有する。たとえば、点群フレームの通常のコーディングでは、角度モードがコーディング効率に相当な利得をもたらす。しかしながら、ツリー内量子化が有効化されると、角度モードの利得はかなり小さくなり、場合によっては実際に損失を生み出す。角度モード(IDCM角度および平面角度)の場合、コンテキスト導出のために量子化ビットが使用される。量子化ビットは元の点と同じドメインの中にはなく、異なるスケール空間の中にある。角度モードとツリー内量子化の両方を同時に有効化するのに有益でない場合があるので、このことはそれらの有用性を低減する。
本開示は、上記で紹介した問題のうちのいくつかに対処し得る技法を説明する。本明細書で説明する様々な技法は、個別にまたは組合せでのいずれかで実行されてよい。
本開示の技法によれば、G-PCCエンコーダ200およびG-PCCデコーダ300は、ライダー原点に関してノード/点の位置を導出するために、点/位置座標値xに対して、ノード/点位置の座標に対するスケーリングされた値xSを導出するように構成され得る。いくつかの例では、スケーリング演算は、位置の1つまたは複数のビットをスケーリングすることを含んでよく、追加として、スケーリングされている最大数のビット値を含んでよく、最大数は、量子化が適用されるべき最大深度から導出される値などのシグナリングされる値に基づく。いくつかの例では、y座標もしくはz座標、または場合によっては2つ以上の座標に対して、スケーリングされた類似の位置が同じく導出され得る。
本開示の技法によれば、G-PCCエンコーダ200およびG-PCCデコーダ300は、スケーリングされた値を使用して、LIDARヘッド位置、またはもっと一般的には原点位置に関して、ノードの相対位置を決定する。G-PCCエンコーダ200およびG-PCCデコーダ300は、たとえば、そのノード位置/座標に対して任意の量子化が適用されているかどうかに基づいて、使用されるべきスケーリングされた値を決定し得る。いくつかの例では、G-PCCエンコーダ200およびG-PCCデコーダ300は、ヘッド位置と同じでないドメインの中にノード位置/座標値があるとき、スケーリングされた値を使用してよい。たとえば、ノード座標x_0およびヘッド位置h_0が、同じドメイン(スケール)の中に記述され、かつx_0の値が量子化の適用によってxとなるように修正される場合、LIDARヘッドに関する相対位置を決定するために、スケーリングされた値が使用される。
本開示の技法によれば、G-PCCエンコーダ200およびG-PCCデコーダ300は、1つまたは複数のスケーリングされた座標値を使用してレーザー特性を算出する。レーザー特性は、たとえば、仰角(x-y平面に関してレーザーによって作られる角度)またはレーザーヘッドオフセットを含んでよい。レーザー特性は、方位または方位予測を含んでよい。
本開示の技法によれば、G-PCCエンコーダ200およびG-PCCデコーダ300は、クリッピングを用いずにスケーリング演算を実行するように構成され得る。たとえば、位置のMSBビットには、そのビットのLSB部分のスケーリングされた値が追加されてよい。いくつかのシナリオでは、G-PCCエンコーダ200およびG-PCCデコーダ300はクリッピングを適用してよく、その場合、位置のMSBビットには、ビットのLSB部分のスケーリングされた値のクリッピングされたバージョンが追加される。いくつかの例では、いくつかのスケーリング演算はクリッピングを含んでよいが、他のスケーリング演算はクリッピングを適用しなくてよい。このことは、コーディングされている座標、QPが適用される深度、およびQP値によって決定されてよい。
本開示の技法によれば、G-PCCエンコーダ200およびG-PCCデコーダ300は、qpDivFactorLog2の値に基づいて角度モードを(全体的または部分的に)制限するように構成され得る。たとえば、qpDivFactorLog2の値が0、1、または2であるとき、G-PCCエンコーダ200およびG-PCCデコーダ300は、角度モードを(全体的または部分的に)、すなわち、ジオメトリ量子化/スケーリングに対して2のべき乗のステップサイズが許容されるときのみ、無効化するように構成され得る。
いくつかの例では、G-PCCエンコーダ200およびG-PCCデコーダ300は、パラメータセットを参照中のすべてのノードのQP値が、2のべき乗であるステップサイズに相当するときのみ、(たとえば、パラメータセット、たとえば、GPSの中で示される)角度モードを有効化するように構成され得る。別の例では、ツリー内ジオメトリスケーリングが(たとえば、geom_scaling_enabled_flagを1に等しく設定することによって)有効化されるとき、G-PCCエンコーダ200およびG-PCCデコーダ300は、全体的にまたは部分的にのいずれかで角度モードを無効化するように構成され得る。上記の例では、角度モードの部分的な無効化は、角度モードを使用する平面モード関連パラメータ(または、ビット)のコンテキスト導出を無効化すること、および角度モードを使用するIDCMモード関連パラメータ(または、ビット)のコンテキスト導出を無効化することのうちの、1つまたは複数を含んでよい。
本開示の技法によれば、G-PCCエンコーダ200およびG-PCCデコーダ300は、特定のノードのためのQP値に基づいて角度モードに対するコンテキスト導出を修正するように構成され得る。一例では、コンテキスト導出において使用される1つまたは複数のしきい値は、(QPの関数などの)QP値に基づいて指定されてよい。しきい値は、たとえば、0というQP値に対して変更されなくてよいが、QPが0よりも大きいときに修正されてよい。他の例では、しきい値は、2のべき乗であるステップサイズをもたらすQP値に対して変更されなくてよいが、そうでない場合に修正されてよい。
修正されるQP値は、QP値およびスケール係数のテーブル、ならびに/またはしきい値を修正するためのオフセットを用いて指定されてよい。たとえば、QPに関して修正されるとき、しきい値をスケーリングする(0でないQPに対して、しきい値を倍増する)ために、固定の倍数が使用されてよい。別の例では、しきい値「z」がz_mod=func(z, QP)として修正されてよく、ただし、func()は、事前決定された関数、またはビットストリームの中で示される関数である。たとえば、func(z, QP)=a(QP)*z+b(QP)であって、ただし、a(QP)およびb(QP)は、QP値に基づくパラメータセットである(関数a()またはb()は線形関数または非線形関数であってよい)。
しきい値の修正は、3つの成分x、y、またはzのうちの1つまたは複数に適用されてよい。修正は、theta/レーザー角度に関連するコンテキスト、または方位に関連するコンテキストのうちの、1つまたは複数に適用されてよい。しきい値の修正は、平面角度モードおよび角度IDCMモードのうちの1つまたは複数に適用されてよい。
本開示の技法によれば、G-PCCエンコーダ200およびG-PCCデコーダ300は、1つまたは複数のしきい値を使用して、角度モードを有効化すべきか否かを決定するように構成されてよく、コンテキスト導出のために使用される技法のうちの1つまたは複数を使用してQPに基づいて1つまたは複数のしきい値を修正してよい。(たとえば、ノードサイズがしきい値よりも大きいときに角度モードが無効化される場合、そのしきい値は、いくつかのQP値のためのしきい値を倍増するなどして、QPに基づいて修正されてよい。)
例示的な一実装形態は、スケーリングされた点値を使用してLIDARノードに関する相対位置を決定する。本開示全体にわたって、識別子<add>と</add>の中間に追加が示され、識別子<del>と</del>との間に削除が示される。
G-PCCエンコーダ200およびG-PCCデコーダ300は、平面モードコンテキストを決定するように構成され得る。
qpから導出されるステップサイズおよびquantMasksによって示されるビットに基づいて、点の3つの座標に対してスケーリング演算を適用する、関数invQuantPositionAngularが定義される。この関数は、次のように定義されてよい。すなわち、この例では、スケーリング演算はツリー内量子化のために定義された逆スケーリング演算と類似であるが、任意の一般的なスケーリング演算が適用され得る。quantMasksは、ノード位置のどのビットがスケーリングされるべきかを示す1および0のセットである。たとえば、quantMasks=00000111である場合、最後の3つのビットだけがスケーリングされる。この例では、スケーリング演算の後、位置のスケーリングされていない部分と位置のスケーリングされている部分とが加えられて、「スケーリングされた」位置を形成する。スケーリングされていない部分は、スケーリングされている部分に加える前にシフトされてよい。
<add>
invQuantPositionAngular(int qp, Vec3<uint32_t> quantMasks, const Vec3<int32_t>& pos)
{
QuantizerGeom quantizer(qp);
int shiftBits = QuantizerGeom::qpShift(qp);
Vec3<int64_t> recon;
for (int k = 0; k < 3; k++) {
int lowPart = (pos[k] & quantMasks[k]) >> shiftBits;
int highPart = pos[k] & ~(quantMasks[k]);
int lowPartScaled = PCCClip(quantizer.scale(lowPart), 0, quantMasks[k]);
recon[k] = highPart | lowPartScaled;
}
return recon;
</add>
いくつかの例では、qpが0でないときのみ、このプロセスが適用される。他の例では、PCCClip()演算は実行されなくてよく、次のようにhighPartとlowPartSCaledとを加えることによってrecon[ ]変数が取得される。
<add> int lowPartScaled = quantizer.scale(lowPart)
recon[k] = highPart + lowPartScaled; </add>
平面変数に対するコンテキストの決定において、G-PCCエンコーダ200およびG-PCCデコーダ300は、子ノードの位置absPos、(ノードのサイズの半分を示す)midNode、および(ノードのサイズを示す)childSizeに対してスケーリング演算を適用し、これらの値のスケーリングされたバージョンがコンテキスト導出プロセスの中で使用される。
{
Vec3<int64_t> absPos = {child.pos[0] << childSizeLog2[0],
child.pos[1] << childSizeLog2[1],
child.pos[2] << childSizeLog2[2]};
//適格性
Vec3<int64_t> midNode = {1 << (childSizeLog2[0] ? childSizeLog2[0] - 1 : 0),
1 << (childSizeLog2[1] ? childSizeLog2[1] - 1 : 0),
1 << (childSizeLog2[2] ? childSizeLog2[2] - 1 : 0)};
<add>
Vec3<int64_t> childSize = {
1 << childSizeLog2[0], 1 << childSizeLog2[1], 1 << childSizeLog2[2]};
if (child.qp) {
absPos = invQuantPositionAngular(child.qp, quantMasks, absPos);
midNode = invQuantPositionAngular(child.qp, quantMasks, midNode);
childSize = invQuantPositionAngular(child.qp, quantMasks, childSize);
}
</add>
uint64_t xLidar =
std::abs(((absPos[0] - headPos[0] + midNode[0] ) << 8) - 128);
uint64_t yLidar =
std::abs(((absPos[1] - headPos[1] + midNode[1]) << 8) - 128);
uint64_t rL1 = (xLidar + yLidar) >> 1;
uint64_t deltaAngleR = deltaAngle * rL1;
if (deltaAngleR <= (midNode[2] << 26))
return -1;
//rの逆元を決定する(1/sqrt(r2) = irsqrt(r2))
uint64_t r2 = xLidar * xLidar + yLidar * yLidar;
uint64_t rInv = irsqrt(r2);
//未補正のthetaを決定する
int64_t zLidar = ((absPos[2] - headPos[2] + midNode[2]) << 1) - 1;
int64_t theta = zLidar * rInv;
int theta32 = theta >= 0 ? theta >> 15 : -((-theta) >> 15);
//レーザーを決定する
int laserIndex = int(child.laserIndex);
if (laserIndex == 255 || deltaAngleR <= (midNode[2] << (26 + 2))) {
auto end = thetaLaser + numLasers - 1;
auto it = std::upper_bound(thetaLaser + 1, end, theta32);
if (theta32 - *std::prev(it) <= *it - theta32)
--it;
laserIndex = std::distance(thetaLaser, it);
child.laserIndex = uint8_t(laserIndex);
}
// -- PHI --
//角度
int posx = absPos[0] - headPos[0];
int posy = absPos[1] - headPos[1];
int phiNode = iatan2(posy + midNode[1] , posx + midNode[0]);
int phiNode0 = iatan2(posy, posx);
//予測子を発見する
int predPhi = phiBuffer[laserIndex];
if (predPhi == 0x80000000)
predPhi = phiNode;
//予測子を使用する
if (predPhi != 0x80000000) {
//基本シフト予測子
int Nshift =
((predPhi - phiNode) * phiZi.invDelta(laserIndex) + 536870912) >> 30;
predPhi -= phiZi.delta(laserIndex) * Nshift;
//ctx方位xまたはy
int angleL = phiNode0 - predPhi;
int angleR = phiNode - predPhi;
int contextAnglePhi =
(angleL >= 0 && angleR >= 0) || (angleL < 0 && angleR < 0) ? 2 : 0;
angleL = std::abs(angleL);
angleR = std::abs(angleR);
if (angleL > angleR) {
contextAnglePhi++;
int temp = angleL;
angleL = angleR;
angleR = temp;
}
if (angleR > (angleL << 2))
contextAnglePhi += 4;
if (std::abs(posx) <= std::abs(posy))
*contextAnglePhiX = contextAnglePhi;
else
*contextAnglePhiY = contextAnglePhi;
}
//-- THETA --
int thetaLaserDelta = thetaLaser[laserIndex] - theta32;
int64_t hr = zLaser[laserIndex] * rInv;
thetaLaserDelta += hr >= 0 ? -(hr >> 17) : ((-hr) >> 17);
<del> int64_t zShift = (rInv << childSizeLog2[2]) >> 20; </del>
<add>int64_t zShift = (rInv * childSize[2]) >> 20; </add>
int thetaLaserDeltaBot = thetaLaserDelta + zShift;
int thetaLaserDeltaTop = thetaLaserDelta - zShift;
int contextAngle = thetaLaserDelta >= 0 ? 0 : 1;
if (thetaLaserDeltaTop >= 0)
contextAngle += 2;
else if (thetaLaserDeltaBot < 0)
contextAngle += 2;
return contextAngle;
}
いくつかの例では、G-PCCエンコーダ200およびG-PCCデコーダ300は、(QPから導出される)スケーリングステップサイズが2のべき乗でないときのみ、乗算を用いてzShiftを実施するように構成され得る。そうでない(ステップサイズが2のべき乗である)場合、zShiftは(上記に示したように)シフト演算として実施される。
本開示は、IDCM角度コンテキストのための変更を説明する。
逆スケール関数が次のように定義され、ここで、スケーリング演算は以前に定義された関数と類似であり、関数の引数(noClip)が、クリッピングが適用されるべきか否かを決定する。
class InvQuantizer {
int qp;
Vec3<uint32_t> quantMasks;
public:
InvQuantizer(int qpVal, Vec3<uint32_t> quantMaskInp)
: qp(qpVal), quantMasks(quantMaskInp)
{}
int32_t invQuantPositionComp(
int idx, const int32_t& pos, bool noClip = false)
{
if (!qp)
return pos;
QuantizerGeom quantizer(qp);
int shiftBits = QuantizerGeom::qpShift(qp);
int32_t recon;
int lowPart = pos & (quantMasks[idx] >> shiftBits);
int highPart = pos ^ lowPart;
int lowPartScaled = quantizer.scale(lowPart);
if (!noClip)
lowPartScaled = PCCClip(lowPartScaled, 0, quantMasks[idx]);
recon = (highPart << shiftBits) + lowPartScaled;
return recon;
}
};
いくつかの例では、recon変数は次のように導出され得る。
recon = (highPart << shiftBits) | lowPartScaled;
G-PCCエンコーダ200およびG-PCCデコーダ300は、たとえば、上記で説明したものと類似の方法で、nodePositionおよびレーザーインデックスを決定するように構成され得る。
G-PCCデコーダ300は、ノードのQP、および点位置に適用可能な量子化マスクを用いて、次のようにスケーリング演算(逆量子化とも呼ばれる)を初期化してよい。
<add> InvQuantizer invQuantizerIDCM(child.qp, posQuantBitMasks); </add>
以下のコードでは、LIDAR原点に関するノードの位置が推定されることになるどのような場合でも、位置のスケーリングされた値が使用される。このことは、LIDAR原点に関する相対位置が正しく推定されること、ならびにレーザーインデックス、高度、および方位が正しく計算されることを保証する。マスク値またはノードサイズを追加することによってノード位置が更新されるとき、追加された値も追加の前に逆量子化される(または、場合によっては、その値は量子化されていない位置に追加され、次いで、スケーリングされる)。
int numPoints = 1;
bool numPointsGt1 = _arithmeticDecoder->decode(_ctxNumIdcmPointsGt1);
numPoints += numPointsGt1;
int numDuplicatePoints = 0;
if (!geom_unique_points_flag && !numPointsGt1) {
numDuplicatePoints = !_arithmeticDecoder->decode(_ctxSinglePointPerBlock);
if (numDuplicatePoints) {
bool singleDup = _arithmeticDecoder->decode(_ctxSingleIdcmDupPoint);
if (!singleDup)
numDuplicatePoints +=
1 + _arithmeticDecoder->decodeExpGolomb(0, _ctxPointCountPerBlock);
}
}
//平面の後にノードサイズを更新し、平面からの位置の上位部分を決定する
Vec3<int32_t> deltaPlanar{0, 0, 0};
Vec3<int> nodeSizeLog2Rem = nodeSizeLog2;
for (int k = 0; k < 3; k++)
if (nodeSizeLog2Rem[k] > 0 && (planar.planarMode & (1 << k))) {
deltaPlanar[k] |= (planar.planePosBits & (1 << k) ? 1 : 0);
nodeSizeLog2Rem[k]--;
}
//どの成分が直接コーディングされるのか、または角度を使用してコーディングされるのかを示す
//コンテキスト化
Vec3<bool> directIdcm = !angularIdcm;
point_t posNodeLidar;
if (angularIdcm) {
posNodeLidar =
point_t(
node.pos[0] << nodeSizeLog2[0], node.pos[1] << nodeSizeLog2[1],
node.pos[2] << nodeSizeLog2[2])
<del>- headPos; </del>
<add> if (node.qp)
posNodeLidar =
invQuantPosition(node.qp, posQuantBitMasks, posNodeLidar);
posNodeLidar -= headPos; </add>
bool codeXorY = std::abs(posNodeLidar[0]) <= std::abs(posNodeLidar[1]);
directIdcm.x() = !codeXorY;
directIdcm.y() = codeXorY;
}
//順序付けされていない2つの点を復号する
Vec3<int32_t> deltaPos[2];
deltaPos[0] = deltaPlanar;
deltaPos[1] = deltaPlanar;
if (numPoints == 2 && joint_2pt_idcm_enabled_flag)
decodeOrdered2ptPrefix(directIdcm, nodeSizeLog2Rem, deltaPos);
if (angularIdcm) {
<add> InvQuantizer invQuantizerIDCM(node.qp, posQuantBitMasks); </add>
for (int idx = 0; idx < 3; ++idx) {
<add> int delta = 0; </add>
int N = nodeSizeLog2[idx] - nodeSizeLog2Rem[idx];
for (int mask = N ? 1 << (N - 1) : 0; mask; mask >>= 1) {
if (deltaPos[0][idx] & mask)
<add> delta</add> <del>posNodeLida[idx]</del> += mask << nodeSizeLog2Rem[idx];
}
if (nodeSizeLog2Rem[idx])
<add> delta</add> <del>posNodeLidar[idx] </del> += 1 << (nodeSizeLog2Rem[idx] - 1);
<add> posNodeLidar[idx] +=</add>
<add> invQuantizerIDCM.invQuantPositionComp(idx, delta, true); </add>
}
node.laserIndex = findLaser(posNodeLidar, thetaLaser, numLasers);
}
Vec3<int32_t> pos;
for (int i = 0; i < numPoints; i++) {
if (angularIdcm) {
*(outputPoints++) = pos = decodePointPositionAngular(
nodeSizeLog2, nodeSizeLog2Rem, node, planar, headPos, zLaser,
thetaLaser, deltaPos[i]);
} else
*(outputPoints++) = pos =
decodePointPosition(nodeSizeLog2Rem, deltaPos[i]);
}
for (int i = 0; i < numDuplicatePoints; i++)
*(outputPoints++) = pos;
return numPoints + numDuplicatePoints;
G-PCCエンコーダ200およびG-PCCデコーダ300は、角度IDCMに対するコンテキストを決定するように構成され得る。
上記と同様に、LIDARヘッド位置に関するノードの位置が比較されるとき、ノードサイズおよびノード位置のスケーリングされたバージョンが使用される。
{
Vec3<int32_t> delta = deltaPlanar;
<del>
Vec3<int> posXyz = {(child.pos[0] << nodeSizeLog2[0]) - headPos[0],
(child.pos[1] << nodeSizeLog2[1]) - headPos[1],
(child.pos[2] << nodeSizeLog2[2]) - headPos[2]};
</del>
<add>
Vec3<int> posXyz = {
(child.pos[0] << nodeSizeLog2[0]), (child.pos[1] << nodeSizeLog2[1]),
(child.pos[2] << nodeSizeLog2[2])};
Vec3<int> posXyzBeforeQuant = posXyz;
if (child.qp)
posXyz = invQuantPosition(child.qp, posQuantBitMasks, posXyz);
posXyz -= headPos;
</add>
// -- PHI --
//直接xまたはyをコーディングし、ノードのphiを算出する
bool codeXorY = std::abs(posXyz[0]) <= std::abs(posXyz[1]);
if (codeXorY) { //yをダイレクトコーディングする
if (nodeSizeLog2AfterPlanar[1])
for (int i = nodeSizeLog2AfterPlanar[1]; i > 0; i--) {
delta[1] <<= 1;
delta[1] |= _arithmeticDecoder->decode();
}
<del>
posXyz[1] += delta[1];
posXyz[0] += delta[0] << nodeSizeLog2AfterPlanar[0];
</del>
<add>
posXyz[1]=
invQuantizerIDCM.invQuantPositionComp(1, posXyzBeforeQuant[1] + delta[1])
- headPos[1];
posXyz[0] += invQuantizerIDCM.invQuantPositionComp(
0, delta[0] << nodeSizeLog2AfterPlanar[0], true);
</add>
} else { //xをダイレクトコーディングする
if (nodeSizeLog2AfterPlanar[0])
for (int i = nodeSizeLog2AfterPlanar[0]; i > 0; i--) {
delta[0] <<= 1;
delta[0] |= _arithmeticDecoder->decode();
}
<del>
posXyz[0] += delta[0];
posXyz[1] += delta[1] << nodeSizeLog2AfterPlanar[1];
</del>
<add>
posXyz[0] =
invQuantizerIDCM.invQuantPositionComp(0, posXyzBeforeQuant[0] + delta[0])
- headPos[0];
posXyz[1] += invQuantizerIDCM.invQuantPositionComp(
1, delta[1] << nodeSizeLog2AfterPlanar[1], true);
</add>
}
//予測子を発見する
int phiNode = iatan2(posXyz[1], posXyz[0]);
int laserNode = int(child.laserIndex);
//レーザー残差
int laserIndex = laserNode + decodeThetaRes();
int predPhi = _phiBuffer[laserIndex];
if (predPhi == 0x80000000)
predPhi = phiNode;
//基本シフト予測子
int nShift =
((predPhi - phiNode) * _phiZi.invDelta(laserIndex) + 536870912) >> 30;
predPhi -= _phiZi.delta(laserIndex) * nShift;
//xまたはyを選ぶ
int* posXY = codeXorY ? &posXyz[0] : &posXyz[1];
int idx = codeXorY ? 0 : 1;
//xまたはyを方位コーディングする
int mask2 = codeXorY
? (nodeSizeLog2AfterPlanar[0] > 0 ? 1 << (nodeSizeLog2AfterPlanar[0] - 1)
: (nodeSizeLog2AfterPlanar[1] > 0 ? 1 << (nodeSizeLog2AfterPlanar[1] - 1)
for (; mask2; mask2 >>= 1) {
//角度左および右
<del>
int phiR = codeXorY ? iatan2(posXyz[1], posXyz[0] + mask2)
: iatan2(posXyz[1] + mask2, posXyz[0]);
</del>
<add>
int32_t scaledMask =
invQuantizerIDCM.invQuantPositionComp(codeXorY ? 0 : 1, mask2, true);
int phiR = codeXorY ? iatan2(posXyz[1], posXyz[0] + scaledMask)
: iatan2(posXyz[1] + scaledMask, posXyz[0]);
</add>
int phiL = phiNode;
//ctx方位
int angleL = phiL - predPhi;
int angleR = phiR - predPhi;
int contextAnglePhi =
(angleL >= 0 && angleR >= 0) || (angleL < 0 && angleR < 0) ? 2 : 0;
angleL = std::abs(angleL);
angleR = std::abs(angleR);
if (angleL > angleR) {
contextAnglePhi++;
int temp = angleL;
angleL = angleR;
angleR = temp;
}
if (angleR > (angleL << 1))
contextAnglePhi += 4;
//エントロピーコーディング
bool bit = _arithmeticDecoder->decode(
_ctxPlanarPlaneLastIndexAngularPhiIDCM[contextAnglePhi]);
delta[idx] <<= 1;
if (bit) {
delta[idx] |= 1;
<del>*posXY += mask2; </del>
<add> *posXY += invQuantizerIDCM.invQuantPositionComp(idx, mask2, true); </add>
phiNode = phiR;
predPhi = _phiBuffer[laserIndex];
if (predPhi == 0x80000000)
predPhi = phiNode;
//基本シフト予測子
int nShift =
((predPhi - phiNode) * _phiZi.invDelta(laserIndex) + 536870912) >> 30;
predPhi -= _phiZi.delta(laserIndex) * nShift;
}
}
//バッファphiを更新する
_phiBuffer[laserIndex] = phiNode;
// -- THETA --
int maskz =
nodeSizeLog2AfterPlanar[2] > 0 ? 1 << (nodeSizeLog2AfterPlanar[2] - 1) : 0;
if (!maskz)
return delta;
int posz0 = posXyz[2];
<del> posXyz[2] += delta[2] << nodeSizeLog2AfterPlanar[2];</del>
<add>
posXyz[2] += invQuantizerIDCM.invQuantPositionComp(
2, delta[2] << nodeSizeLog2AfterPlanar[2], true);
</add>
//xおよびyが知られているので、
//rが同じく知られておりzに対するビットに依存しない
uint64_t xLidar = (int64_t(posXyz[0]) << 8) - 128;
uint64_t yLidar = (int64_t(posXyz[1]) << 8) - 128;
uint64_t r2 = xLidar * xLidar + yLidar * yLidar;
int64_t rInv = irsqrt(r2);
//角度を使用してzに対するビットをコーディングする。適格性は暗黙的である。レーザーが知られている。
int64_t hr = zLaser[laserIndex] * rInv;
int fixedThetaLaser =
thetaLaser[laserIndex] + int(hr >= 0 ? -(hr >> 17) : ((-hr) >> 17));
<del> int zShift = (rInv << nodeSizeLog2AfterPlanar[2]) >> 18; </del>
<add>
int zShift = (child.qp ? (
rInv
* invQuantizerIDCM.invQuantPositionComp(
2, 1 << nodeSizeLog2AfterPlanar[2], true))
: (rInv << nodeSizeLog2AfterPlanar[2]))
>> 18;
</add>
for (int bitIdxZ = nodeSizeLog2AfterPlanar[2]; bitIdxZ > 0;
bitIdxZ--, maskz >>= 1, zShift >>= 1) {
//未補正のthetaを決定する
<del> int64_t zLidar = ((posXyz[2] + maskz) << 1) - 1; </del>
<add> int scaledMaskZ = invQuantizerIDCM.invQuantPositionComp(2, maskz, true); </add>
<add> int64_t zLidar = ((posXyz[2] + scaledMaskZ) << 1) - 1; </add>
int64_t theta = zLidar * rInv;
int theta32 = theta >= 0 ? theta >> 15 : -((-theta) >> 15);
int thetaLaserDelta = fixedThetaLaser - theta32;
int thetaLaserDeltaBot = thetaLaserDelta + zShift;
int thetaLaserDeltaTop = thetaLaserDelta - zShift;
int contextAngle = thetaLaserDelta >= 0 ? 0 : 1;
if (thetaLaserDeltaTop >= 0)
contextAngle += 2;
else if (thetaLaserDeltaBot < 0)
contextAngle += 2;
delta[2] <<= 1;
delta[2] |= _arithmeticDecoder->decode(
_ctxPlanarPlaneLastIndexAngularIdcm[contextAngle]);
<del>posXyz[2] = posz0 + (delta[2] << (bitIdxZ - 1)); </del>
<add> if (delta[2] & 1) </add>
<add> posXyz[2] += scaledMaskZ; </add>
}
return delta;
}
導出の残部は、上記で説明されたものと類似である。
以下の例は、平面角度モードにおけるz座標のコンテキストに対するしきい値が次のように更新される実装形態を示す(更新される部分が**と**の中間で識別される)。
Vec3<int64_t> childSize = {
1 << childSizeLog2[0], 1 << childSizeLog2[1], 1 << childSizeLog2[2]};
if (child.qp) {
absPos = invQuantPositionAngular(child.qp, quantMasks, absPos);
midNode = invQuantPositionAngular(child.qp, quantMasks, midNode);
childSize = invQuantPositionAngular(child.qp, quantMasks, childSize);
**childSize[2] = 2*childSize[2];**
}
この例では、上記の例に示す変更の残部も残存してよい。
本開示の様々な態様における例は、個別にまたは任意の組合せで使用されてよい。
図9Aは、本開示の1つまたは複数の技法による、G-PCCエンコーダ200の例示的な動作を示すフローチャートである。G-PCCエンコーダ200は、ノードに対してツリー内量子化が有効化されることを決定する(900)。G-PCCエンコーダ200は、ノードに対して平面モードがアクティブ化されることを決定する(902)。ノードに対してツリー内量子化が有効化されることに応答して、G-PCCエンコーダ200は、原点位置に対する座標位置を表す量子化された値をノードに対して決定する(904)。G-PCCエンコーダ200は、原点位置に対する座標位置を表すスケーリングされた値を決定するために、量子化された値をクリッピングを用いずにスケーリングする(906)。
原点位置に対する座標位置を表すスケーリングされた値を決定するために、量子化された値をクリッピングを用いずにスケーリングするために、G-PCCエンコーダ200は、最上位ビット(MSB)のグループおよび最下位ビット(LSB)のグループを決定し、スケーリングされたLSBを決定するために、クリッピングを用いずにLSBをスケーリングし、原点位置に対する座標位置を表すスケーリングされた値を決定するために、スケーリングされたLSBをMSBに追加するように構成され得る。原点位置に対する座標位置を表すスケーリングされた値を決定するために、量子化された値をクリッピングを用いずにスケーリングするために、G-PCCエンコーダ200は、ノードのための量子化パラメータに基づいてMSBに対するシフト量を決定し、シフト量に基づいてMSBをシフトし、原点位置に対する座標位置を表すスケーリングされた値を決定するために、スケーリングされたLSBをシフトされたMSBに追加するように構成され得る。G-PCCエンコーダ200は、たとえば、LSBのグループの中のビット数の表示を、ビットストリームの中でシグナリングされるシンタックスの中で受信してよい。表示は、明示的な表示または暗黙的な表示のいずれかであってよい。一例として、受信されたノード深度に基づいて、G-PCCエンコーダ200は、MSBおよびLSBの数を導出するように構成され得る。
G-PCCエンコーダ200は、原点位置に対する座標位置を表すスケーリングされた値に基づいて、角度モードのための平面位置シンタックス要素をコンテキスト符号化するためのコンテキストを決定する(908)。平面位置シンタックス要素は、たとえば、垂直面位置を示してよい。原点位置に対する座標位置を表すスケーリングされた値に基づいて、角度モードのための平面位置シンタックス要素をコンテキスト符号化するためのコンテキストを決定するために、G-PCCエンコーダ200は、スケーリングされた値および原点位置に基づいて1つまたは複数のレーザー特性を決定し、レーザー特性に基づいて角度モードのための平面位置シンタックス要素を符号化するように構成され得る。レーザー特性に基づいて、角度モードのための平面位置シンタックス要素をコンテキスト符号化するためのコンテキストを決定するために、G-PCCエンコーダ200は、決定された1つまたは複数のレーザー特性を有するレーザービームが、第1の距離しきい値の上方にあるのか、第1の距離しきい値と第2の距離しきい値との間にあるのか、第2の距離しきい値と第3の距離しきい値との間にあるのか、それとも第3の距離しきい値の下方にあるのかに基づいて、コンテキストインデックスを決定するように構成され得る。
上記のステップ904、906、および908は、たとえば、G-PCCエンコーダ200によって実行される復号動作の一部として実行されてよい。G-PCCエンコーダ200は、符号化の一部として復号を実行してよい。たとえば、特定の符号化方式が、望ましいレートひずみトレードオフをもたらすかどうかを決定するために、G-PCCエンコーダ200は、ひずみの量を決定するために、復号された点群データが元の点群データと比較され得るように、点群データを符号化してよく、次いで、符号化された点群データを復号してよい。様々な予測コーディングツールを使用するとき、G-PCCエンコーダ200がG-PCCデコーダにとって利用可能な同じ点群データに基づいて予測を実行できるように、G-PCCエンコーダ200はまた、点群データを符号化してよく、次いで、符号化された点群データを復号してよい。
図9Bは、本開示の1つまたは複数の技法による、G-PCCデコーダ300の例示的な動作を示すフローチャートである。G-PCCデコーダ300は、ノードに対してツリー内量子化が有効化されることを、ビットストリームの中でシグナリングされるシンタックスに基づいて決定する(920)。G-PCCデコーダ300は、ノードに対して平面モードがアクティブ化されることを、ビットストリームの中でシグナリングされるシンタックスに基づいてノードに対して決定する(922)。ノードに対してツリー内量子化が有効化されることに応答して、G-PCCデコーダ300は、原点位置に対する座標位置を表す量子化された値をノードに対して決定する(924)。
G-PCCデコーダ300は、原点位置に対する座標位置を表すスケーリングされた値を決定するために、量子化された値をクリッピングを用いずにスケーリングする(926)。
原点位置に対する座標位置を表すスケーリングされた値を決定するために、量子化された値をクリッピングを用いずにスケーリングするために、G-PCCデコーダ300は、最上位ビット(MSB)のグループおよび最下位ビット(LSB)のグループを決定し、スケーリングされたLSBを決定するために、クリッピングを用いずにLSBをスケーリングし、原点位置に対する座標位置を表すスケーリングされた値を決定するために、スケーリングされたLSBをMSBに追加するように構成され得る。原点位置に対する座標位置を表すスケーリングされた値を決定するために、量子化された値をクリッピングを用いずにスケーリングするために、G-PCCデコーダ300は、ノードのための量子化パラメータに基づいてMSBに対するシフト量を決定し、シフト量に基づいてMSBをシフトし、原点位置に対する座標位置を表すスケーリングされた値を決定するために、スケーリングされたLSBをシフトされたMSBに追加するように構成され得る。G-PCCデコーダ300は、たとえば、LSBのグループの中のビット数の表示を、ビットストリームの中でシグナリングされるシンタックスの中で受信してよい。表示は、明示的な表示または暗黙的な表示のいずれかであってよい。一例として、受信されたノード深度に基づいて、G-PCCデコーダ300は、MSBおよびLSBの数を導出するように構成され得る。
G-PCCデコーダ300は、原点位置に対する座標位置を表すスケーリングされた値に基づいて、角度モードのための平面位置シンタックス要素をコンテキスト復号、たとえば、算術的に復号するための、コンテキストを決定する(928)。平面位置シンタックス要素は、たとえば、垂直面位置を示してよい。原点位置に対する座標位置を表すスケーリングされた値に基づいて、角度モードのための平面位置シンタックス要素をコンテキスト復号するためのコンテキストを決定するために、G-PCCデコーダ300は、スケーリングされた値および原点位置に基づいて1つまたは複数のレーザー特性を決定し、レーザー特性に基づいて角度モードのための平面位置シンタックス要素を復号するように構成され得る。レーザー特性に基づいて、角度モードのための平面位置シンタックス要素をコンテキスト復号するためのコンテキストを決定するために、G-PCCデコーダ300は、決定された1つまたは複数のレーザー特性を有するレーザービームが、第1の距離しきい値の上方にあるのか、第1の距離しきい値と第2の距離しきい値との間にあるのか、第2の距離しきい値と第3の距離しきい値との間にあるのか、それとも第3の距離しきい値の下方にあるのかに基づいて、コンテキストインデックスを決定するように構成され得る。
G-PCCデコーダ300は、たとえば、平面位置に基づいて点群の1つまたは複数の点の位置を決定することによって、点群を再構成するように構成され得る。
図10は、本開示の1つまたは複数の技法とともに使用され得る例示的な距離測定システム1000を示す概念図である。図10の例では、距離測定システム1000は、照明器1002およびセンサー1004を含む。照明器1002は、光線1006を放射し得る。いくつかの例では、照明器1002は、1つまたは複数のレーザービームとしての光線1006を放射してよい。光線1006は、赤外波長または可視光波長などの1つまたは複数の波長であってよい。他の例では、光線1006はコヒーレントなレーザー光でない。光線1006が物体1008などの物体に遭遇すると、光線1006は回帰光線1010を生み出す。回帰光線1010は、後方散乱光および/または反射光を含んでよい。回帰光線1010は、センサー1004上に物体1008の画像1012を生み出すように回帰光線1010を導くレンズ1011を通過し得る。センサー1004は、画像1012に基づいて信号1018を生成する。画像1012は、(たとえば、図10の画像1012の中のドットによって表されるような)点のセットを備えてよい。
いくつかの例では、照明器1002およびセンサー1004は、照明器1002およびセンサー1004が環境の360度ビューをキャプチャするように、スピニング構造上に取り付けられてよい。他の例では、距離測定システム1000は、照明器1002およびセンサー1004が特定の範囲内の(たとえば、360度までの)物体を検出することを可能にする1つまたは複数の光学構成要素(たとえば、ミラー、コリメータ、回折格子など)を含んでよい。図10の例は単一の照明器1002およびセンサー1004しか示さないが、距離測定システム1000は、照明器およびセンサーの複数のセットを含んでよい。
いくつかの例では、照明器1002は構造化照明パターンを生成する。そのような例では、距離測定システム1000は、構造化照明パターンのそれぞれの画像がその上に形成される複数のセンサー1004を含んでよい。距離測定システム1000は、構造化照明パターンがそこから後方散乱する物体1008までの距離を決定するために、構造化照明パターンの画像の間の視差を使用してよい。構造化照明ベースの距離測定システムは、物体1008が比較的センサー1004の近く(たとえば、0.2メートル~2メートル)にあるとき、高レベルの確度(たとえば、サブミリメートル範囲の中の確度)を有してよい。この高レベルの確度は、モバイルデバイス(たとえば、モバイルフォン、タブレットコンピュータなど)をロック解除することなどの顔認識適用例において、またセキュリティ適用例のために有用であり得る。
いくつかの例では、距離測定システム1000は飛行時間(ToF:time of flight)ベースのシステムである。距離測定システム1000がToFベースのシステムであるいくつかの例では、照明器1002は光のパルスを生成する。言い換えれば、照明器1002は放射光線1006の振幅を変調し得る。そのような例では、センサー1004は、照明器1002によって生成される光線1006のパルスからの回帰光線1010を検出する。距離測定システム1000は、次いで、光線1006が放射された時と検出された時との間の遅延、および空気中での知られている光速に基づいて、光線1006がそこから後方散乱する物体1008までの距離を決定し得る。いくつかの例では、放射光線1006の振幅を変調するのではなく(または、それに加えて)、照明器1002は放射光線1006の位相を変調してよい。そのような例では、センサー1004は、物体1008からの回帰光線1010の位相を検出してよく、光速を使用して、かつ照明器1002が特定の位相における光線1006を生成した時とセンサー1004がその特定の位相における回帰光線1010を検出した時との間の時間差に基づいて、物体1008上の点までの距離を決定してよい。
他の例では、点群は、照明器1002を使用せずに生成されてよい。たとえば、いくつかの例では、距離測定システム1000のセンサー1004は、2つ以上の光学カメラを含んでよい。そのような例では、距離測定システム1000は、光学カメラを使用して、物体1008を含む環境のステレオ画像をキャプチャしてよい。距離測定システム1000(たとえば、点群生成器1020)は、次いで、ステレオ画像の中のロケーション間の視差を計算し得る。距離測定システム1000は、次いで、視差を使用して、ステレオ画像の中に示されるロケーションまでの距離を決定し得る。これらの距離から、点群生成器1020は点群を生成し得る。
センサー1004はまた、色情報および反射率情報などの、物体1008の他の属性を検出してもよい。図10の例では、点群生成器1020は、センサー1004によって生成される信号1018に基づいて点群を生成し得る。距離測定システム1000および/または点群生成器1020は、データソース104(図1)の一部を形成し得る。
図11は、本開示の1つまたは複数の技法が使用され得る例示的な車両ベースシナリオを示す概念図である。図11の例では、車両1100は、LIDARシステムなどのレーザーパッケージ1102を含む。図11の例では図示されないが、車両1100はまた、データソース、およびG-PCCエンコーダ200(図1)などのG-PCCエンコーダを含んでもよい。図11の例では、レーザーパッケージ1102は、道路における歩行者1106または他の物体から反射するレーザービーム1104を放射する。車両1100のデータソースは、レーザーパッケージ1102によって生成される信号に基づいて点群を生成し得る。車両1100のG-PCCエンコーダは、点群を符号化してビットストリーム1108を生成し得る。ビットストリーム1108は、G-PCCエンコーダによって取得される符号化されていない点群よりもはるかに少ないビットを含んでよい。車両1100の出力インターフェース(たとえば、出力インターフェース108(図1))は、ビットストリーム1108を1つまたは複数の他のデバイスへ送信し得る。したがって、車両1100は、符号化されていない点群データよりも迅速にビットストリーム1108を他のデバイスへ送信できる場合がある。追加として、ビットストリーム1108は、もっと少ないデータ記憶容量しか必要としない場合がある。
図11の例では、車両1100は、ビットストリーム1108を別の車両1110へ送信し得る。車両1110は、G-PCCデコーダ300(図1)などのG-PCCデコーダを含んでよい。車両1110のG-PCCデコーダは、ビットストリーム1108を復号して点群を再構成し得る。車両1110は、再構成された点群を様々な目的のために使用してよい。たとえば、車両1110は、歩行者1106が車両1100の前方の道路にいることを、再構成された点群に基づいて決定してよく、したがって、たとえば、歩行者1106が道路にいることを車両1110の運転手が了解する前でさえ、減速し始めてよい。したがって、いくつかの例では、車両1110は、再構成された点群に基づいて、自律ナビゲーション動作を実行してよく、通知もしくは警報を生成してよく、または別のアクションを実行してもよい。
追加または代替として、車両1100は、ビットストリーム1108をサーバシステム1112へ送信してよい。サーバシステム1112は、ビットストリーム1108を様々な目的のために使用してよい。たとえば、サーバシステム1112は、点群の後続の再構成のためにビットストリーム1108を記憶してよい。この例では、サーバシステム1112は、他のデータ(たとえば、車両1100によって生成される車両遠隔測定データ)と一緒に点群を使用して自律運転システムをトレーニングしてよい。他の例では、サーバシステム1112は、(たとえば、車両1100が歩行者1106と衝突する場合)科学捜査の衝突調査用の後続の再構成のためにビットストリーム1108を記憶してよく、またはナビゲーションのための通知もしくは命令を車両1100もしくは車両1110へ送信してもよい。
図12は、本開示の1つまたは複数の技法が使用され得る例示的な拡張現実システムを示す概念図である。拡張(extended)現実(XR)は、拡張(augmented)現実(AR)、複合現実(MR)、および仮想現実(VR)を含む技術の範囲をカバーするために使用される用語である。図12の例では、第1のロケーション1202に第1のユーザ1200が位置する。ユーザ1200はXRヘッドセット1204を装着している。XRヘッドセット1204の代替として、ユーザ1200は、モバイルデバイス(たとえば、モバイルフォン、タブレットコンピュータなど)を使用してもよい。XRヘッドセット1204は、第1のロケーション1202における物体1206上の点の位置を検出する、LIDARシステムなどの深度検出センサーを含む。XRヘッドセット1204のデータソースは、深度検出センサーによって生成された信号を使用してロケーション1202における物体1206の点群表現を生成し得る。XRヘッドセット1204は、点群を符号化してビットストリーム1208を生成するように構成されるG-PCCエンコーダ(たとえば、図1のG-PCCエンコーダ200)を含んでよい。
XRヘッドセット1204は、第2のロケーション1214におけるユーザ1212によって装着されるXRヘッドセット1210へビットストリーム1208を(たとえば、インターネットなどのネットワークを介して)送信し得る。XRヘッドセット1210は、ビットストリーム1208を復号して点群を再構成し得る。XRヘッドセット1210は、点群を使用して、ロケーション1202における物体1206を表すXR視覚化(たとえば、AR、MR、VR視覚化)を生成し得る。したがって、XRヘッドセット1210がVR視覚化を生成するときなどの、いくつかの例では、ロケーション1214におけるユーザ1212がロケーション1202の3D没入体験を有してよい。いくつかの例では、XRヘッドセット1210は、再構成された点群に基づいて仮想オブジェクトの位置を決定し得る。たとえば、XRヘッドセット1210は、環境(たとえば、ロケーション1202)が平坦な表面を含むことを、再構成された点群に基づいて決定してよく、次いで、平坦な表面上に仮想オブジェクト(たとえば、アニメキャラクタ)が配置されるべきであると決定してよい。XRヘッドセット1210は、決定された位置に仮想オブジェクトがある、XR視覚化を生成し得る。たとえば、XRヘッドセット1210は、平坦な表面の上にアニメキャラクタが座っているのを見せてよい。
図13は、本開示の1つまたは複数の技法が使用され得る例示的なモバイルデバイスシステムを示す概念図である。図13の例では、モバイルフォンまたはタブレットコンピュータなどのモバイルデバイス1300は、モバイルデバイス1300の環境の中の物体1302上の点の位置を検出する、LIDARシステムなどの深度検出センサーを含む。モバイルデバイス1300のデータソースは、深度検出センサーによって生成された信号を使用して物体1302の点群表現を生成し得る。モバイルデバイス1300は、点群を符号化してビットストリーム1304を生成するように構成されるG-PCCエンコーダ(たとえば、図1のG-PCCエンコーダ200)を含んでよい。図13の例では、モバイルデバイス1300は、サーバシステムまたは他のモバイルデバイスなどのリモートデバイス1306へビットストリームを送信し得る。リモートデバイス1306は、ビットストリーム1304を復号して点群を再構成し得る。リモートデバイス1306は、点群を様々な目的のために使用してよい。たとえば、リモートデバイス1306は、点群を使用してモバイルデバイス1300の環境の地図を生成してよい。たとえば、リモートデバイス1306は、再構成された点群に基づいて建物の内部の地図を生成し得る。別の例では、リモートデバイス1306は、点群に基づいて像(たとえば、コンピュータグラフィックス)を生成し得る。たとえば、リモートデバイス1306は、多角形の頂点として点群の点を使用してよく、その多角形に影を付けるための基礎として点の色属性を使用してよい。いくつかの例では、リモートデバイス1306は、点群を使用して顔認識を実行し得る。
以下の番号付き条項は、本開示で説明するデバイスおよび技法の1つまたは複数の態様を例示する。
条項1A. 点群データを処理する方法であって、方法は、点群を表すデータを受信することと、点群を生成するための本開示のいずれか1つまたは複数の技法に従って、点群を表すデータを処理することとを備える。
条項2A. 点群を処理するためのデバイスであって、デバイスは、点群を表すデータを受信し、点群を生成するための本開示のいずれか1つまたは複数の技法に従って、点群を表すデータを処理するための、1つまたは複数の手段を備える。
条項3A. 条項1Aの方法または条項2Aのデバイスであって、点群を生成するための本開示のいずれか1つまたは複数の技法に従って、点群を表すデータを処理することは、全体的にまたは部分的にのいずれかで角度モードを無効化することを備える。
条項4A. 条項3Aのデバイスであって、1つまたは複数の手段は、回路構成の中に実装される1つまたは複数のプロセッサを備える。
条項5A. 条項2A~4Aのうちのいずれかのデバイスであって、点群を表すデータを記憶するためのメモリをさらに備える。
条項6A. 条項2A~5Aのうちのいずれかのデバイスであって、デバイスはデコーダを備える。
条項7A. 条項2A~5Aのうちのいずれかのデバイスであって、デバイスはエンコーダを備える。
条項8A. 条項2A~7Aのうちのいずれかのデバイスであって、点群を生成するためのデバイスをさらに備える。
条項9A. 条項2A~8Aのうちのいずれかのデバイスであって、点群に基づいて像を提示するためのディスプレイをさらに備える。
条項10A. 命令を記憶したコンピュータ可読記憶媒体であって、命令は、実行されたとき、1つまたは複数のプロセッサに、点群を表すデータを受信させ、点群を生成するための本開示のいずれか1つまたは複数の技法に従って、点群を表すデータを処理させる。
条項1B. 点群データを含むビットストリームを復号するためのデバイスであって、デバイスは、点群データを記憶するためのメモリと、メモリに結合され回路構成の中に実装される1つまたは複数のプロセッサとを備え、1つまたは複数のプロセッサは、ノードに対してツリー内量子化が有効化されることを、ビットストリームの中でシグナリングされるシンタックスに基づいて決定し、ノードに対して角度モードがアクティブ化されることを、ビットストリームの中でシグナリングされるシンタックスに基づいてノードに対して決定し、ノードに対してツリー内量子化が有効化されることに応答して、原点位置に対する座標位置を表す量子化された値をノードに対して決定し、原点位置に対する座標位置を表すスケーリングされた値を決定するために、量子化された値をクリッピングを用いずにスケーリングし、原点位置に対する座標位置を表すスケーリングされた値に基づいて、角度モードのための平面位置シンタックス要素をコンテキスト復号するためのコンテキストを決定するように構成される。
条項2B. 条項1Bのデバイスであって、原点位置に対する座標位置を表すスケーリングされた値に基づいて、角度モードのための平面位置シンタックス要素をコンテキスト復号するためのコンテキストを決定するために、1つまたは複数のプロセッサは、スケーリングされた値および原点位置に基づいて1つまたは複数のレーザー特性を決定し、レーザー特性に基づいて角度モードのための平面位置シンタックス要素を復号するように構成される。
条項3B. 条項2Bのデバイスであって、原点位置に対する座標位置を表すスケーリングされた値に基づいて、角度モードのための平面位置シンタックス要素をコンテキスト復号するためのコンテキストを決定するために、1つまたは複数のプロセッサは、決定された1つまたは複数のレーザー特性を有するレーザービームが、第1の距離しきい値の上方にあるのか、第1の距離しきい値と第2の距離しきい値との間にあるのか、第2の距離しきい値と第3の距離しきい値との間にあるのか、それとも第3の距離しきい値の下方にあるのかに基づいて、コンテキストインデックスを決定するようにさらに構成される。
条項4B. 条項2Bのデバイスであって、平面位置シンタックス要素は垂直面位置を示す。
条項5B. 条項2Bのデバイスであって、1つまたは複数のレーザー特性は、レーザーの仰角、レーザーヘッドオフセット、または方位を含む。
条項6B. 条項1Bのデバイスであって、1つまたは複数のプロセッサは、決定されたコンテキストによって示されるコンテキストを使用して角度モードの平面位置を算術的に復号するようにさらに構成される。
条項7B. 条項1Bのデバイスであって、原点位置に対する座標位置を表すスケーリングされた値を決定するために、量子化された値をクリッピングを用いずにスケーリングするために、1つまたは複数のプロセッサは、最上位ビット(MSB)のグループおよび最下位ビット(LSB)のグループを決定し、スケーリングされたLSBを決定するために、クリッピングを用いずにLSBをスケーリングし、原点位置に対する座標位置を表すスケーリングされた値を決定するために、スケーリングされたLSBをMSBに追加するように構成される。
条項8B. 条項7Bのデバイスであって、原点位置に対する座標位置を表すスケーリングされた値を決定するために、量子化された値をクリッピングを用いずにスケーリングするために、1つまたは複数のプロセッサは、ノードのための量子化パラメータに基づいてMSBに対するシフト量を決定し、シフト量に基づいてMSBをシフトし、原点位置に対する座標位置を表すスケーリングされた値を決定するために、スケーリングされたLSBをシフトされたMSBに追加するように構成される。
条項9B. 条項6Bのデバイスであって、1つまたは複数のプロセッサは、LSBのグループの中のビット数の表示を、ビットストリームの中でシグナリングされるシンタックスの中で受信するようにさらに構成される。
条項10B. 条項1Bのデバイスであって、1つまたは複数のプロセッサは、点群を再構成するようにさらに構成される。
条項11B. 条項10Bのデバイスであって、1つまたは複数のプロセッサは、点群を再構成することの一部として、平面位置に基づいて点群の1つまたは複数の点の位置を決定するように構成される。
条項12B. 条項11Bのデバイスであって、1つまたは複数のプロセッサは、再構成された点群に基づいて建物の内部の地図を生成するようにさらに構成される。
条項13B. 条項11Bのデバイスであって、1つまたは複数のプロセッサは、再構成された点群に基づいて自律ナビゲーション動作を実行するようにさらに構成される。
条項14B. 条項11Bのデバイスであって、1つまたは複数のプロセッサは、再構成された点群に基づいてコンピュータグラフィックスを生成するようにさらに構成される。
条項15B. 条項11Bのデバイスであって、1つまたは複数のプロセッサは、再構成された点群に基づいて仮想オブジェクトの位置を決定し、決定された位置に仮想オブジェクトがある、拡張現実(XR)視覚化を生成するように構成される。
条項16B. 条項11Bのデバイスであって、再構成された点群に基づいて像を提示するためのディスプレイをさらに備える。
条項17B. 条項1Bのデバイスであって、デバイスは、モバイルフォンまたはタブレットコンピュータのうちの1つである。
条項18B. 条項1Bのデバイスであって、デバイスは車両である。
条項19B. 条項1Bのデバイスであって、デバイスは拡張現実デバイスである。
条項20B. 点群データを含むビットストリームを復号するための方法であって、方法は、ノードに対してツリー内量子化が有効化されることを、ビットストリームの中でシグナリングされるシンタックスに基づいて決定することと、ノードに対して角度モードがアクティブ化されることを、ビットストリームの中でシグナリングされるシンタックスに基づいてノードに対して決定することと、ノードに対してツリー内量子化が有効化されることに応答して、原点位置に対する座標位置を表す量子化された値をノードに対して決定することと、原点位置に対する座標位置を表すスケーリングされた値を決定するために、量子化された値をクリッピングを用いずにスケーリングすることと、原点位置に対する座標位置を表すスケーリングされた値に基づいて、角度モードのための平面位置シンタックス要素をコンテキスト復号するためのコンテキストを決定することとを備える。
条項21B. 条項20Bの方法であって、原点位置に対する座標位置を表すスケーリングされた値に基づいて、角度モードのための平面位置シンタックス要素をコンテキスト復号するためのコンテキストを決定することは、スケーリングされた値および原点位置に基づいて1つまたは複数のレーザー特性を決定することと、レーザー特性に基づいて角度モードのための平面位置シンタックス要素を復号することとを備える。
条項22B. 条項21Bの方法であって、原点位置に対する座標位置を表すスケーリングされた値に基づいて、角度モードのための平面位置シンタックス要素をコンテキスト復号するためのコンテキストを決定することは、決定された1つまたは複数のレーザー特性を有するレーザービームが、第1の距離しきい値の上方にあるのか、第1の距離しきい値と第2の距離しきい値との間にあるのか、第2の距離しきい値と第3の距離しきい値との間にあるのか、それとも第3の距離しきい値の下方にあるのかに基づいて、コンテキストインデックスを決定することをさらに備える。
条項23B. 条項21Bの方法であって、平面位置シンタックス要素は垂直面位置を示す。
条項24B. 条項21Bの方法であって、1つまたは複数のレーザー特性は、レーザーの仰角、レーザーヘッドオフセット、または方位を含む。
条項25B. 条項20Bの方法であって、決定されたコンテキストによって示されるコンテキストを使用して角度モードの平面位置を算術的に復号することをさらに備える。
条項26B. 条項20Bの方法であって、原点位置に対する座標位置を表すスケーリングされた値を決定するために、量子化された値をクリッピングを用いずにスケーリングすることは、最上位ビット(MSB)のグループおよび最下位ビット(LSB)のグループを決定することと、スケーリングされたLSBを決定するために、クリッピングを用いずにLSBをスケーリングすることと、原点位置に対する座標位置を表すスケーリングされた値を決定するために、スケーリングされたLSBをMSBに追加することとを備える。
条項27B. 条項26Bの方法であって、原点位置に対する座標位置を表すスケーリングされた値を決定するために、量子化された値をクリッピングを用いずにスケーリングすることは、ノードのための量子化パラメータに基づいてMSBに対するシフト量を決定することと、シフト量に基づいてMSBをシフトすることと、原点位置に対する座標位置を表すスケーリングされた値を決定するために、スケーリングされたLSBをシフトされたMSBに追加することとを備える。
条項28B. 条項25Bの方法であって、LSBのグループの中のビット数の表示を、ビットストリームの中でシグナリングされるシンタックスの中で受信することをさらに備える。
条項29B. 条項20Bの方法であって、点群を再構成することをさらに備える。
条項30B. 条項29Bの方法であって、点群を再構成することは、平面位置に基づいて点群の1つまたは複数の点の位置を決定することを備える。
条項31B. 条項29Bの方法であって、再構成された点群に基づいて建物の内部の地図を生成することをさらに備える。
条項32B. 条項29Bの方法であって、再構成された点群に基づいて自律ナビゲーション動作を実行することをさらに備える。
条項33B. 条項29Bの方法であって、再構成された点群に基づいてコンピュータグラフィックスを生成することをさらに備える。
条項34B. 条項29Bの方法であって、再構成された点群に基づいて仮想オブジェクトの位置を決定することと、決定された位置に仮想オブジェクトがある、拡張現実(XR)視覚化を生成することとをさらに備える。
条項35B. 点群データを含むビットストリームを符号化するためのデバイスであって、デバイスは、点群データを記憶するためのメモリと、メモリに結合され回路構成の中に実装される1つまたは複数のプロセッサとを備え、1つまたは複数のプロセッサは、ノードに対してツリー内量子化が有効化されることを決定し、ノードに対して角度モードがアクティブ化されることを決定し、ノードに対してツリー内量子化が有効化されることに応答して、原点位置に対する座標位置を表す量子化された値をノードに対して決定し、原点位置に対する座標位置を表すスケーリングされた値を決定するために、量子化された値をクリッピングを用いずにスケーリングし、原点位置に対する座標位置を表すスケーリングされた値に基づいて、角度モードのための平面位置シンタックス要素をコンテキスト符号化するためのコンテキストを決定するように構成される。
条項36B. 条項35Bのデバイスであって、原点位置に対する座標位置を表すスケーリングされた値に基づいて、角度モードのための平面位置シンタックス要素をコンテキスト符号化するためのコンテキストを決定するために、1つまたは複数のプロセッサは、スケーリングされた値および原点位置に基づいて1つまたは複数のレーザー特性を決定し、レーザー特性に基づいて角度モードのための平面位置シンタックス要素を復号するように構成される。
条項37B. 条項36Bのデバイスであって、原点位置に対する座標位置を表すスケーリングされた値に基づいて、角度モードのための平面位置シンタックス要素をコンテキスト符号化するためのコンテキストを決定するために、1つまたは複数のプロセッサは、決定された1つまたは複数のレーザー特性を有するレーザービームが、第1の距離しきい値の上方にあるのか、第1の距離しきい値と第2の距離しきい値との間にあるのか、第2の距離しきい値と第3の距離しきい値との間にあるのか、それとも第3の距離しきい値の下方にあるのかに基づいて、コンテキストインデックスを決定するようにさらに構成される。
条項38B. 条項36Bのデバイスであって、平面位置シンタックス要素は垂直面位置を示す。
条項39B. 条項36Bのデバイスであって、1つまたは複数のレーザー特性は、レーザーの仰角、レーザーヘッドオフセット、または方位を含む。
条項40B. 条項35Bのデバイスであって、1つまたは複数のプロセッサは、決定されたコンテキストによって示されるコンテキストを使用して角度モードの平面位置を算術的に符号化するようにさらに構成される。
条項41B. 条項35Bのデバイスであって、原点位置に対する座標位置を表すスケーリングされた値を決定するために、量子化された値をクリッピングを用いずにスケーリングするために、1つまたは複数のプロセッサは、最上位ビット(MSB)のグループおよび最下位ビット(LSB)のグループを決定し、スケーリングされたLSBを決定するために、クリッピングを用いずにLSBをスケーリングし、原点位置に対する座標位置を表すスケーリングされた値を決定するために、スケーリングされたLSBをMSBに追加するように構成される。
条項42B. 条項41Bのデバイスであって、原点位置に対する座標位置を表すスケーリングされた値を決定するために、量子化された値をクリッピングを用いずにスケーリングするために、1つまたは複数のプロセッサは、ノードのための量子化パラメータに基づいてMSBに対するシフト量を決定し、シフト量に基づいてMSBをシフトし、原点位置に対する座標位置を表すスケーリングされた値を決定するために、スケーリングされたLSBをシフトされたMSBに追加するように構成される。
条項43B. 条項35Bのデバイスであって、1つまたは複数のプロセッサは、点群を再構成するようにさらに構成される。
条項44B. 条項35Bのデバイスであって、点群を再構成するために、1つまたは複数のプロセッサは、平面位置に基づいて点群の1つまたは複数の点の位置を決定するようにさらに構成される。
条項45B. 条項35Bのデバイスであって、デバイスは、モバイルフォンまたはタブレットコンピュータのうちの1つである。
条項46B. 条項35Bのデバイスであって、デバイスは車両である。
条項47B. 条項35Bのデバイスであって、デバイスは拡張現実デバイスである。
条項48B. 点群データを含むビットストリームを符号化するための方法であって、方法は、ノードに対してツリー内量子化が有効化されることを決定することと、ノードに対して角度モードがアクティブ化されることを決定することと、ノードに対してツリー内量子化が有効化されることに応答して、原点位置に対する座標位置を表す量子化された値をノードに対して決定することと、原点位置に対する座標位置を表すスケーリングされた値を決定するために、量子化された値をクリッピングを用いずにスケーリングすることと、原点位置に対する座標位置を表すスケーリングされた値に基づいて、角度モードのための平面位置シンタックス要素をコンテキスト符号化するためのコンテキストを決定することとを備える。
条項49B. 条項48Bの方法であって、原点位置に対する座標位置を表すスケーリングされた値に基づいて、角度モードのための平面位置シンタックス要素をコンテキスト符号化するためのコンテキストを決定することは、スケーリングされた値および原点位置に基づいて1つまたは複数のレーザー特性を決定することと、レーザー特性に基づいて角度モードのための平面位置シンタックス要素を復号することとを備える。
条項50B. 条項49Bの方法であって、原点位置に対する座標位置を表すスケーリングされた値に基づいて、角度モードのための平面位置シンタックス要素をコンテキスト符号化するためのコンテキストを決定することは、決定された1つまたは複数のレーザー特性を有するレーザービームが、第1の距離しきい値の上方にあるのか、第1の距離しきい値と第2の距離しきい値との間にあるのか、第2の距離しきい値と第3の距離しきい値との間にあるのか、それとも第3の距離しきい値の下方にあるのかに基づいて、コンテキストインデックスを決定することをさらに備える。
条項51B. 条項49Bの方法であって、平面位置シンタックス要素は垂直面位置を示す。
条項52B. 条項49Bの方法であって、1つまたは複数のレーザー特性は、レーザーの仰角、レーザーヘッドオフセット、または方位を含む。
条項53B. 条項48Bの方法であって、決定されたコンテキストによって示されるコンテキストを使用して角度モードの平面位置を算術的に符号化することをさらに備える。
条項54B. 条項48Bの方法であって、原点位置に対する座標位置を表すスケーリングされた値を決定するために、量子化された値をクリッピングを用いずにスケーリングすることは、最上位ビット(MSB)のグループおよび最下位ビット(LSB)のグループを決定することと、スケーリングされたLSBを決定するために、クリッピングを用いずにLSBをスケーリングすることと、原点位置に対する座標位置を表すスケーリングされた値を決定するために、スケーリングされたLSBをMSBに追加することとを備える。
条項55B. 条項54Bの方法であって、原点位置に対する座標位置を表すスケーリングされた値を決定するために、量子化された値をクリッピングを用いずにスケーリングすることは、ノードのための量子化パラメータに基づいてMSBに対するシフト量を決定することと、シフト量に基づいてMSBをシフトすることと、原点位置に対する座標位置を表すスケーリングされた値を決定するために、スケーリングされたLSBをシフトされたMSBに追加することとを備える。
条項56B. 条項48Bの方法であって、点群を再構成することをさらに備える。
条項57B. 条項56Bの方法であって、点群を再構成することは、平面位置に基づいて点群の1つまたは複数の点の位置を決定することを備える。
条項58B. 命令を記憶するコンピュータ可読記憶媒体であって、命令は、1つまたは複数のプロセッサによって実行されたとき、1つまたは複数のプロセッサに、ノードに対してツリー内量子化が有効化されることを、ビットストリームの中でシグナリングされるシンタックスに基づいて決定させ、ノードに対して角度モードがアクティブ化されることを、ビットストリームの中でシグナリングされるシンタックスに基づいてノードに対して決定させ、ノードに対してツリー内量子化が有効化されることに応答して、原点位置に対する座標位置を表す量子化された値をノードに対して決定させ、原点位置に対する座標位置を表すスケーリングされた値を決定するために、量子化された値をクリッピングを用いずにスケーリングさせ、原点位置に対する座標位置を表すスケーリングされた値に基づいて、角度モードのための平面位置シンタックス要素をコンテキスト復号するためのコンテキストを決定させる。
条項59B. 点群データを含むビットストリームを復号するためのデバイスであって、デバイスは、ノードに対してツリー内量子化が有効化されることを、ビットストリームの中でシグナリングされるシンタックスに基づいて決定するための手段と、ノードに対して角度モードがアクティブ化されることを、ビットストリームの中でシグナリングされるシンタックスに基づいてノードに対して決定するための手段と、ノードに対してツリー内量子化が有効化されることに応答して、原点位置に対する座標位置を表す量子化された値をノードに対して決定するための手段と、原点位置に対する座標位置を表すスケーリングされた値を決定するために、量子化された値をクリッピングを用いずにスケーリングするための手段と、原点位置に対する座標位置を表すスケーリングされた値に基づいて、角度モードのための平面位置シンタックス要素をコンテキスト復号するためのコンテキストを決定するための手段とを備える。
条項1C. 点群データを含むビットストリームを復号するためのデバイスであって、デバイスは、点群データを記憶するためのメモリと、メモリに結合され回路構成の中に実装される1つまたは複数のプロセッサとを備え、1つまたは複数のプロセッサは、ノードに対してツリー内量子化が有効化されることを、ビットストリームの中でシグナリングされるシンタックスに基づいて決定し、ノードに対して角度モードがアクティブ化されることを、ビットストリームの中でシグナリングされるシンタックスに基づいてノードに対して決定し、ノードに対してツリー内量子化が有効化されることに応答して、原点位置に対する座標位置を表す量子化された値をノードに対して決定し、原点位置に対する座標位置を表すスケーリングされた値を決定するために、量子化された値をクリッピングを用いずにスケーリングし、原点位置に対する座標位置を表すスケーリングされた値に基づいて、角度モードのための平面位置シンタックス要素をコンテキスト復号するためのコンテキストを決定するように構成される。
条項2C. 条項1Cのデバイスであって、原点位置に対する座標位置を表すスケーリングされた値に基づいて、角度モードのための平面位置シンタックス要素をコンテキスト復号するためのコンテキストを決定するために、1つまたは複数のプロセッサは、スケーリングされた値および原点位置に基づいて1つまたは複数のレーザー特性を決定し、レーザー特性に基づいて角度モードのための平面位置シンタックス要素を復号するように構成される。
条項3C. 条項2Cのデバイスであって、原点位置に対する座標位置を表すスケーリングされた値に基づいて、角度モードのための平面位置シンタックス要素をコンテキスト復号するためのコンテキストを決定するために、1つまたは複数のプロセッサは、決定された1つまたは複数のレーザー特性を有するレーザービームが、第1の距離しきい値の上方にあるのか、第1の距離しきい値と第2の距離しきい値との間にあるのか、第2の距離しきい値と第3の距離しきい値との間にあるのか、それとも第3の距離しきい値の下方にあるのかに基づいて、コンテキストインデックスを決定するようにさらに構成される。
条項4C. 条項1C~3Cのうちのいずれかのデバイスであって、平面位置シンタックス要素は垂直面位置を示す。
条項5C. 条項2C~4Cのうちのいずれかのデバイスであって、1つまたは複数のレーザー特性は、レーザーの仰角、レーザーヘッドオフセット、または方位を含む。
条項6C. 条項1C~5Cのうちのいずれかのデバイスであって、1つまたは複数のプロセッサは、決定されたコンテキストによって示されるコンテキストを使用して角度モードの平面位置を算術的に復号するようにさらに構成される。
条項7C. 条項1C~6Cのうちのいずれかのデバイスであって、原点位置に対する座標位置を表すスケーリングされた値を決定するために、量子化された値をクリッピングを用いずにスケーリングするために、1つまたは複数のプロセッサは、最上位ビット(MSB)のグループおよび最下位ビット(LSB)のグループを決定し、スケーリングされたLSBを決定するために、クリッピングを用いずにLSBをスケーリングし、原点位置に対する座標位置を表すスケーリングされた値を決定するために、スケーリングされたLSBをMSBに追加するように構成される。
条項8C. 条項7Cのデバイスであって、原点位置に対する座標位置を表すスケーリングされた値を決定するために、量子化された値をクリッピングを用いずにスケーリングするために、1つまたは複数のプロセッサは、ノードのための量子化パラメータに基づいてMSBに対するシフト量を決定し、シフト量に基づいてMSBをシフトし、原点位置に対する座標位置を表すスケーリングされた値を決定するために、スケーリングされたLSBをシフトされたMSBに追加するように構成される。
条項9C. 条項6C~8Cのうちのいずれかのデバイスであって、1つまたは複数のプロセッサは、LSBのグループの中のビット数の表示を、ビットストリームの中でシグナリングされるシンタックスの中で受信するようにさらに構成される。
条項10C. 条項1C~9Cのうちのいずれかのデバイスであって、1つまたは複数のプロセッサは、点群を再構成するようにさらに構成される。
条項11C. 条項10Cのデバイスであって、1つまたは複数のプロセッサは、点群を再構成することの一部として、平面位置に基づいて点群の1つまたは複数の点の位置を決定するように構成される。
条項12C. 条項11Cのデバイスであって、1つまたは複数のプロセッサは、再構成された点群に基づいて建物の内部の地図を生成するようにさらに構成される。
条項13C. 条項11Cのデバイスであって、1つまたは複数のプロセッサは、再構成された点群に基づいて自律ナビゲーション動作を実行するようにさらに構成される。
条項14C. 条項11Cのデバイスであって、1つまたは複数のプロセッサは、再構成された点群に基づいてコンピュータグラフィックスを生成するようにさらに構成される。
条項15C. 条項11Cのデバイスであって、1つまたは複数のプロセッサは、再構成された点群に基づいて仮想オブジェクトの位置を決定し、決定された位置に仮想オブジェクトがある、拡張現実(XR)視覚化を生成するように構成される。
条項16C. 条項11C~15Cのうちのいずれかのデバイスであって、再構成された点群に基づいて像を提示するためのディスプレイをさらに備える。
条項17C. 条項1C~16Cのうちのいずれかのデバイスであって、デバイスは、モバイルフォンまたはタブレットコンピュータのうちの1つである。
条項18C. 条項1C~16Cのうちのいずれかのデバイスであって、デバイスは車両である。
条項19C. 条項1C~16Cのうちのいずれかのデバイスであって、デバイスは拡張現実デバイスである。
条項20C. 点群データを含むビットストリームを復号するための方法であって、方法は、ノードに対してツリー内量子化が有効化されることを、ビットストリームの中でシグナリングされるシンタックスに基づいて決定することと、ノードに対して角度モードがアクティブ化されることを、ビットストリームの中でシグナリングされるシンタックスに基づいてノードに対して決定することと、ノードに対してツリー内量子化が有効化されることに応答して、原点位置に対する座標位置を表す量子化された値をノードに対して決定することと、原点位置に対する座標位置を表すスケーリングされた値を決定するために、量子化された値をクリッピングを用いずにスケーリングすることと、原点位置に対する座標位置を表すスケーリングされた値に基づいて、角度モードのための平面位置シンタックス要素をコンテキスト復号するためのコンテキストを決定することとを備える。
条項21C. 条項20Cの方法であって、原点位置に対する座標位置を表すスケーリングされた値に基づいて、角度モードのための平面位置シンタックス要素をコンテキスト復号するためのコンテキストを決定することは、スケーリングされた値および原点位置に基づいて1つまたは複数のレーザー特性を決定することと、レーザー特性に基づいて角度モードのための平面位置シンタックス要素を復号することとを備える。
条項22C. 条項21Cの方法であって、原点位置に対する座標位置を表すスケーリングされた値に基づいて、角度モードのための平面位置シンタックス要素をコンテキスト復号するためのコンテキストを決定することは、決定された1つまたは複数のレーザー特性を有するレーザービームが、第1の距離しきい値の上方にあるのか、第1の距離しきい値と第2の距離しきい値との間にあるのか、第2の距離しきい値と第3の距離しきい値との間にあるのか、それとも第3の距離しきい値の下方にあるのかに基づいて、コンテキストインデックスを決定することをさらに備える。
条項23C. 条項20C~22Cのうちのいずれかの方法であって、平面位置シンタックス要素は垂直面位置を示す。
条項24C. 条項21C~23Cのうちのいずれかの方法であって、1つまたは複数のレーザー特性は、レーザーの仰角、レーザーヘッドオフセット、または方位を含む。
条項25C. 条項20C~24Cのうちのいずれかの方法であって、決定されたコンテキストによって示されるコンテキストを使用して角度モードの平面位置を算術的に復号することをさらに備える。
条項26C. 条項20C~25Cのうちのいずれかの方法であって、原点位置に対する座標位置を表すスケーリングされた値を決定するために、量子化された値をクリッピングを用いずにスケーリングすることは、最上位ビット(MSB)のグループおよび最下位ビット(LSB)のグループを決定することと、スケーリングされたLSBを決定するために、クリッピングを用いずにLSBをスケーリングすることと、原点位置に対する座標位置を表すスケーリングされた値を決定するために、スケーリングされたLSBをMSBに追加することとを備える。
条項27C. 条項26Cの方法であって、原点位置に対する座標位置を表すスケーリングされた値を決定するために、量子化された値をクリッピングを用いずにスケーリングすることは、ノードのための量子化パラメータに基づいてMSBに対するシフト量を決定することと、シフト量に基づいてMSBをシフトすることと、原点位置に対する座標位置を表すスケーリングされた値を決定するために、スケーリングされたLSBをシフトされたMSBに追加することとを備える。
条項28C. 条項25C~27Cのうちのいずれかの方法であって、LSBのグループの中のビット数の表示を、ビットストリームの中でシグナリングされるシンタックスの中で受信することをさらに備える。
条項29C. 条項20C~28Cのうちのいずれかの方法であって、点群を再構成することをさらに備える。
条項30C. 条項29Cの方法であって、点群を再構成することは、平面位置に基づいて点群の1つまたは複数の点の位置を決定することを備える。
条項31C. 条項29Cの方法であって、再構成された点群に基づいて建物の内部の地図を生成することをさらに備える。
条項32C. 条項29Cの方法であって、再構成された点群に基づいて自律ナビゲーション動作を実行することをさらに備える。
条項33C. 条項29Cの方法であって、再構成された点群に基づいてコンピュータグラフィックスを生成することをさらに備える。
条項34C. 条項29Cの方法であって、再構成された点群に基づいて仮想オブジェクトの位置を決定することと、決定された位置に仮想オブジェクトがある、拡張現実(XR)視覚化を生成することとをさらに備える。
条項35C. 点群データを含むビットストリームを符号化するためのデバイスであって、デバイスは、点群データを記憶するためのメモリと、メモリに結合され回路構成の中に実装される1つまたは複数のプロセッサとを備え、1つまたは複数のプロセッサは、ノードに対してツリー内量子化が有効化されることを決定し、ノードに対して角度モードがアクティブ化されることを決定し、ノードに対してツリー内量子化が有効化されることに応答して、原点位置に対する座標位置を表す量子化された値をノードに対して決定し、原点位置に対する座標位置を表すスケーリングされた値を決定するために、量子化された値をクリッピングを用いずにスケーリングし、原点位置に対する座標位置を表すスケーリングされた値に基づいて、角度モードのための平面位置シンタックス要素をコンテキスト符号化するためのコンテキストを決定するように構成される。
条項36C. 条項35Cのデバイスであって、原点位置に対する座標位置を表すスケーリングされた値に基づいて、角度モードのための平面位置シンタックス要素をコンテキスト符号化するためのコンテキストを決定するために、1つまたは複数のプロセッサは、スケーリングされた値および原点位置に基づいて1つまたは複数のレーザー特性を決定し、レーザー特性に基づいて角度モードのための平面位置シンタックス要素を復号するように構成される。
条項37C. 条項36Cのデバイスであって、原点位置に対する座標位置を表すスケーリングされた値に基づいて、角度モードのための平面位置シンタックス要素をコンテキスト符号化するためのコンテキストを決定するために、1つまたは複数のプロセッサは、決定された1つまたは複数のレーザー特性を有するレーザービームが、第1の距離しきい値の上方にあるのか、第1の距離しきい値と第2の距離しきい値との間にあるのか、第2の距離しきい値と第3の距離しきい値との間にあるのか、それとも第3の距離しきい値の下方にあるのかに基づいて、コンテキストインデックスを決定するようにさらに構成される。
条項38C. 条項35C~37Cのうちのいずれかのデバイスであって、平面位置シンタックス要素は垂直面位置を示す。
条項39C. 条項36C~38Cのうちのいずれかのデバイスであって、1つまたは複数のレーザー特性は、レーザーの仰角、レーザーヘッドオフセット、または方位を含む。
条項40C. 条項35C~39Cのうちのいずれかのデバイスであって、1つまたは複数のプロセッサは、決定されたコンテキストによって示されるコンテキストを使用して角度モードの平面位置を算術的に符号化するようにさらに構成される。
条項41C. 条項35C~40Cのうちのいずれかのデバイスであって、原点位置に対する座標位置を表すスケーリングされた値を決定するために、量子化された値をクリッピングを用いずにスケーリングするために、1つまたは複数のプロセッサは、最上位ビット(MSB)のグループおよび最下位ビット(LSB)のグループを決定し、スケーリングされたLSBを決定するために、クリッピングを用いずにLSBをスケーリングし、原点位置に対する座標位置を表すスケーリングされた値を決定するために、スケーリングされたLSBをMSBに追加するように構成される。
条項42C. 条項41Cのデバイスであって、原点位置に対する座標位置を表すスケーリングされた値を決定するために、量子化された値をクリッピングを用いずにスケーリングするために、1つまたは複数のプロセッサは、ノードのための量子化パラメータに基づいてMSBに対するシフト量を決定し、シフト量に基づいてMSBをシフトし、原点位置に対する座標位置を表すスケーリングされた値を決定するために、スケーリングされたLSBをシフトされたMSBに追加するように構成される。
条項43C. 条項35C~42Cのうちのいずれかのデバイスであって、1つまたは複数のプロセッサは、点群を再構成するようにさらに構成される。
条項44C. 条項35C~43Cのうちのいずれかのデバイスであって、点群を再構成するために、1つまたは複数のプロセッサは、平面位置に基づいて点群の1つまたは複数の点の位置を決定するようにさらに構成される。
条項45C. 条項35C~44Cのうちのいずれかのデバイスであって、デバイスは、モバイルフォンまたはタブレットコンピュータのうちの1つである。
条項46C. 条項35C~44Cのうちのいずれかのデバイスであって、デバイスは車両である。
条項47C. 条項35C~44Cのうちのいずれかのデバイスであって、デバイスは拡張現実デバイスである。
条項48C. 点群データを含むビットストリームを符号化するための方法であって、方法は、ノードに対してツリー内量子化が有効化されることを決定することと、ノードに対して角度モードがアクティブ化されることを決定することと、ノードに対してツリー内量子化が有効化されることに応答して、原点位置に対する座標位置を表す量子化された値をノードに対して決定することと、原点位置に対する座標位置を表すスケーリングされた値を決定するために、量子化された値をクリッピングを用いずにスケーリングすることと、原点位置に対する座標位置を表すスケーリングされた値に基づいて、角度モードのための平面位置シンタックス要素をコンテキスト符号化するためのコンテキストを決定することとを備える。
条項49C. 条項48Cの方法であって、原点位置に対する座標位置を表すスケーリングされた値に基づいて、角度モードのための平面位置シンタックス要素をコンテキスト符号化するためのコンテキストを決定することは、スケーリングされた値および原点位置に基づいて1つまたは複数のレーザー特性を決定することと、レーザー特性に基づいて角度モードのための平面位置シンタックス要素を復号することとを備える。
条項50C. 条項49Cの方法であって、原点位置に対する座標位置を表すスケーリングされた値に基づいて、角度モードのための平面位置シンタックス要素をコンテキスト符号化するためのコンテキストを決定することは、決定された1つまたは複数のレーザー特性を有するレーザービームが、第1の距離しきい値の上方にあるのか、第1の距離しきい値と第2の距離しきい値との間にあるのか、第2の距離しきい値と第3の距離しきい値との間にあるのか、それとも第3の距離しきい値の下方にあるのかに基づいて、コンテキストインデックスを決定することをさらに備える。
条項51C. 条項48C~50Cのうちのいずれかの方法であって、平面位置シンタックス要素は垂直面位置を示す。
条項52C. 条項49C~51Cのうちのいずれかの方法であって、1つまたは複数のレーザー特性は、レーザーの仰角、レーザーヘッドオフセット、または方位を含む。
条項53C. 条項48C~52Cのうちのいずれかの方法であって、決定されたコンテキストによって示されるコンテキストを使用して角度モードの平面位置を算術的に符号化することをさらに備える。
条項54C. 条項48C~53Cのうちのいずれかの方法であって、原点位置に対する座標位置を表すスケーリングされた値を決定するために、量子化された値をクリッピングを用いずにスケーリングすることは、最上位ビット(MSB)のグループおよび最下位ビット(LSB)のグループを決定することと、スケーリングされたLSBを決定するために、クリッピングを用いずにLSBをスケーリングすることと、原点位置に対する座標位置を表すスケーリングされた値を決定するために、スケーリングされたLSBをMSBに追加することとを備える。
条項55C. 条項54Cの方法であって、原点位置に対する座標位置を表すスケーリングされた値を決定するために、量子化された値をクリッピングを用いずにスケーリングすることは、ノードのための量子化パラメータに基づいてMSBに対するシフト量を決定することと、シフト量に基づいてMSBをシフトすることと、原点位置に対する座標位置を表すスケーリングされた値を決定するために、スケーリングされたLSBをシフトされたMSBに追加することとを備える。
条項56C. 条項48C~55Cのうちのいずれかの方法であって、点群を再構成することをさらに備える。
条項57C. 条項56Cの方法であって、点群を再構成することは、平面位置に基づいて点群の1つまたは複数の点の位置を決定することを備える。
例に応じて、本明細書で説明した技法のうちのいずれかのいくつかの行為またはイベントが、異なるシーケンスで実行されることが可能であり、追加、統合、または完全に除外されてよい(たとえば、説明したすべての行為またはイベントが技法の実践にとって必要であるとは限らない)ことを認識されたい。その上、いくつかの例では、行為またはイベントは、連続的にではなく、たとえば、マルチスレッド処理、割込み処理、または複数のプロセッサを通じて並行して実行されてよい。
1つまたは複数の例では、説明した機能は、ハードウェア、ソフトウェア、ファームウェア、またはそれらの任意の組合せで実装されてよい。ソフトウェアで実装される場合、機能は、1つまたは複数の命令またはコードとして、コンピュータ可読媒体上に記憶されてよく、またはコンピュータ可読媒体を介して送信されてよく、ハードウェアベースの処理ユニットによって実行されてよい。コンピュータ可読媒体は、データ記憶媒体などの有形媒体に相当するコンピュータ可読記憶媒体、または、たとえば、通信プロトコルに従って、ある場所から別の場所へのコンピュータプログラムの転送を容易にする任意の媒体を含む通信媒体を含んでよい。このようにして、コンピュータ可読媒体は、一般に、(1)非一時的である有形コンピュータ可読記憶媒体、または(2)信号もしくは搬送波などの通信媒体に相当し得る。データ記憶媒体は、本開示で説明した技法の実装のための命令、コード、および/またはデータ構造を取り出すために、1つもしくは複数のコンピュータまたは1つもしくは複数のプロセッサによってアクセスされ得る、任意の利用可能な媒体であってよい。コンピュータプログラム製品がコンピュータ可読媒体を含んでよい。
限定ではなく例として、そのようなコンピュータ可読記憶媒体は、RAM、ROM、EEPROM、CD-ROMもしくは他の光ディスクストレージ、磁気ディスクストレージもしくは他の磁気記憶デバイス、フラッシュメモリ、または命令もしくはデータ構造の形態の所望のプログラムコードを記憶するために使用され得るとともに、コンピュータによってアクセスされ得る、任意の他の媒体を備えることができる。また、いかなる接続も適切にコンピュータ可読媒体と呼ばれる。たとえば、命令が、同軸ケーブル、光ファイバケーブル、ツイストペア、デジタル加入者回線(DSL)、または赤外線、無線、およびマイクロ波などのワイヤレス技術を使用して、ウェブサイト、サーバ、または他のリモートソースから送信される場合、同軸ケーブル、光ファイバケーブル、ツイストペア、DSL、または赤外線、無線、およびマイクロ波などのワイヤレス技術は、媒体の定義の中に含まれる。しかしながら、コンピュータ可読記憶媒体およびデータ記憶媒体は、接続、搬送波、信号、または他の一時的な媒体を含まず、代わりに非一時的な有形記憶媒体を対象とすることを理解されたい。本明細書で使用するディスク(disk)およびディスク(disc)は、コンパクトディスク(disc)(CD)、レーザーディスク(登録商標)(disc)、光ディスク(disc)、デジタル多用途ディスク(disc)(DVD)、フロッピーディスク(disk)、およびブルーレイディスク(disc)を含み、ここで、ディスク(disk)は、通常、データを磁気的に再生し、ディスク(disc)は、レーザーを用いてデータを光学的に再生する。上記のものの組合せもコンピュータ可読媒体の範囲内に含まれるべきである。
命令は、1つまたは複数のDSP、汎用マイクロプロセッサ、ASIC、FPGA、または他の均等な集積論理回路構成もしくは個別論理回路構成などの、1つまたは複数のプロセッサによって実行され得る。したがって、本明細書で使用する「プロセッサ」および「処理回路構成」という用語は、上記の構造、または本明細書で説明した技法の実装に適した任意の他の構造のうちのいずれかを指すことがある。加えて、いくつかの態様では、本明細書で説明した機能性は、符号化および復号のために構成された専用のハードウェアモジュールおよび/もしくはソフトウェアモジュール内で提供されてよく、または複合コーデックの中に組み込まれてもよい。また、本技法は、1つまたは複数の回路または論理要素で完全に実装され得る。
本開示の技法は、ワイヤレスハンドセット、集積回路(IC)、またはICのセット(たとえば、チップセット)を含む、多種多様なデバイスまたは装置の中に実装され得る。開示する技法を実行するように構成されたデバイスの機能的態様を強調するために、様々な構成要素、モジュール、またはユニットが本開示で説明されるが、それらは必ずしも異なるハードウェアユニットによる実現を必要とするとは限らない。むしろ、上記で説明したように、様々なユニットは、コーデックハードウェアユニットの中で組み合わせられてよく、または好適なソフトウェアおよび/もしくはファームウェアと連携して、上記で説明したような1つもしくは複数のプロセッサを含む、相互動作可能なハードウェアユニットの集合によって提供されてよい。
様々な例が説明されている。これらおよび他の例が以下の特許請求の範囲内に入る。