(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2024022620
(43)【公開日】2024-02-16
(54)【発明の名称】点群復号装置、点群復号方法及びプログラム
(51)【国際特許分類】
G06T 9/40 20060101AFI20240208BHJP
【FI】
G06T9/40
【審査請求】有
【請求項の数】3
【出願形態】OL
(21)【出願番号】P 2023201285
(22)【出願日】2023-11-29
(62)【分割の表示】P 2020061325の分割
【原出願日】2020-03-30
【国等の委託研究の成果に係る記載事項】(出願人による申告)令和元年度、総務省、「多様な用途、環境下での高精細映像の活用に資する次世代映像伝送・通信技術の研究開発」委託事業、産業技術力強化法第17条の適用を受ける特許出願
(71)【出願人】
【識別番号】000208891
【氏名又は名称】KDDI株式会社
(74)【代理人】
【識別番号】110001564
【氏名又は名称】フェリシテ弁理士法人
(72)【発明者】
【氏名】海野 恭平
(72)【発明者】
【氏名】河村 圭
(72)【発明者】
【氏名】内藤 整
(57)【要約】
【課題】分割を行う際の初期ノードのサイズに関して制約を規定できるようにすることで設計を容易にすること。
【解決手段】本発明に係る点群復号装置200は、「Implicit QtBt」を適用するかどうかを制御するフラグを復号するように構成されている幾何情報復号部2010と、「スケーラブルリフティング」を適用するかどうかを制御するフラグを復号するように構成されている属性情報復号部2060とを備え、「Implicit QtBt」が適用される場合には、「スケーラブルリフティング」は適用されないように制約されている。
【選択図】
図2
【特許請求の範囲】
【請求項1】
点群復号装置であって、
「Implicit QtBt」を適用するかどうかを制御するフラグを復号するように構成されている幾何情報復号部と、
「スケーラブルリフティング」を適用するかどうかを制御するフラグを復号するように構成されている属性情報復号部とを備え、
前記「Implicit QtBt」が適用される場合には、前記「スケーラブルリフティング」は適用されないように制約されていることを特徴とする点群復号装置。
【請求項2】
「Implicit QtBt」を適用するかどうかを制御するフラグを復号する工程と、
「スケーラブルリフティング」を適用するかどうかを制御するフラグを復号する工程とを有し、
前記「Implicit QtBt」が適用される場合には、前記「スケーラブルリフティング」は適用されないように制約されていることを特徴とする点群復号方法。
【請求項3】
コンピュータを、点群復号装置として機能させるプログラムであって、
前記点群復号装置は、
「Implicit QtBt」を適用するかどうかを制御するフラグを復号するように構成されている幾何情報復号部と、
「スケーラブルリフティング」を適用するかどうかを制御するフラグを復号するように構成されている属性情報復号部とを備え、
前記「Implicit QtBt」が適用される場合には、前記「スケーラブルリフティング」は適用されないように制約されていることを特徴とするプログラム。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、点群復号装置、点群復号方法及びプログラムに関する。
【背景技術】
【0002】
非特許文献1及び2には、8分木分割、4分木分割及び2分木分割を再帰的に行うことで、点群の位置情報を復号する技術が開示されている。
【先行技術文献】
【非特許文献】
【0003】
【非特許文献1】[G-PCC]Editorial input on G-PCC draft text、ISO/IEC、JTC1/SC29/WG11、m51806
【非特許文献2】G-PCC codec description V5、ISO/IEC、JTC1/SC29/WG11、N18891
【発明の概要】
【発明が解決しようとする課題】
【0004】
しかしながら、本願の発明者は、非特許文献1及び2では、上述の分割を行う際の初期ノードのサイズに関して制約が規定されていないという問題点があった。
【0005】
そこで、本発明は、上述の課題に鑑みてなされたものであり、分割を行う際の初期ノードのサイズに関して制約を規定できるようにすることで設計を容易にすることができる点群復号装置、点群復号方法及びプログラムを提供することを目的とする。
【課題を解決するための手段】
【0006】
本発明の第1の特徴は、点群復号装置であって、初期ノードサイズの最大値を規定するシンタックスを復号するように構成されている幾何情報復号部を備えることを要旨とする。
【0007】
本発明の第2の特徴は、点群復号装置であって、各点の位置情報を一次元の配列状データとし、前記配列状データの順序として同一の親ノードに属する点のデータが隣り合うように並んだ状態で出力するように構成されている幾何情報再構成部を備えることを要旨とする。
【0008】
本発明の第3の特徴は、点群復号装置であって、「Implicit QtBt」を適用するかどうかを制御するフラグを復号するように構成されている幾何情報復号部と、「スケーラブルリフティング」を適用するかどうかを制御するフラグを復号するように構成されている属性情報復号部とを備え、前記「Implicit QtBt」が適用される場合には、前記「スケーラブルリフティング」は適用されないように制約されていることを要旨とする。
【0009】
本発明の第4の特徴は、点群復号装置であって、初期ノードを再帰的に分割することによって各点の位置データを復号するように構成されているツリー合成部と、各点の座標からMorton Codeを算出し、前記分割処理におけるノードサイズに対応するMorton Codeのビットを参照して各点の位置情報データをソートするように構成されているLoD算出部とを備えることを要旨とする。
【0010】
本発明の第5の特徴は、点群復号装置であって、初期ノードを再帰的に分割することによって各点の位置データを復号するように構成されているツリー合成部と、各点について、前記の分割処理1回ごとに、必ずx、y、z軸それぞれに対応するビットを生成する符号を算出し、前記符号順に各点の位置情報データをソートするように構成されているLoD算出部とを備えることを要旨とする。
【0011】
本発明の第6の特徴は、点群復号方法であって、初期ノードサイズの最大値を規定するシンタックスを復号する工程を有することを要旨とする。
【0012】
本発明の第7特徴は、点群復号装置で用いるプログラムであって、コンピュータに、初期ノードサイズの最大値を規定するシンタックスを復号する工程を実行させることを要旨とする。
【発明の効果】
【0013】
本発明によれば、分割を行う際の初期ノードのサイズに関して制約を規定できるようにすることで設計を容易にすることができる点群復号装置、点群復号方法及びプログラムを提供することができる。
【図面の簡単な説明】
【0014】
【
図1】一実施形態に係る点群処理システム10の構成の一例を示す図である。
【
図2】一実施形態に係る点群復号装置200の機能ブロックの一例を示す図である。
【
図3】一実施形態に係る点群復号装置200の幾何情報復号部2010で受信する符号化データ(ビットストリーム)の構成例である。
【
図4】一実施形態に係るGPS2011のシンタックス構成の一例である。
【
図5】一実施形態に係るGSH2012A/2012Bのシンタックス構成の一例である。
【
図6】一実施形態に係るGSH2012A/2012Bのシンタックスを説明するための図である。
【
図7】一実施形態に係る点群復号装置200のツリー合成部2020の処理の一例を説明するための図である。
【
図8】一実施形態に係る点群復号装置200のツリー合成部2020の処理の一例を説明するための図である。
【
図9】一実施形態に係る点群復号装置200のツリー合成部2020の処理によって分割されたツリー構造の一例を説明するための図である。
【
図10】一実施形態に係る点群復号装置200の属性情報復号部2060で受信する符号化データ(ビットストリーム)の構成例である。
【
図11】一実施形態に係るAPS2061のシンタックス構成の一例である。
【
図12】一実施形態に係る点群復号装置200のLoD算出部2090の処理手順の一例を説明するフローチャートである。
【
図13】一実施形態に係る点群復号装置200のLoD算出部2090の処理の一例を説明するための図である。
【
図14】一実施形態に係る点群復号装置200のLoD算出部2090の処理の一例を説明するための図である。
【
図15】一実施形態に係る点群復号装置200のLoD算出部2090の処理の一例を説明するための図である。
【発明を実施するための形態】
【0015】
以下、本発明の実施の形態について、図面を参照しながら説明する。なお、以下の実施形態における構成要素は、適宜、既存の構成要素等との置き換えが可能であり、また、他の既存の構成要素との組み合わせを含む様々なバリエーションが可能である。したがって、以下の実施形態の記載をもって、特許請求の範囲に記載された発明の内容を限定するものではない。
【0016】
(第1実施形態)
以下、
図1~
図8を参照して、本発明の第1実施形態に係る点群処理システム10について説明する。
図1は、本実施形態に係る実施形態に係る点群処理システム10を示す図である。
【0017】
図1に示すように、点群処理システム10は、点群符号化装置100及び点群復号装置200を有する。
【0018】
点群符号化装置100は、入力点群信号を符号化することによって符号化データ(ビットストリーム)を生成するように構成されている。点群復号装置200は、ビットストリームを復号することによって出力点群信号を生成するように構成されている。
【0019】
なお、入力点群信号及び出力点群信号は、点群内の各点の位置情報と属性情報とから構成される。属性情報は、例えば、各点の色情報や反射率である。
【0020】
ここで、かかるビットストリームは、点群符号化装置100から点群復号装置200に対して伝送路を介して送信されてもよい。また、ビットストリームは、記憶媒体に格納された上で、点群符号化装置100から点群復号装置200に提供されてもよい。
【0021】
(点群復号装置200)
以下、
図2を参照して、本実施形態に係る点群復号装置200について説明する。
図2は、本実施形態に係る点群復号装置200の機能ブロックの一例について示す図である。
【0022】
図2に示すように、点群復号装置200は、幾何情報復号部2010と、ツリー合成部2020と、近似表面合成部2030と、幾何情報再構成部2040と、逆座標変換部2050と、属性情報復号部2060と、逆量子化部2070と、RAHT部2080と、LoD算出部2090と、逆リフティング部2100と、逆色変換部2110とを有する。
【0023】
幾何情報復号部2010は、点群符号化装置100から出力されるビットストリームのうち、幾何情報に関するビットストリーム(幾何情報ビットストリーム)を入力とし、シンタックスを復号するように構成されている。
【0024】
復号処理は、例えば、コンテキスト適応二値算術復号処理である。ここで、例えば、シンタックスは、位置情報の復号処理を制御するための制御データ(フラグやパラメータ)を含む。
【0025】
ツリー合成部2020は、幾何情報復号部2010によって復号された制御データ及び後述するツリー内のどのノードに点群が存在するかを示すoccupancy codeを入力として、復号対象空間内のどの領域に点が存在するかというツリー情報を生成するように構成されている。
【0026】
本処理は、復号対象空間を直方体で区切り、occupancy codeを参照して各直方体内に点が存在するかを判断し、点が存在する直方体を複数の直方体に分割し、occupancy codeを参照するという処理を再帰的に繰り返すことで、ツリー情報を生成することができる。
【0027】
本実施形態では、上述の直方体を常に立方体として8分木分割を再帰的に行う「Octree」と呼ばれる手法、及び、直方体の初期サイズを制御データで指定し、直方体のサイズ及び制御データ内のパラメータに基づいて適応的に8分木、4分木及び2分木分割を行う「Implicit QtBt」と呼ばれる手法を使用することができる。どちらの手法を使用するかは、制御データとして点群符号化装置100側から伝送される。
【0028】
近似表面合成部2030は、ツリー情報合成部2020によって生成されたツリー情報を用いて、近似表面情報を生成するように構成されている。
【0029】
近似表面情報は、例えば、物体の3次元点群データを復号する際等において、点群が物体表面に密に分布しているような場合に、個々の点群を復号するのではなく、点群の存在領域を小さな平面で近似して表現したものである。
【0030】
具体的には、近似表面合成部2030は、例えば、「Trisoup」と呼ばれる手法で、近似表面情報を生成することができる。「Trisoup」の具体的な処理としては、例えば、非特許文献1及び2に記載の方法を用いることができる。また、Lidar等で取得した疎な点群データを復号する場合は、本処理を省略することができる。
【0031】
幾何情報再構成部2040は、ツリー情報合成部2020によって生成されたツリー情報及び近似表面合成部2030によって生成された近似表面情報を元に、復号対象点群の各点の幾何情報(復号処理が仮定している座標系における位置情報)を再構成するように構成されている。
【0032】
逆座標変換部2050は、幾何情報再構成部2040によって再構成された幾何情報を入力として、復号処理が仮定している座標系から、出力点群信号の座標系に変換を行い、位置情報を出力するように構成されている。
【0033】
属性情報復号部2060は、点群符号化装置100から出力されるビットストリームのうち、属性情報に関するビットストリーム(属性情報ビットストリーム)を入力とし、シンタックスを復号するように構成されている。
【0034】
復号処理は、例えば、コンテキスト適応二値算術復号処理である。ここで、例えば、シンタックスは、属性情報の復号処理を制御するための制御データ(フラグ及びパラメータ)を含む。
【0035】
また、属性情報復号部2060は、復号したシンタックスから、量子化済み残差情報を復号するように構成されている。
【0036】
逆量子化部2070は、属性情報復号部2060によって復号された量子化済み残差情報と、属性情報復号部2060によって復号された制御データの一つである量子化パラメータとを元に、逆量子化処理を行い、逆量子化済み残差情報を生成するように構成されている。
【0037】
逆量子化済み残差情報は、復号対象の点群の特徴に応じて、RAHT部2080及びLoD算出部2090のいずれかに出力される。いずれに出力されるかは、属性情報復号部2060によって復号される制御データによって指定される。
【0038】
RAHT部2080は、逆量子化済み残差情報によって生成された逆量子化済み残差情報と及び幾何情報再構成部2040によって生成された幾何情報を入力とし、RAHT(Region Adaptive Hierarchical Transform)と呼ばれるHaar変換(復号処理においては、逆Haar変換)の一種を用いて、各点の属性情報を復号するように構成されている。RAHTの具体的な処理としては、例えば、非特許文献1及び2に記載の方法を用いることができる。
【0039】
LoD算出部2090は、幾何情報再構成部2040によって生成された幾何情報を入力とし、LoD(Level of Detail)を生成するように構成されている。
【0040】
LoDは、ある点の属性情報から、他のある点の属性情報を予測し、予測残差を符号化或いは復号するといった予測符号化を実現するための参照関係(参照する点及び参照される点)を定義するための情報である。
【0041】
言い換えると、LoDは、幾何情報に含まれる各点を複数のレベルに分類し、下位のレベルに属する点については上位のレベルに属する点の属性情報を用いて属性を符号化或いは復号するといった階層構造を定義した情報である。
【0042】
LoDの具体的な決定方法としては、例えば、非特許文献1及び2に記載の方法を用いてもよい。その他の例については後述する。
【0043】
逆リフティング部2100は、LoD算出部2090によって生成されたLoD及び逆量子化済み残差情報によって生成された逆量子化済み残差情報を用いて、LoDで規定した階層構造に基づいて各点の属性情報を復号するように構成されている。逆リフティングの具体的な処理としては、例えば、非特許文献1及び2に記載の方法を用いることができる。
【0044】
逆色変換部2110は、復号対象の属性情報が色情報であり且つ点群符号化装置100側で色変換が行われていた場合に、RAHT部2080又は逆リフティング部2100から出力される属性情報に逆色変換処理を行うように構成されている。かかる逆色変換処理の実行有無については、属性情報復号部2060によって復号された制御データによって決定される。
【0045】
点群復号装置200は、以上の処理により、点群内の各点の属性情報を復号して出力するように構成されている。
【0046】
(幾何情報復号部2010)
以下、
図3~
図5を用いて幾何情報復号部2010で復号される制御データについて説明する。
【0047】
図3は、幾何情報復号部2010で受信する符号化データ(ビットストリーム)の構成例である。
【0048】
第1に、ビットストリームは、GPS2011を含んでいてもよい。GPS2011は、ジオメトリパラメータセットとも呼ばれ、幾何情報の復号に関する制御データの集合である。具体例については後述する。各GPS2011は、複数のGPS2011が存在する場合に個々を識別するためのGPS id情報を少なくとも含む。
【0049】
第2に、ビットストリームは、GSH2012A/2012Bを含んでいてもよい。GSH2012A/2012Bは、ジオメトリスライスヘッダとも呼ばれ、後述するスライスに対応する制御データの集合である。具体例については後述する。GSH2012A/2012Bは、各GSH2012A/2012Bに対応するGPS2011を指定するためのGPS id情報を少なくとも含む。
【0050】
第3に、ビットストリームは、GSH2012A/2012Bの次に、スライスデータ2013A/2013Bを含んでいてもよい。スライスデータ2013A/2013Bには、幾何情報を符号化したデータが含まれている。スライスデータ2013A/2013Bの一例としては、後述するoccupancy codeが挙げられる。
【0051】
以上のように、ビットストリームは、各スライスデータ2013A/2013Bに、1つずつGSH2012A/2012B及びGPS2011が対応する構成となる。
【0052】
上述のように、GSH2012A/2012Bにて、どのGPS2011を参照するかをGPS id情報で指定するため、複数のスライスデータ2013A/2013Bに対して共通のGPS2011を用いることができる。
【0053】
言い換えると、GPS2011は、スライスごとに必ずしも伝送する必要がない。例えば、
図3のように、GSH2012B及びスライスデータ2013Bの直前では、GPS2011を符号化しないようなビットストリームの構成とすることもできる。
【0054】
なお、
図3の構成は、あくまで一例である。各スライスデータ2013A/2013Bに、GSH2012A/2012B及びGPS2011が対応する構成となっていれば、ビットストリームの構成要素として、上述以外の要素が追加されてもよい。例えば、ビットストリームは、シーケンスパラメータセット(SPS)を含んでいてもよい。また、同様に、伝送に際して、
図3と異なる構成に整形されてもよい。更に、後述する属性情報復号部2060で復号されるビットストリームと合成して単一のビットストリームとして伝送されてもよい。
【0055】
図4は、GPS2011のシンタックス構成の一例である。
【0056】
GPS2011は、各GPS2011を識別するためのGPS id情報(gps_geom_parameter_set_id)を含んでもよい。
【0057】
GPS2011は、後述するツリーの最大ノードサイズ(初期ノードサイズの最大値)を規定するシンタックス(gps_max_log2_node_size)を含んでもよい。gps_max_log2_node_sizeは、必ず「0」以上の値を取ることと規定されていてもよい。gps_max_log2_node_sizeは、例えば、符号無し0次指数ゴロム符号で符号化されていてもよい。
【0058】
なお、
図4のDescriptor欄は、各シンタックスが、どのように符号化されているかを意味している。ue(v)は、符号無し0次指数ゴロム符号であることを意味し、u(1)は、1ビットのフラグであることを意味する。
【0059】
GPS2011は、最大ノードサイズを規定するgps_max_log2_node_sizeを含むことで、後述するシンタックスの取り得る値の最大値を規定することができる。
【0060】
また、GPS2011に、gps_max_log2_node_sizeを備えることで、gps_max_log2_node_sizeに設定可能な最大値を、プロファイルやレベルと呼ばれる規程の中で定義し、性能やアプリケーションによって対応すべきノードサイズの最大値を容易に指定できるようになる。
【0061】
GPS2011は、ツリー合成部2020で「Implicit QtBt」を行うかどうかを制御するためのフラグ(gps_implicit_geom_partition_flag)を含んでもよい。例えば、gps_implicit_geom_partition_flagの値が「1」の場合は、「Implicit QtBt」を行うと定義し、gps_implicit_geom_partition_flagの値が「0」の場合は、ツリーのノードを常に立方体として8分木分割のみを行う「Octree」を行うと定義してもよい。
【0062】
なお、gps_implicit_geom_partition_flagの値が「1」の場合は、GPS2011は、「Implicit QtBt」に関する制御データを追加で含んでもよい。
【0063】
GPS2011は、「Implicit QtBt」に関する制御データとして、x軸、y軸及びz軸方向のそれぞれの初期ノードサイズの最大値と最小値との差分の最大値(gps_max_diff_log2_node_size)を備えていてもよい。
【0064】
x軸、y軸及びz軸方向のそれぞれの初期ノードサイズの最大値と最小値との差分(gps_max_diff_log2_node_sizeの値)が最も小さい場合、つまり、x軸、y軸及びz軸方向のそれぞれの初期ノードサイズが等しいときは、ノードの形状が立方体であることを意味する。
【0065】
逆に、x軸、y軸及びz軸方向のそれぞれの初期ノードサイズの最大値と最小値との差分(gps_max_diff_log2_node_sizeの値)が大きくなるにつれて、ノードの初期形状は、細長く或いは平たい直方体形状となる。
【0066】
gps_max_diff_log2_node_sizeの値は、必ず「0」以上の値を取ることと規定されていてもよい。また、gps_max_diff_log2_node_sizeの値は、必ずgps_max_log2_node_sizeの値以下の値を取ることと規定されていてもよい。
【0067】
GPS2011に、gps_max_diff_log2_node_sizeを制御データとして備えることで、後述するノードのx軸、y軸及びz軸方向のそれぞれの初期サイズデータに関するシンタックスの最小値及び最大値を規定することができる。
【0068】
また、GPS2011に、gps_max_diff_log2_node_sizeを備えることで、初期ノード形状が極端に細長くなったり、極端に平たくなったりするようなケースを除外することができ、点群復号装置200の設計が容易になる。
【0069】
GPS2011は、「Implicit QtBt」に関する制御データとして、後述するKに対応する値(gps_max_num_implicit_qtbt_before_ot)及び後述するMに対応する値(gps_min_size_implicit_qtbt)を含んでもよい。
【0070】
gps_max_num_implicit_qtbt_before_otの値は、必ず「0」以上の値を取ることと規定されていてもよい。また、gps_max_num_implicit_qtbt_before_otの値は、必ずgps_max_log2_node_sizeの値以下の値を取ることと規定されていてもよい。
【0071】
gps_min_size_implicit_qtbtの値は、必ず「0」以上の値を取ることと規定されていてもよい。また、gps_min_size_implicit_qtbtの値は、必ずgps_max_log2_node_sizeの値以下の値を取ることと規定されていてもよい。
【0072】
【0073】
GSH2012A/2012Bは、当該GHS2012A/2012Bに対応するGPS2011を指定するためのシンタックス(gsh_geometry_parameter_set_id)を含んでもよい。
【0074】
GSH2012A/2012Bは、当該GHS2012A/2012Bに対応するGPS2011において、gps_implicit_geom_partition_flagの値が「1」の場合、「Implicit QtBt」に関する制御データを追加で含んでもよい。
【0075】
GSH2012A/2012Bは、「Implicit QtBt」に関する制御データとして、当該GSH2012A/2012Bに対応するスライスデータ2013A/2013Bの復号時に、「Implicit QtBt」を適用するか或いは「Octree」を適用するかを制御するフラグ(gsh_implicit_geom_partition_flag)を含んでもよい。
【0076】
例えば、gsh_implicit_geom_partition_flagの値が「1」の場合は、「Implicit QtBt」を適用すると定義し、gsh_implicit_geom_partition_flagの値が「0」の場合は、「Octree」を適用すると定義してもよい。
【0077】
GSH2012A/2012Bに、gsh_implicit_geom_partition_flagが含まれていない場合、幾何情報復号部2010は、gsh_implicit_geom_partition_flagの値を「0」とみなしてよい。
【0078】
GSH2012A/2012Bに、gsh_implicit_geom_partition_flagを備えることで、スライス単位で「Implicit QtBt」の適否を制御できるようになる。
【0079】
gsh_implicit_geom_partition_flagの値が「1」の場合、GSH2012A/2012Bは、x軸方向の初期ノードサイズを示すシンタックス(gsh_log2_max_nodesize_x)を含んでもよい。
【0080】
gsh_log2_max_nodesize_xの値は、必ず「0」以上の値を取ることと規定されていてもよい。また、gsh_log2_max_nodesize_xの値は、必ずgps_max_log2_node_size以下の値を取ることと規定されていてもよい。
【0081】
図6に示すように、x軸方向の初期ノードサイズを変数MaxNodeSizeXLog2で表し、MaxNodeSizeXLog2=gsh_log2_max_nodesize_xと定義してもよい。
【0082】
gsh_implicit_geom_partition_flagの値が「1」の場合、GPS2011は、y軸方向の初期ノードサイズから、x軸方向の初期ノードサイズ(MaxNodeSizeXLog2)を引いた値(gsh_log2_max_nodesize_y_minus_x)をシンタックスとして含んでもよい。gsh_log2_max_nodesize_y_minus_xは、符号付き0次指数ゴロム(se(v))で符号化されていてもよい。
【0083】
gsh_log2_max_nodesize_y_minus_xの値は、-gps_max_diff_log2_node_size以上であり、且つ、gps_max_diff_log2_node_size以下であることと規定されていてもよい。
【0084】
言い換えると、gsh_log2_max_nodesize_y_minus_xの絶対値が、gps_max_diff_log2_node_size以下であることと規定されていてもよい。
【0085】
また、y軸方向の初期ノードサイズ(=MaxNodeSizeXLog2+gsh_log2_max_nodesize_y_minus_x)が、「0」以上であり、且つ、gps_max_log2_node_size以下の値を取ることと規定されていてもよい。
【0086】
また、上述の規定を統合して、gsh_log2_max_nodesize_y_minus_xの値は、Max(-MaxNodeSizeXLog2,-gps_max_diff_log2_node_size)以上であり、且つ、Min(gps_max_log2_node_size-MaxNodeSizeXLog2,gps_max_diff_log2_node_size)以下の値を取ることと規定されていてもよい。
【0087】
なお、Max(a,b)は、2つの引数a、bのうち最大値を返す関数であり、Min(a,b)は、2つの引数a、bのうち最小値を返す関数である。
【0088】
図6に示すように、y軸方向の初期ノードサイズを変数MaxNodeSizeYLog2で表し、MaxNodeSizeYLog2=MaxNodeSizeXLog2+gsh_log2_max_nodesize_y_minus_xと定義してもよい。
【0089】
gsh_implicit_geom_partition_flagの値が「1」の場合、GPS2011は、z軸方向の初期ノードサイズからy軸方向の初期ノードサイズ(MaxNodeSizeYLog2)を引いた値(gsh_log2_max_nodesize_z_minus_y)をシンタックスとして含んでもよい。
【0090】
gsh_log2_max_nodesize_z_minus_yの値は、-gps_max_diff_log2_node_size以上であり、且つ、gps_max_diff_log2_node_size以下であることと規定されていてもよい。
【0091】
また、z軸方向の初期ノードサイズとx軸方向の初期ノードサイズとの差分(=gsh_log2_max_nodesize_y_minus_x+gsh_log2_max_nodesize_z_minus_y)は、-gps_max_diff_log2_node_size以上であり、且つ、gps_max_diff_log2_node_size以下であることと規定されていてもよい。
【0092】
言い換えると、gsh_log2_max_nodesize_z_minus_yの絶対値がgps_max_diff_log2_node_size以下であり、且つ、gsh_log2_max_nodesize_y_minus_x+gsh_log2_max_nodesize_z_minus_yの絶対値がgps_max_diff_log2_node_size以下であることと規定されていてもよい。
【0093】
また、z軸方向の初期ノードサイズ(=MaxNodeSizeYLog2+gsh_log2_max_nodesize_z_minus_y)は、必ず「0」以上であり、且つ、gps_max_log2_node_size以下の値を取ることと規定されていてもよい。
【0094】
また、上述の規定を統合して、gsh_log2_max_nodesize_z_minus_yの値は、Max(-MaxNodeSizeYLog2,Max(-gps_max_diff_log2_node_size,-gps_max_diff_log2_node_size-gsh_log2_max_nodesize_y_minus_x))以上であり、且つ、Min(gps_max_diff_log2_node_size-MaxNodeSizeYLog2,Min(gps_max_diff_log2_node_size-gsh_log2_max_nodesize_y_minus_x,gps_max_diff_log2_node_size))以下の値を取ることと規定されていてもよい。
【0095】
図6に示すように、z軸方向の初期ノードサイズを変数MaxNodeSizeZLog2で表し、MaxNodeSizeZLog2=MaxNodeSizeYLog2+gsh_log2_max_nodesize_z_minus_yと定義してもよい。
【0096】
gsh_log2_max_nodesize_z_minus_yの値が「0」の場合、GPS2011は、初期ノードサイズを示すシンタックス(gsh_log2_max_nodesize)を含んでもよい。
【0097】
gsh_log2_max_nodesizeの値は、「0」以上であり、且つ、gps_max_log2_node_size以下の値を取ることと規定されていてもよい。
【0098】
gsh_implicit_geom_partition_flagの値が「0」の場合は、ノードの形状として立方体のみを想定するので、x軸、y軸及びz軸の全ての方向の初期ノードサイズをgsh_log2_max_sizeで規定することができる。かかる初期ノードサイズを変数MaxNodeSizeLog2で表し、MaxNodeSizeLog2=gsh_log2_max_nodesizeと定義してもよい。
【0099】
以上では、GSH2012A/2012Bに、gsh_implicit_geom_partition_flagを備える例を示したが、gsh_implicit_geom_partition_flagが存在しない場合でも、上述と同様な処理は可能である。
【0100】
gsh_implicit_geom_partition_flagが存在しない場合は、幾何情報復号部2010は、gps_implicit_geom_partition_flagの値が「1」の場合に、gsh_log2_max_nodesize_x、gsh_log2_max_nodesize_y_minus_x及びgsh_log2_max_nodesize_z_minus_yを復号し、gps_implicit_geom_partition_flagの値が「0」の場合に、gsh_log2_max_nodesizeを復号するといった処理が可能である。
【0101】
(ツリー合成部2020)
図7~
図9を用いて、ツリー合成部2020の処理の一例を説明する。
【0102】
図7は、「Octree」を適用する場合、すなわち、gps_implicit_geom_partition_flagの値が「0」の場合、或いは、gsh_implicit_geom_partition_flagの値が「0」の場合の処理について説明する図である。
【0103】
「Octree」を適用する場合、第1に、ツリー合成部2020は、幾何情報復号部2010によって復号されたMaxNodeSizeLog2を用いて、
図7に示すように、初期ノードサイズを規定する。先に説明したように、「Octree」の場合、ノード形状は、立方体となる。
【0104】
第2に、ツリー合成部2020は、初期ノード、x軸、y軸及びz軸方向でそれぞれ半分に分割し、8つの子ノードに分割する。以降では、各子ノードに、便宜的に、a~hのラベルを付して説明する。
【0105】
第3に、ツリー合成部2020は、幾何情報復号部2010によって復号されたoccupancy codeを参照する。
【0106】
occupancy codeの最初の8ビットが、上述の子ノードa~hのそれぞれの内部に、復号対象の点が含まれているか否かを示している。occupancy codeの値が「1」の場合、当該子ノードの内部に点が存在することを意味し、occupancy codeの値が「0」の場合には、当該子ノードの内部に点が存在しないことを意味する。
図7の例では、子ノードb及び子ノードhの内部のみに点が存在することを意味している。
【0107】
第4に、ツリー合成部2020は、内部に点が存在する子ノードb及び子ノードhを、再度、x軸、y軸及びz軸方向でそれぞれ半分に分割し、8つの子ノードに分割する。
【0108】
第5に、ツリー合成部2020は、再度、次のoccupancy codeを参照し、各子ノード内部に点が存在するか判定する。
【0109】
以降、ツリー合成部2020は、これらの処理を再帰的に繰り返していくことで、初期ノードで定義される空間内の、どの領域に点が存在するかというツリー情報を生成する。
【0110】
図8は、「Implicit QtBt」を適用する場合、すなわち、gps_implicit_geom_partition_flagの値が「1」の場合、或いは、gsh_implicit_geom_partition_flagの値が「1」の場合の処理を説明する図である。
【0111】
「Implicit QtBt」を適用する場合、ツリー合成部2020は、
幾何情報復号部2010によって復号されたMaxNodeSizeXLog2、MaxNodeSizeYLog2及びMaxNodeSizeZLog2を用いて、
図8に示すように、初期ノードサイズを規定する。先に説明したように、「Implicit QtBt」を適用する場合は、ノード形状は、直方体となる(立方体も、直方体の一種であることは言うまでもない)。
【0112】
「Implicit QtBt」を適用する場合も、基本的な処理は、「Octree」を適用する場合と同じである。「Octree」を適用する場合は、ノードを常に8つの子ノードに分割していたが、「Implicit QtBt」を適用する場合では、ノードを4つの子ノード或いは2つの子ノードに分割する場合もある。
【0113】
図8(a)は、ノードを4つの子ノードに分割した場合の例を示し、
図8(b)図は、ノードを2つの子ノードに分割した場合の例を示している。
【0114】
図8(a)に示すように、ノードを4つの子ノードに分割する場合、対応するoccupancy codeは、4ビットとなる。同様に、
図8(b)に示すように、ノードを2つの子ノードに分割する場合、対応するoccupancy codeは、2ビットとなる。
【0115】
ノードを、8つ、4つ又は2つのいずれの数に分割するかどうか(8分木分割、4分木分割又は2分木分割のいずれを行うか)は、初期ノードからの分割回数、当該ノードのx軸方向、y軸方向及びz軸方向のサイズ、及び、幾何情報復号部2010によって復号された制御データ(K及びM)の値を用いて、暗黙的に決定される。具体的な決定方法としては、非特許文献1や2に記載の方法を用いることができる。
【0116】
ここで、Kは、最初に8分木分割を行う前に、4分木分割又は2分木分割を行う回数の最大値を規定するパラメータである。また、Mは、4分木分割及び2分木分割を行う最小ノードサイズを規定するパラメータである。
【0117】
以上のように、全てのノードサイズが1×1×1の大きさになるまで再帰的に分割を繰り返すことで、点群を構成する各点(それぞれが1×1×1サイズのノードに対応)の位置を復号することができる。
【0118】
なお、後述するスケーラブルリフティングを適用する場合(lifting_scalability_enabled_flag=1の場合)、復号装置の動作に先立ってユーザによって決定されるパラメータskipOctreeLayersの値によって、上記で説明した復号処理を制御してもよい。
【0119】
例えば、
図9は、初期ノードから分割を3回繰り返すことによって全てのノードサイズが1×1×1の大きさになる場合のツリー構造の例を示している。ここで、skipOctreeLayersの値が「0」の場合は、上述の説明と同様に、各ノードについて3回分割を行う。次に、例えば、skipOctreeLayers=2の場合は、下位2回の分割処理を省略する。
図9の場合は、分割回数2及び3と記載されている層の分割処理を省略することに相当するため、各ノードについて1回ずつ分割を行った時点で復号処理を終了することとなる。
【0120】
以上のように復号した各点の位置情報を、近似表面合成部2030及び幾何情報再構成部2040を経由して、RAHT部2080及びLoD算出部2090へ出力する。この時、各点の位置情報を一次元の配列状に保存したデータとして伝達し、かかるデータの順序として、同一の親ノードに属する点のデータが隣り合うように並んでいることという制約を定義してもよい。
【0121】
すなわち、幾何情報再構成部2040は、各点の位置情報を一次元の配列状データとし、かかる配列状データの順序として、同一の親ノードに属する点のデータが隣り合うように並んだ状態で出力してもよい。
【0122】
例えば、
図9の例では、abcd...pqrの順にアルファベット順に点のデータが格納されているということを意味する。この並び順では、例えば、分割回数2の階層のノードを親ノードと考えたときは、例えば、ノードa及びb、ノードc及びd、ノードe及びf等が、それぞれ同一の親ノードに属する点である。また、分割回数1の階層のノードを親ノードと考えたときは、ノードa~f、ノードg~i、ノードj~l、ノードm~rが、それぞれ同一の親ノードに属している。
【0123】
また、同様に、上述の配列状のデータの順序は、各点を幅優先探索で処理した場合の順に並んでいることという制約と言い換えることもできる。
【0124】
(属性情報復号部2060)
以下、
図10及び
図11を用いて、属性情報復号部2060で復号される制御データについて説明する。
【0125】
図10は、幾何情報復号部2060で受信する符号化データ(ビットストリーム)の構成例である。
【0126】
第1に、ビットストリームは、APS2061を含んでいてもよい。APS2061は、アトリビュートパラメータセットとも呼ばれ、属性情報の復号に関する制御データの集合である。具体例については後述する。各APS2061は、複数のAPS2061が存在する場合に個々を識別するためのAPS id情報を少なくとも含む。
【0127】
第2に、ビットストリームは、ASH2062A/2062Bを含んでいてもよい。ASH2062A/2062Bは、アトリビュートスライスヘッダとも呼ばれ、後述するスライスに対応する制御データの集合である。具体例については後述する。ASH2062A/2062Bは、各ASH2062A/2062Bに対応するAPS2061を指定するためのAPS id情報を少なくとも含む。
【0128】
第3に、ビットストリームは、ASH2062A/2062Bの次に、スライスデータ2063A/2063Bを含んでいてもよい。スライスデータ2063A/2063Bには、属性情報を符号化したデータが含まれている。
【0129】
以上のように、ビットストリームは、各スライスデータ2063A/2063Bに、1つずつASH2062A/2062B及びAPS2061が対応する構成となる。
【0130】
上述のように、ASH2062A/2062Bにて、どのAPS2061を参照するかをAPS id情報で指定するため、複数のスライスデータ2063A/2063Bに対して共通のAPS2061を用いることができる。
【0131】
言い換えると、APS2061は、スライスごとに必ずしも伝送する必要がない。例えば、
図10のように、ASH2062B及びスライスデータ2063Bの直前では、APS2061を符号化しないようなビットストリームの構成とすることもできる。
【0132】
なお、
図10の構成は、あくまで一例である。各スライスデータ2063A/2063Bに、ASH2062A/2062B及びAPS2061が対応する構成となっていれば、ビットストリームの構成要素として、上述以外の要素が追加されてもよい。例えば、ビットストリームは、シーケンスパラメータセット(SPS)を含んでいてもよい。
【0133】
また、同様に、伝送に際して、
図10と異なる構成に整形されてもよい。更に、前記幾何情報復号部2010で復号されるビットストリームと合成して単一のビットストリームとして伝送されてもよい。例えば、スライスデータ2013A及び2063A、スライスデータ2013B及び2063Bを、それぞれ単一のスライスデータとして扱い、各スライスの直前にGSH2012A及びASH2062A、GSH2012B及びASH2062Bを、それぞれ配置する構成となっていてもよい。また、その際、各GSH及びASHに先立って、GPS2011及びAPS2061が配置されていてもよい。
【0134】
図11は、APS2061のシンタックス構成の一例である。
【0135】
APS2061は、各APS2061を識別するためのAPS id情報(aps_attr_parameter_set_id)を含んでもよい。
【0136】
APS2061は、属性情報の復号方法を示す情報(attr_coding_type)を含んでもよい。例えば、attr_coding_typeの値が「0」の時は、逆リフティング部2100において可変の重み付きリフティング予測を行い、attr_coding_typeの値が「1」の時は、RAHT部2080にてRAHTを行い、attr_coding_typeの値が「2」の時は、逆リフティング部2100において固定の重みでのリフティング予測を行う、というように規定されていてもよい。
【0137】
APS2061は、attr_coding_typeの値が「2」の時、すなわち、逆リフティング部2100において固定の重みでのリフティング予測を行う場合、スケーラブルリフティングを適用するかどうかを示すフラグ(lifting_scalability_enabled_flag)を含んでもよい。
【0138】
lifting_scalability_enabled_flagの値が「0」の場合は、スケーラブルリフティングを適用しないと規定し、lifting_scalability_enabled_flagの値が「1」の場合は、スケーラブルリフティングを適用すると規定されていてもよい。
【0139】
また、lifting_scalability_enabled_flagの値が「1」の場合、すなわち、スケーラブルリフティングを適用する場合は、上述のように、画像復号装置200の実行時の外部パラメータとして、skipOctreeLayersを取得するよう規定されていてもよい。
【0140】
また、上述の「Implicit QtBt」を適用する場合、すなわち、gps_implicit_geom_partition_flagの値が「1」の場合は、スケーラブルリフティングを適用しないこと、すなわち、lifting_scalability_enabled_flagの値が必ず「0」であることと規定されていてもよい。
【0141】
すなわち、「Implicit QtBt」を適用するかどうかを制御するフラグを復号する幾何情報復号部2010と、「スケーラブルリフティング」を適用するかどうかを制御するフラグを復号する属性情報復号部2060とを備え、「Implicit QtBt」が適用される場合には、「スケーラブルリフティング」は適用されないように制約されていてもよい。
【0142】
このように、「Implicit QtBt」とスケーラブルリフティングとを排他的に適用するように制約を掛けることで、機能の組み合わせを削減することで仕様をシンプルにし、実装を容易にできる。
【0143】
例えば、スケーラブルリフティングを適用する場合は、必ず「Octree」を適用するように制約することで、スケーラブルリフティングの処理において、ノード形状は必ず立方体であり、各分割で必ず8分木分割をする前提で処理が実行できるため、ノード形状が直方体で、分割の種類が8分木分割に加えて4分木及び2分木分割も許可されている場合と比較して、仕様を簡素化することができる。
【0144】
(LoD算出部2090)
以下、
図12~15を用いて、LoD算出部2090の処理内容の一例について説明する。
【0145】
図12は、LoD算出部2090のフローチャートの一例である。
【0146】
ステップS1201において、LoD算出部2090は、幾何情報再構成部2040から出力された点群内の各点の位置情報データを並び替える処理(ソート)を行う。
【0147】
ここで、上述の通り、ツリー合成部2020の出力において、各点の位置情報データが、一次元の配列状に並んでおり、その順序は、同一の親ノードに属する点の位置情報データが必ず隣り合うように並ぶよう制約されている場合、又は、各点を幅優先探索で処理した順に並ぶよう制約されている場合は、本ステップの処理を省略して、本処理は、ステップS1202に直接進んでもよい。
【0148】
上述のような制約がない場合には、以下のような手順でソートを行う。
図13及び14を用いて、ソート方法の例を説明する。
【0149】
図13(a)は、初期ノードサイズとして(x、y)=(4、8)とした場合の分割結果の例を示し、
図13(b)は、
図13(a)に対応する分割ツリーの例を示し、
図13(c)は、
図13(a)の座標から算出したMorton Code及びPartition-based Codeの例を示す。以降、簡単のために、x軸及びy軸の二次元で説明するが、以下の説明は、z軸に関する情報をx軸、y軸同様に追加することで、簡単に3次元(x、y、z)に拡張できる。
【0150】
図13(a)は、初期ノードサイズを(x、y)=(4、8)として、1回目の分割で(2、4)の4つの子ノードに4分木分割し、2回目の分割で(2、4)サイズのノードをそれぞれ(1、2)サイズの4つの子ノードに4分木分割し、3回目の分割で(1、2)サイズのノードをそれぞれ(1、1)サイズの2つの子ノードに2分木分割した場合の例を示している。
【0151】
図13(b)は、上述の分割回数ごとに、少なくとも1点の位置情報データが存在するノード数に対応している。言い換えると、
図13(b)は、Occupancy codeの値が1であったノード数を示している。
【0152】
また、
図13(b)の下部のアルファベットa~rは、
図13(a)の1×1サイズのノードa~rに対応している。
【0153】
図13(a)にて、a~rでラベル付けされているノードには、位置情報データが存在し、それ以外のノードには、位置情報データが存在していない、すなわち、点データが存在していないこととする。
【0154】
なお、以降では、各ノードの座標は、各ノードが占める領域のうちx座標及びy座標がそれぞれ最小となる点とする。
図13(a)の例では、原点が、
図13(a)の左上にあるため、各ノードの座標は、各ノードの左上隅の位置の座標となる。例えば、ノードpの座標は、(x、y)=(3、5)である。
【0155】
LoD算出部2090は、ソート処理を行うに先立って、Morton Code或いはPartition-based Codeを算出する。
【0156】
第1に、Morton Codeを用いてソートを行う場合について説明する。
【0157】
3次元空間の場合、Morton Codeは、各ノードの座標を元に、以下の(式1)で算出する。
【0158】
【数1】
ここで、iは、x、y、z座標をそれぞれ2進数で表現した際の桁数であり、初期ノードサイズに応じて必要な桁数を確保する。例えば、
図13の例では、最も大きいノードのサイズが8なので、x軸、y軸それぞれ3ビットずつ用意しておけば、全ての整数位置の座標を表現できる。
【0159】
また、
図13のように、2次元空間の場合は、以下の通りとなる。
【0160】
【数2】
(式2)を用いて算出したMorton Codeの例を、
図13(c)に示す。Morton Codeから座標に逆変換する場合は、以下の(式3)で算出できる。
【0161】
【数3】
同様に、
図13のように、2次元空間の場合は、以下の(式4)の通りとなる。
【0162】
【数4】
ここで、演算子&は、ビット単位での論理積である。
【0163】
図13(c)に、(x、y)=(3、5)の場合のMorton Codeから座標を算出する場合の例を示している。
【0164】
以上のように、LoD算出部2090は、各ノードについてMorton Codeを算出した後、ソート処理を行う。
【0165】
Morton Codeを用いた場合のソート処理の例を、
図14を用いて説明する。
【0166】
図14の一番左側の「initial」の列は、各ノードをランダムに並べたものである。各ノードにラベルとして付しているアルファベットの右隣にある6桁の数字が、各ノードのMorton Codeである。これらのMorton Codeは、
図13(a)の座標を元に算出したものである。
【0167】
以降、LoD算出部2090は、この「initial」の列のデータを、同一の親ノードに属する点の位置情報データが必ず隣り合うようにソートする。言い換えると、LoD算出部2090は、「node size = (2、4)」の列にあるように、アルファベット順になるようにソートする。
【0168】
なお、
図13(a)のケースでは、「Implicit QtBt」を適用して4分木分割と2分木分割の両方を適用している。この場合、
図14の「Morton Code順」の列のように、Morton Codeが小さい順にソートすると、同一の親ノードに属する点の位置情報データが隣り合わないケースが発生する場合がある。例えば、ノードaは、ノードbと同一の親ノードに属しているが、Morton Code順に並べた場合、ノードa及びノードcが隣り合って並んでしまっている。
【0169】
以下、基数ソートの考え方を応用して、同一の親ノードに属する点の位置情報データが必ず隣り合うようにソートする方法を説明する。
【0170】
第1に、ノードが一番小さく分割されたケースを考える。
図13の例では、分割回数3の状況を考える。この時、ノードサイズは、(x、y)=(1、1)である。そこで、各Morton Codeのx=1及びy=1に対応する桁に着目する。x=1に対応するのは、Morton Codeの一番下位ビットであり、y=1に対応するのは、二番目に下位のビットである。すなわち、
図14の「node size = (1、1)」の列の四角で囲った部分がx=1、y=1に対応する。
【0171】
上述の四角で囲った部分のみに着目して、「initial」の列のデータをソートした結果が「node size = (1、1)」の列である。
図14から分かる通り、“yx”の順で“00”、“01”、“10”、“11”となるようにソートしている。なお、着目した2ビットのパターンが同じとなるノードの間の順序は、「initial」列での順序を保存している。
【0172】
第2に、分割回数2の状況を考える。この時、ノードサイズは、(x、y)=(1、2)である。そこで、各Morton Codeのx=1及びy=2に対応する桁に着目する。x=1に対応するのは、Morton Codeの一番下位ビットであり、y=1に対応するのは、最下位から4ビット目である。上述の2つのビットに着目して、「node size = (1、1)」の列のデータをソートした結果が「node size= (1、2)」の列である。
【0173】
第3に、同様に分割数1の状況を考えて、各Morton Codeのx=2及びy=4に対応する桁に着目して「node size = (1、2)」の列のデータをソートした結果が「node size= (2、4)」の列である。
【0174】
以上のように、各分割回数時のノードサイズ及びMorton Codeにおける前記ノードサイズに対応する桁のみに注目して最下位の分割層から上位の分割層に向かって順次ソートを行うことで、同一の親ノードに属する点の位置情報データが必ず隣り合うようにソートできる。以上では、x軸及びy軸の2次元平面の場合を例に説明したが、3次元の場合も各処理でz軸のデータを追加で考慮することで、同様にソートを行うことができる。
【0175】
なお、スケーラブルリフティングを適用する場合も、ノードが最も小さく分割された状態をスタート地点として、順に分割処理の逆順にノードサイズを考慮していくことで同様のソートが実現できる。
【0176】
例えば、変数skipOctreeLayersの値が「1」の時は、
図13の例では、ノードサイズが(x、y)=(1、2)なので、
図14に示す「node size = (1、2)」の列において四角で囲った2ビットに着目してソートするところから処理を開始し、順に一番上の分割階層まで、すなわち、
図14の例では、「node size = (2、4)」の列に記載のソートが完了するまでソート処理を繰り返す。
【0177】
以上が、Morton Codeを用いた場合のソート方法の説明である。
【0178】
すなわち、LoD算出部2090は、各点の座標からMorton Codeを算出し、上述の分割処理におけるノードサイズに対応するMorton Codeのビットを参照して各点の位置情報データをソートする。
【0179】
以上のように、Morton Codeは、各ノードの座標のみから算出できる。言い換えると、初期ノードからどのように分割されてきたか(8分木、4分木、2分木分割のそれぞれどれをどんな順番で行ったか)に依存せずに算出することができる。
【0180】
また、「Octree」の場合、すなわち、3次元空間にてノードサイズが常に立方体で、必ず8分木分割で分割を行う場合は、Morton Code順(例えば、小さい順)に位置データをソートすることで、必ず同一の親ノードに属する点の位置情報データが必ず隣り合うように並べることができる。
【0181】
2次元空間の場合は、ノードサイズが必ず正方形で、必ず4分木分割で分割を行う場合は、Morton Code順(例えば、小さい順)に位置データをソートすることで、上記と同様に必ず同一の親ノードに属する点の位置情報データが必ず隣り合うように並べることができる。
【0182】
次に、
図13(c)に示すPartition-based Codeを用いた場合のソート法について説明する。Partition-based Codeは、2次元平面の場合は“yx”の順での2ビット、3次元空間では“zyx”の順での3ビットをひと固まりとして、分割ごとに当該の点の座標が分割後のどちらの空間に属しているかを各ビットで示す(座標が小さい方の空間に属する場合は「0」、大きい方の空間に属する場合は「1」)。
【0183】
例えば、
図13の例では、ノードm、ノードo、ノードpのいずれも、1回目の分割(4分木分割)後では、
図13(c)の(x、y)=(2、4)サイズの子ノードに属している。よって、Partition-based Codeの先頭2ビット(1回目の分割に対応)は、xもyも座標が大きい方の空間なので「11」となる。
【0184】
Partition-based Codeの次の2ビット(6ビット中の中央の2ビット)は、2回目の分割(4分木分割)に対応している。2回目の分割後は、
図13(c)の(x、y)=(2、4)サイズのノードの中で考えると、ノードmは、xもyも座標が小さい方の空間に属しているので「00」となる。ノードo及びノードpは、xは座標が大きい方であり、yは座標が小さい方なので、「01」となる。
【0185】
Partition-based Codeの次の2ビット(6ビット中の下位2ビット)は、3回目の分割(2分木分割)に対応している。3回目の分割は、y方向のみの分割である。ノードm及びノードoは、それぞれ分割後にy座標が小さい方に属しているので、下位から2ビット目は「0」となる。最下位ビットはx軸に対応しているが、3回目の分割ではx軸方向の分割はないため、常に「0」としておく。或いは、ビットを省略して桁を詰めてもよい。
【0186】
以上により、ノードm及びノードoのPartition-based Codeの下位2ビットは、「00(又は「0」のみ)」となる。同様に、ノードpの下位2ビットは、「10(又は「1」のみ)」となる。
【0187】
以上の手順は、言い換えると、Partition-based Codeを算出したい座標のx軸成分を、例えばXとしたとき、ある分割においてXの値が「親ノードのx座標+子ノードのx軸方向サイズ」以上だった場合には「1」を出力し、そうでない場合には「0」を出力し、これを(3次元の場合は)y軸及びz軸についても同様に実行することと等価である。ここで、子ノードのサイズは、当該の分割で当該の軸方向に分割が行われる場合は、親ノードサイズの1/2と等しく、かかる分割が行われない場合は、親ノードサイズと等しい。
【0188】
すなわち、分割処理1回ごとに、ある点の座標が当該分割での親ノードの座標に当該分割での子ノードのサイズを加えた値以上の場合は「1」を、そうでない場合は「0」を、x、y、z軸それぞれについて出力する。
【0189】
図13(c)には、上述のように算出したPartition-based Codeから、座標に逆変換する場合の例を示している。例えば、ノードpの座標は、Partition-based Codeから、以下のように逆変換できる。
【0190】
第1に、上位2ビットは、1回目の分割に対応しているため、1回目の分割後のノードサイズ(x、y)=(2、4)を用いて、それぞれx=1×2及びy=1×4とする。
【0191】
第2に、中間の2ビットは、2回目の分割に対応しているため、ノードサイズ(x、y)=(1、2)とし、先ほどの結果を考慮して、x=1×2+1×1及びy=1×4+0×1とする。同様に、下位2ビットについても、3回目の分割時のノードサイズを考慮して、最終的に、
図13(c)にあるように、(x、y)=(3、5)と逆変換できる。
【0192】
以上のように、分割処理1回ごとに、当該分割に対応するビット(「0」又は「1」)と当該分割後のノードサイズ(分割前から見ると子ノードサイズ)を乗じた値を、全ての分割処理について算出した後に、(3次元の場合は)x、y、z軸それぞれについて総和をとることで、上述のように算出した符号から座標を逆変換できる。
【0193】
すなわち、LoD算出部2090は、各点について、分割処理1回ごとに、(3次元空間の場合は)必ずx、y、z軸それぞれに対応するビット(計3ビット)を生成する符号を算出し、上述の符号順に各点の位置情報データをソートする。
【0194】
以上のように、分割ごとに各座標軸に対応するビットを生成するPartition-based Codeを算出することで、Partition-based Code順に各点の位置情報データをソートすると、必ず同一の親ノードに属する点の位置情報データが必ず隣り合うように並べることができる。すなわち、
図13の例では、a~rのアルファベット順にソートすることができる。
【0195】
また、以上で説明したPartition-based Codeは、「Octree」を適用する場合は、Morton Codeと完全に一致する。
【0196】
さらに、Partition-based Codeは、あくまで説明の便宜上付した名称であり、異なる名称でも同様の方法で算出した符号であればよい。例えば、1回の分割ごとに、必ずx、y、z軸それぞれに対応するビット(計3ビット)を生成する符号であればよい。また、例えば、分割処理1回ごとに、ある点の座標が当該分割での親ノードの座標に当該分割での子ノードのサイズを加えた値以上の場合は「1」を、そうでない場合は「0」を、x、y、z軸それぞれについて出力するように定義されている符号であれば良い。また、例えば、当該ビットの分割に対応するノードサイズを考慮して演算することで、当該符号から座標を逆変換できるように定義されている符号であればよい。
【0197】
以上のように、LoD算出部2090は、Morton Code又はPartition-based Codeの算出及びそれぞれに対応したソート処理を行った後、本処理は、ステップS1202へ進む。
【0198】
ステップS1202では、LoD算出部2090は、各点の位置情報について、それぞれLoDを算出する。
【0199】
以下、スケーラブルリフティングを適用する場合のLoD算出処理について説明する。スケーラブルリフティングを適用しない場合のLoDの算出方法は、例えば、非特許文献1や非特許文献2に記載の方法で実現できる。
【0200】
スケーラブルリフティングを適用する場合のLoDの算出処理は、一番下位のLoD(
図13の例では、分割回数3に相当)から順に、同一の親ノードに属する点のうち、1点のみを上位のLoDへ送り、その他の点については当該LoDに属する点としてLoDを付する処理を行う。
【0201】
例えば、一番下位のLoDを「0」とし、一つ上位のLoDを「1」(
図13の例では分割回数2の層に相当)、というように分割回数0まで順にLoDを1ずつ大きくしながら割り当てることとする。
【0202】
例えば、LoDの値が偶数の場合は、同一の親ノードに属するノードの中でMorton Code或いはPartition-based Codeの値が最も小さいノードを、LoDの値が奇数の場合は同一の親ノードに属するノードの中でMorton Code或いはPartition-based Codeの値が最も大きいノードを、それぞれ上位のLoDに送るように決定してもよい。或いは、上述のLoDの値が奇数の場合の処理と偶数の場合の処理とを入れ替えてもよい。
【0203】
Morton Codeを用いる場合及びPartition-based Codeを用いる場合について、具体的な処理を以下で説明する。
【0204】
第1に、ステップS1201において、上述のMorton Codeの算出及び
図14を用いて説明した方法でソートした各点の位置情報データに対してLoDを計算する場合の例について説明する。
【0205】
第1に、LoD算出部2090は、一番下位のLoD(LoD「0」)から処理を開始する。例えば、
図13の例では、一番下位のLoDに対応するノード((x、y)=(1、1)サイズ)の親ノードのサイズは、(x、y)=(1、2)である。これを用いて、Morton Codeのうち、xに対応するビットについては1の位以上の位、yに対応するビットについては、2の位以上の位のみに着目する。
【0206】
具体的には、
図15の「parent node size = (1、2)」列に示す四角で囲った部分のみに着目する。
【0207】
第2に、LoD算出部2090は、四角で囲った部分が同一のパターンになっているノード同士をグルーピングする。例えば、ノードa及びb、ノードc及びd、ノードe及びfは、それぞれ同じパターンを持っている。なお、このグルーピングは、ループ処理でも実現できる。
【0208】
例えば、第1に、LoD算出部2090は、先頭のノードaのMorton Codeから、上述の四角で囲った部分のパターンを抽出し、保存する。また、LoD算出部2090は、当該ノードを始点に設定する。
【0209】
第2に、LoD算出部2090は、ノードb、ノードcと順番に処理し、同様に、四角で囲った部分のパターンを抽出し、先ほど保存したノードaのパターンと比較する。この時、保存していたパターンと異なる場合は、LoD算出部2090は、直前に確認したノード(始点と同じパターンを持つノードの中で、最も大きなMorton Codeを持つノード)を終点に設定する。
【0210】
第3に、LoD算出部2090は、始点から終点の間に含まれるノードの中から1つのノードを上位のLoDに送り、その他のノードについて当該LoDとする。
【0211】
第4に、LoD算出部2090は、上述の保存したパターンと異なるパターンを持っていたノードを新たな始点として設定し、上記と同じ処理を全ノードについて繰り返す。
【0212】
かかるグルーピングは、同一の親ノードを持つ子ノードのグループに相当する。よって、LoD算出部2090は、この各グループの中で、Morton Codeの全ビットの値を見て、値が最も小さい又は最も大きいノードを上位のLoDへ送る。
図15の例では、Morton Codeが小さい方のノードを上位のLoDに送った場合を示している。
【0213】
図15の「parent node size = (2、4)」は、LoD「1」の処理に対応している。「parent node size = (2、4)」の列に記載のノードは、上述の最下位のLoDから当該のLoDに送られてきた点である。当該のLoDは、
図13の分割回数2に対応する。当該LoDに対応するノードの親ノードのサイズは、(x、y)=(2、4)である。
【0214】
よって、上述の場合と同様に、Morton Codeのxに対応するビットについては2の位以上の位、yに対応するビットについては4の位以上の位のみに着目する。
【0215】
第5に、LoD算出部2090は、上述の場合と同様にグルーピングを行い、同一のグループから1つのノードを上位のLoDへ送る。
図15の例は、同一グループのうちMorton Codeが最も大きなノードを上位LoDへ送った場合の例である。
【0216】
以上の処理を、
図13の分割回数0に相当するLoDまで繰り返すことで、全ての点のLoDを決定することができる。
【0217】
すなわち、LoD算出部2090は、各ノードサイズ以上の桁に対応するMorton Codeのビットを参照して、各点のLoDを算出する。
【0218】
なお、以上では、変数skipOctreeLayersの値が「0」の時の場合を例に説明した。例えば、変数skipOctreeLayersの値が「1」の時は、下位1階層の処理をスキップして、
図15の「parent node size = (2、4)」の列の処理から開始する。同様に、変数skipOctreeLayersの値が「N」の時は、下位N階層の処理をスキップする。
【0219】
次に、Partition-based Codeを用いる場合について説明する。Partition-based Codeを用いる場合も、基本的には上記のように各ノードをグルーピングして、グループごとに1ノードずつを上位のLoDに送り、その他のノードを当該LoDに属するとすることでLoDを決定する。
【0220】
Partition-based Codeの場合、
図13を用いて説明した通り、二次元では、“yx”の2ビットの各ペアが、各分割に対応している。よって、最下層のLoDの処理では、下位2ビットを無視して上位4ビットのパターンでグルーピングすることで、同一の親ノードに属する子ノードをグルーピングできる。同様に、最下層から2番目のLoDでは、Partition-based Codeの上位2ビットのパターンでグルーピングできる。以降の処理は、上述のMorton Codeの場合と同様である。
【0221】
以上のように、各ノードのLoDを算出した後、本処理は、ステップS1203へ進む。
【0222】
ステップS1203では、LoD算出部2090は、各ノードについて、当該ノードのLoDより上位のLoDに属するノードを対象に、k最近傍探索を行う。k最近傍探索では、各ノード間の距離を算出する必要がある。この時、スケーラブルリフティングが適用されており、skipOctreeLayersの値が「1」以上の時は、ノードサイズが(x、y、z)=(1、1、1)より大きくなっており、正確な点の位置を知ることができない。
【0223】
よって、LoD算出部2090は、各LoDでのノードサイズを用いて量子化した座標値を、当該ノードの座標値として距離の計算を行う。具体的には、以下の通り、LoD算出部2090は、各ノードの中央に座標が来るように量子化してもよい。
【0224】
ShiftX=Log2(当該ノードのx方向のサイズ)
x=(当該ノードのx座標>>ShiftX)<<ShiftX + 当該ノードのx方向のサイズ/2
ShiftY=Log2(当該ノードのy方向のサイズ)
y=(当該ノードのy座標>>ShiftY)<<ShiftY + 当該ノードのy方向のサイズ/2
ShiftZ=Log2(当該ノードのz方向のサイズ)
z=(当該ノードのz座標>>ShiftZ)<<ShiftZ + 当該ノードのz方向のサイズ/2
例えば、
図13の例だと、skipOctreeLayersの値が「1」の時は、当該ノードのx方向のサイズは「1」であり、当該ノードのy方向のサイズは「2」である。よって、それぞれ2を底とする対数をとって上記のShiftXは「0」、ShiftYは「1」である。
【0225】
上述の量子化を行った結果、2つのノードの座標が全く同じになった場合は、例えば、両者の距離(L2ノルム)を当該ノードサイズのうち短辺の長さの二乗と定義してもよい。
【0226】
すなわち、LoD算出部2090は、LoDごとに当該LoDに属するノードと、当該LoDより上位に属するノードとの間でk最近傍探索を行い、上述のk最近傍探索に際して、当該スライスに「スケーラブルリフティング」が適用されている場合には、当該LoDにおける当該ノードの中央の座標を、x、y、z軸それぞれのノードサイズを参照して算出し、前記中央の座標を当該ノードの座標とみなす。
【0227】
LoD算出部2090は、以上のようにして求めたノードの座標を用いて、k最近傍探索を行う。k最近傍探索の具体的な処理については、非特許文献1及び非特許文献2に記載の方法を適用できる。
【0228】
全てのノードについてk最近傍探索を行った後、本処理は、ステップS1204へ進み、終了する。
【0229】
また、上述の点群符号化装置100及び点群復号装置200は、コンピュータに各機能(各工程)を実行させるプログラムであって実現されていてもよい。
【0230】
なお、上記の各実施形態では、本発明を点群符号化装置100及び点群復号装置200への適用を例にして説明したが、本発明は、かかる例のみに限定されるものではなく、点群符号化装置100及び点群復号装置200の各機能を備えた点群符号化/復号システムにも同様に適用できる。
【符号の説明】
【0231】
10…点群処理システム
100…点群符号化装置
200…点群復号装置
2010…幾何情報復号部
2020…ツリー合成部
2030…近似表面合成部
2040…幾何情報再構成部
2050…逆座標変換部
2060…属性情報復号部
2070…逆量子化部
2080…RAHT部
2090…LoD算出部
2100…逆リフティング部
2110…逆色変換部