以下、本発明の実施の形態について、図面を参照しながら説明する。なお、以下の実施形態における構成要素は、適宜、既存の構成要素等との置き換えが可能であり、また、他の既存の構成要素との組み合わせを含む様々なバリエーションが可能である。したがって、以下の実施形態の記載をもって、特許請求の範囲に記載された発明の内容を限定するものではない。
(第1実施形態)
以下、図1~図21を参照して、本発明の第1実施形態に係る点群処理システム10について説明する。図1は、本実施形態に係る実施形態に係る点群処理システム10を示す図である。
図1に示すように、点群処理システム10は、点群符号化装置100及び点群復号装置200を有する。
点群符号化装置100は、入力点群信号を符号化することによって符号化データ(ビットストリーム)を生成するように構成されている。点群復号装置200は、ビットストリームを復号することによって出力点群信号を生成するように構成されている。
なお、入力点群信号及び出力点群信号は、点群内の各点の位置情報と属性情報とから構成される。属性情報は、例えば、各点の色情報や反射率である。
ここで、かかるビットストリームは、点群符号化装置100から点群復号装置200に対して伝送路を介して送信されてもよい。また、ビットストリームは、記憶媒体に格納された上で、点群符号化装置100から点群復号装置200に提供されてもよい。
(点群復号装置200)
以下、図2を参照して、本実施形態に係る点群復号装置200について説明する。図2は、本実施形態に係る点群復号装置200の機能ブロックの一例について示す図である。
図2に示すように、点群復号装置200は、幾何情報復号部2010と、ツリー合成部2020と、近似表面合成部2030と、幾何情報再構成部2040と、逆座標変換部2050と、属性情報復号部2060と、逆量子化部2070と、RAHT部2080と、LoD算出部2090と、逆リフティング部2100と、逆色変換部2110とを有する。
幾何情報復号部2010は、点群符号化装置100から出力されるビットストリームのうち、幾何情報に関するビットストリーム(幾何情報ビットストリーム)を入力とし、シンタックスを復号するように構成されている。
復号処理は、例えば、コンテクスト適応二値算術復号処理である。ここで、例えば、シンタックスは、位置情報の復号処理を制御するための制御データ(フラグやパラメータ)を含む。
ツリー合成部2020は、幾何情報復号部2010によって復号された制御データ及び後述するツリー内のどのノードに点群が存在するかを示すoccupancy codeを入力として、復号対象空間内のどの領域に点が存在するかというツリー情報を生成するように構成されている。
なお、occupancy codeの復号処理をツリー合成部2020内部で行うよう構成されていてもよい。
本処理は、復号対象空間を直方体で区切り、occupancy codeを参照して各直方体内に点が存在するかを判断し、点が存在する直方体を複数の直方体に分割し、occupancy codeを参照するという処理を再帰的に繰り返すことで、ツリー情報を生成することができる。
ここで、かかるoccupancy codeの復号に際して、インター予測を用いてもよい。
本実施形態では、上述の直方体を常に立方体として8分木分割を再帰的に行う「Octree」と呼ばれる手法、及び、8分木分割に加え、4分木分割及び2分木分割を行う「QtBt」と呼ばれる手法を使用することができる。QtBt」を使用するか否かは、制御データとして点群符号化装置100側から伝送される。
なお、本実施形態では、「Octree」によって上述の立方体が1×1×1のサイズになるまで分割を行うことで幾何情報を復号する方法を、特に「Octreeのみ」と呼ぶ。
また、「Octree」に「QtBt」を組み合わせて使用した場合でも、上記同様に「Octree」及び「QtBt」のみで上述の直方体が1×1×1のサイズになるまで分割を行うことで幾何情報を復号する方法についても、「Octreeのみ」と呼んでもよい。
或いは、制御データによってPredictive codingを使用するように指定された場合、ツリー合成部2020は、点群符号化装置100において決定した任意のツリー構成に基づいて各点の座標を復号するように構成されている。
近似表面合成部2030は、ツリー合成部2020によって生成されたツリー情報を用いて近似表面情報を生成し、かかる近似表面情報に基づいて点群を復号するように構成されている。
近似表面情報は、例えば、物体の3次元点群データを復号する際等において、点群が物体表面に密に分布しているような場合に、個々の点群を復号するのではなく、点群の存在領域を小さな平面で近似して表現したものである。
具体的には、近似表面合成部2030は、例えば、「Trisoup」と呼ばれる手法で、近似表面情報を生成し、点群を復号することができる。「Trisoup」の具体的な処理例については後述する。また、Lidar等で取得した疎な点群を復号する場合は、本処理を省略することができる。
幾何情報再構成部2040は、ツリー合成部2020によって生成されたツリー情報及び近似表面合成部2030によって生成された近似表面情報を元に、復号対象の点群データの各点の幾何情報(復号処理が仮定している座標系における位置情報)を再構成するように構成されている。
逆座標変換部2050は、幾何情報再構成部2040によって再構成された幾何情報を入力として、復号処理が仮定している座標系から、出力点群信号の座標系に変換を行い、位置情報を出力するように構成されている。
属性情報復号部2060は、点群符号化装置100から出力されるビットストリームのうち、属性情報に関するビットストリーム(属性情報ビットストリーム)を入力とし、シンタックスを復号するように構成されている。
復号処理は、例えば、コンテクスト適応二値算術復号処理である。ここで、例えば、シンタックスは、属性情報の復号処理を制御するための制御データ(フラグ及びパラメータ)を含む。
また、属性情報復号部2060は、復号したシンタックスから、量子化済み残差情報を復号するように構成されている。
逆量子化部2070は、属性情報復号部2060によって復号された量子化済み残差情報と、属性情報復号部2060によって復号された制御データの一つである量子化パラメータとを元に、逆量子化処理を行い、逆量子化済み残差情報を生成するように構成されている。
逆量子化済み残差情報は、復号対象の点群の特徴に応じて、RAHT部2080及びLoD算出部2090のいずれかに出力される。いずれに出力されるかは、属性情報復号部2060によって復号される制御データによって指定される。
RAHT部2080は、逆量子化部2070によって生成された逆量子化済み残差情報及び幾何情報再構成部2040によって生成された幾何情報を入力とし、RAHT(Region Adaptive Hierarchical Transform)と呼ばれるHaar変換(復号処理においては、逆Haar変換)の一種を用いて、各点の属性情報を復号するように構成されている。RAHTの具体的な処理としては、例えば、非特許文献1に記載の方法を用いることができる。
LoD算出部2090は、幾何情報再構成部2040によって生成された幾何情報を入力とし、LoD(Level of Detail)を生成するように構成されている。
LoDは、ある点の属性情報から、他のある点の属性情報を予測し、予測残差を符号化或いは復号するといった予測符号化を実現するための参照関係(参照する点及び参照される点)を定義するための情報である。
言い換えると、LoDは、幾何情報に含まれる各点を複数のレベルに分類し、下位のレベルに属する点については上位のレベルに属する点の属性情報を用いて属性を符号化或いは復号するといった階層構造を定義した情報である。
LoDの具体的な決定方法としては、例えば、上述の非特許文献1に記載の方法を用いてもよい。
逆リフティング部2100は、LoD算出部2090によって生成されたLoD及び逆量子化部2070によって生成された逆量子化済み残差情報を用いて、LoDで規定した階層構造に基づいて各点の属性情報を復号するように構成されている。逆リフティングの具体的な処理としては、例えば、上述の非特許文献1に記載の方法を用いることができる。
逆色変換部2110は、復号対象の属性情報が色情報であり且つ点群符号化装置100側で色変換が行われていた場合に、RAHT部2080又は逆リフティング部2100から出力される属性情報に逆色変換処理を行うように構成されている。かかる逆色変換処理の実行の有無については、属性情報復号部2060によって復号された制御データによって決定される。
点群復号装置200は、以上の処理により、点群内の各点の属性情報を復号して出力するように構成されている。
(幾何情報復号部2010)
以下、図3~図6を用いて幾何情報復号部2010で復号される制御データについて説明する。
図3は、幾何情報復号部2010で受信する符号化データ(ビットストリーム)の構成の一例である。
第1に、ビットストリームは、GPS2011を含んでいてもよい。GPS2011は、ジオメトリパラメータセットとも呼ばれ、幾何情報の復号に関する制御データの集合である。具体例については後述する。各GPS2011は、複数のGPS2011が存在する場合に個々を識別するためのGPS id情報を少なくとも含む。
第2に、ビットストリームは、GSH2012A/2012Bを含んでいてもよい。GSH2012A/2012Bは、ジオメトリスライスヘッダ或いはジオメトリデータユニットヘッダとも呼ばれ、後述するスライスに対応する制御データの集合である。以降では、スライスという呼称を用いて説明するが、スライスをデータユニットと読み替えることもできる。具体例については後述する。GSH2012A/2012Bは、各GSH2012A/2012Bに対応するGPS2011を指定するためのGPS id情報を少なくとも含む。
第3に、ビットストリームは、GSH2012A/2012Bの次に、スライスデータ2013A/2013Bを含んでいてもよい。スライスデータ2013A/2013Bには、幾何情報を符号化したデータが含まれている。スライスデータ2013A/2013Bの一例としては、後述するoccupancy codeが挙げられる。
以上のように、ビットストリームは、各スライスデータ2013A/2013Bに、1つずつGSH2012A/2012B及びGPS2011が対応する構成となる。
上述のように、GSH2012A/2012Bにて、どのGPS2011を参照するかをGPS id情報で指定するため、複数のスライスデータ2013A/2013Bに対して共通のGPS2011を用いることができる。
言い換えると、GPS2011は、スライスごとに必ずしも伝送する必要がない。例えば、図3のように、GSH2012B及びスライスデータ2013Bの直前では、GPS2011を符号化しないようなビットストリームの構成とすることもできる。
なお、図3の構成は、あくまで一例である。各スライスデータ2013A/2013Bに、GSH2012A/2012B及びGPS2011が対応する構成となっていれば、ビットストリームの構成要素として、上述以外の要素が追加されてもよい。
例えば、図3に示すように、ビットストリームは、シーケンスパラメータセット(SPS)2001を含んでいてもよい。また、同様に、伝送に際して、図3と異なる構成に整形されてもよい。更に、後述する属性情報復号部2060で復号されるビットストリームと合成して単一のビットストリームとして伝送されてもよい。
図4は、GPS2011のシンタックス構成の一例である。
なお、以下で説明するシンタックス名は、あくまで一例である。以下で説明したシンタックスの機能が同様であれば、シンタックス名は異なっていても差し支えない。
GPS2011は、各GPS2011を識別するためのGPS id情報(gps_geom_parameter_set_id)を含んでもよい。
なお、図4のDescriptor欄は、各シンタックスが、どのように符号化されているかを意味している。ue(v)は、符号無し0次指数ゴロム符号であることを意味し、u(1)は、1ビットのフラグであることを意味する。
GPS2011は、近似表面合成部2030でTrisoupを使用するか否かを制御するフラグ(trisoup_enabled_flag)を含んでもよい。
例えば、trisoup_enabled_flagの値が「0」の時はTrisoupを使用しないと定義し、trisoup_enabled_flagの値が「1」の時はTrisoupを使用すると定義してもよい。
幾何情報復号部2020は、Trisoupを使用するとき、すなわち、trisoup_enabled_flagの値が「1」の時、追加で以下のシンタックスを復号するように構成されていてもよい。
なお、trisoup_enabled_flagは、GPS2011ではなくSPS2001に含まれていてもよい。
GPS2011は、複数レベルでのTrisoupを許可するか否かを制御するフラグ(trisoup_multilevel_enabled_flag、第1フラグ)を含んでもよい。
例えば、trisoup_multilevel_enabled_flagの値が「0」の時は複数レベルでのTrisoupを許可しない、すなわち、単一のレベルでのTrisoupを行うと定義し、trisoup_multilevel_enabled_flagの値が「1」の時は複数レベルでのTrisoupを許可すると定義してもよい。
なお、当該シンタックスがGPS2011に含まれない場合、当該シンタックスの値を単一のレベルでのTrisoupを行う場合の値、すなわち、「0」とみなしてよい。
なお、trisoup_multilevel_enabled_flagは、GPS2011ではなくSPS2001に含まれるよう定義してもよい。この場合、SPS2001にtrisoup_multilevel_enabled_flagが含まれていない場合、当該シンタックスの値を単一のレベルでのTrisoupを行う場合の値、すなわち、「0」とみなしてよい。
図5及び図6は、GSH2012のシンタックス構成の一例である。なお、前述の通り、GSHは、GDUH(Geometry Data Unit Header)とも呼ばれる。
幾何情報復号部2020は、複数レベルでのTrisoupを許可するとき、すなわち、trisoup_multilevel_enabled_flagの値が「1」の時、追加で以下のシンタックスを復号するように構成されていてもよい。
GSH2012は、複数レベルでのTrisoupを許可するとき、Trisoupノードサイズの最大値を規定するシンタックス(log2_trisoup_max_node_size_minus2)を含んでもよい。
当該シンタックスは、実際のTrisoupノードサイズの最大値について、2を底とする対数に変換した値として表現されていてもよい。更に、当該シンタックスは、実際のTrisoupノードサイズの最大値について、2を底とする対数に変換した後に2を引いた後の値として表現されていてもよい。
GSH2012は、複数レベルでのTrisoupを許可するとき、Trisoupノードサイズの最小値を規定するシンタックス(log2_trisoup_min_node_size_minus2)を含んでもよい。
当該シンタックスは、実際のTrisoupノードサイズの最小値について、2を底とする対数に変換した値として表現されていてもよい。更に、当該シンタックスは、実際のTrisoupノードサイズの最小値を4(=22)とし、2を底とする対数に変換した後に2を引いた後の値として表現されていてもよい。
また、当該シンタックスの値は、必ず0以上且つlog2_trisoup_max_node_size_minus2以下となるように制約されていてもよい。
また、この時、図5に示すようにtrisoup_depthをtrisoup_depth=log2_trisoup_max_node_size_minus2-log2_trisoup_min_node_size_minus2+1と定義してもよい。
また、最小Trisoupノードサイズ及び最大Trisoupノードサイズを直接復号する代わりに、後述のOctree処理における最大Trisoupノードサイズ及び最小Trisoupノードサイズに対応するDepth値を復号してもよい。
例えば、最大Depth(全ノードが1×1×1のサイズになるDepth)が10の場合、最小Trisoupノードサイズを4(=22)、最大Trisoupノードサイズを16(=24)としたい場合は、最小Trisoupノードサイズに対応するDepth値として8、最大Trisoupノードサイズに対応するDepth値として6をそれぞれ復号してもよい。
GSH2012は、複数レベルでのTrisoupを許可するとき、Trisoupノードサイズを復号するノード(以下、CTUと呼ぶ)のサイズを規定するシンタックス(log2_trisoup_ctu_size_minus2)を含んでもよい。
かかるシンタックスは、2を底とする対数に変換した値として表現されていてもよい。
さらに、かかるシンタックスは、実際のTrisoupノードサイズの最小値を4(=22)とし、2を底とする対数に変換した後に2を引いた後の値として表現されていてもよい。
また、かかるシンタックスの値は、必ず前記最大Trisoupノードサイズ以上の値となるように制約されていても良よ。
また、かかるシンタックスの値は、2を底とする対数にCTUサイズを変換した値から、2を底とする対数に最大Trisoupノードサイズを変換した値を引いた後の値として表現されていてもよい。
幾何情報復号部2020は、複数レベルでのTrisoupを許可しないとき、すなわち、trisoup_multilevel_enabled_flagの値が「0」の時、追加で以下のシンタックスを復号するように構成されていてもよい。
以上のように、本実施形態における幾何情報復号部2020は、上述のTrisoupを適用するノードサイズの最大値である最大Trisoupノードサイズと、Trisoupを適用するノードサイズの最小値である最小Trisoupノードサイズとを復号するように構成されていてもよい。
また、以上のように、本実施形態における幾何情報復号部2020は、所定サイズ(CTUサイズ)を、最大Trisoupノードサイズ以上の値として復号するように構成されていてもよい。
このような構成とすることで、所定サイズの領域(CTU)ごとに最大Trisoupノードサイズと最小Trisoupノードサイズとの間でノードサイズを選択可能となる。
また、以上のように、本実施形態における幾何情報復号部2020は、上述の最大Trisoupノードサイズを、所定サイズの値とするように構成されていてもよい。
このような構成とすることで、CTUサイズの復号を省略できるため、符号量及び処理量を削減できる。
GSH2012は、複数レベルでのTrisoupを許可しないときで且つTrisoupを使用するとき、Trisoupノードサイズを規定するシンタックス(log2_trisoup_node_sizeTrisoup_node_size_minus2)を含んでもよい。
かかるシンタックスは、実際のTrisoupノードサイズについて、2を底とする対数に変換した値として表現されていてもよい。
さらに、かかるシンタックスは、実際のTrisoupノードサイズについて、2を底とする対数に変換した後に2を引いた後の値として表現されていてもよい。
また、この際、図5に示すように、trisoup_depthをtrisoup_depth=1と定義してもよい。
GSH2012は、Trisoupを使用するとき、再構成点のサブサンプリング間隔を制御するシンタックス(trisoup_sampling_value_minus1)を含んでもよい。
また、かかるシンタックスの代わりに、図6に示すように、サブサンプリング後の最大点数を示す閾値(trisoup_sampling_threshold)を復号してもよい。これらのシンタックスの値に基づいた具体的なサブサンプリング方法については後述する。
GSH2012は、後述するTrisoupの頂点位置の精度(bit数)を指定するシンタックス(trisoup_vertex_number_bits)を含んでもよい。例えば、当該シンタックスの値が2である場合、頂点位置は、2bitであること、すなわち、0、1、2、3の4種類の値を取り得ることを意味する。
ここで、trisoup_vertex_number_bitsは、上述のように、trisoup_depthの値に関わらず常に1つの値だけを伝送してもよいし、trisoup_depthの値に応じて復号する数を変化させてもよい。
例えば、各trisoup_depthに対応するtrisoup_vertex_number_bitsがそれぞれ復号されてもよい。言い換えると、trisoup_depthと同じ数だけ、trisoup_vertex_number_bitsが復号されてもよい。具体的には、例えば、trisoup_depthが2の場合、trisoup_vertex_number_bitsの値が2種類伝送されてもよい。
GSH2012は、後述するTrisoupの頂点のセントロイドの残差を復号するか否かを示すフラグ(trisoup_centroid_vertex_residual_flag)を含んでもよい。例えば、当該フラグの値が1の場合は、セントロイドの残差を復号することを意味し、当該フラグの値が0の場合は、セントロイドの残差を復号しないことを意味するように定義されていてもよい。
ここで、trisoup_centroid_vertex_residual_flagは、上述のように、trisoup_depthの値に関わらず常に1つの値だけを伝送してもよいし、trisoup_depthの値に応じて復号する数を変化させてもよい。
例えば、各trisoup_depthに対応するtrisoup_centroid_vertex_residual_flagがそれぞれ復号されてもよい。言い換えると、trisoup_depthと同じ数だけ、trisoup_centroid_vertex_residual_flagが復号されてもよい。具体的には、例えば、trisoup_depthが2の場合、trisoup_centroid_vertex_residual_flagの値が2種類伝送されてもよい。
GSH2012は、Trisoupを使用するとき、かつ、複数レベルでのTrisoupを許可するとき、階層i(i=0,...,trisoup_depth-1)ごとにユニークセグメントが対象階層に存在するか否かを示すフラグ(unique_segments_exist_flag[i])を含んでもよい。
例えば、unique_segments_exist_flag[i]の値が「1」の場合は、階層iに少なくとも1つ以上のユニークセグメントが存在することを意味する。また、unique_segments_exist_flag[i]の値が「0」の場合は、階層iにユニークセグメントが1つも存在しないことを意味する。
GSH2012は、階層i(i=0,...,trisoup_depth-1)ごとにユニークセグメントが対象階層に存在する場合、すなわち、unique_segments_exist_flag[i]の値が「1」の場合、追加で対象階層のユニークセグメント数を示すシンタックスのビット数を示すシンタックス(num_unique_segments_bits_minus1[i])及び対象階層のユニークセグメント数を示すシンタックス(num_unique_segments_minus1[i])を含んでもよい。
ここで、num_unique_segments_bits_minus1[i]及びnum_unique_segments_minus1[i]の両方について、それぞれ本来の値から「1」を引いた値をシンタックスの値として符号化してもよい。
(ツリー合成部2020)
以下、図7を用いてツリー合成部2020の処理について説明する。図6は、ツリー合成部2020における処理の一例を示すフローチャートである。なお、以下では「Octree」を使用してツリーを合成する場合の例について説明する。
ステップS601において、ツリー合成部2020は、全てのDepthの処理が完了したかどうかを確認する。なお、Depth数は、点群符号化装置100から点群復号装置200に伝送するビットストリーム内に制御データとして含まれていてもよい。
ツリー合成部2020は、対象Depthのノードサイズを算出する。「Octree」の場合、最初のDepthのノードサイズは、「2のDepth数乗」と定義されてもよい。すなわち、Depth数をNとする場合、最初のDepthのノードサイズは、2のN乗と定義されてもよい。
また、2番目以降のDepthでのノードサイズは、Nの数を1つずつ減じていくことで定義されてもよい。すなわち、2番目のDepthのノードサイズは、「2の(N-1)乗」として定義され、3番目のDepthのノードサイズは、「2の(N-2)乗」として定義され、・・・と定義されてもよい。
或いは、ノードサイズは、常に2のべき乗で定義されるため、単純に指数部分(N、N-1、N-2、等)の値をノードサイズと考えてもよい。以降の説明では、ノードサイズとは、ノードの1辺の長さの指数部分の値を指すこととする。
なお、以降では簡単のため、ノード形状が立方体の場合、すなわち、ノードの全ての辺の長さが等しい場合を例に説明する。
QtBtを用いる場合、すなわち、ノード形状が直方体になり、ノードの各辺の長さが軸方向(x、y、z)毎に異なる場合、3方向のうち最も短い辺の長さをノードサイズと考えてもよい。同様に、3方向のうち最も長い辺の長さをノードサイズと考えてもよい。
ここで、Trisoupを使用するか否かを制御するフラグ(trisoup_enabled_flag)がTrisoupを使用することを示している場合、すなわち、trisoup_enabled_flagの値が「1」の時は、ツリー合成部2020は、処理するDepth数を、Trisoupノードサイズの最小値を規定するシンタックス(log2_trisoup_min_node_size_minus2)又はTrisoupノードサイズを規定するシンタックス(log2_Trisoup_node_size_minus2)の値に基づいて変化させてもよい。かかる場合、例えば、以下のように定義してもよい。
処理Depth数=全Depth数-(最小の)Trisoupノードサイズ
ここで、最小のTrisoupノードサイズについては、例えば、(log2_trisoup_min_node_size_minus2+2)で定義できる。同様に、Trisoupノードサイズについては、(log2_Trisoup_node_size_minus2+2)で定義できる。
この場合、全ての処理Depth数の処理が完了した場合は、ツリー合成部2020は、ステップS609へ進み、そうでない場合は、ツリー合成部2020は、ステップS602へ進む。
言い換えると、(処理Depth数-n)=0の場合は、ツリー合成部2020は、ステップS609へ進み、(処理Depth数-n)>0の場合は、ツリー合成部2020は、ステップS602へ進む。
また、ツリー合成部2020は、ステップS609へ進む際のノードサイズ(N-処理Depth数)を持つ全てのノードには、Trisoupが適用されると判定してもよい。
ステップS602において、ツリー合成部2020は、対象Depthにて後述するTrisoup_node_sizeを復号する必要があるか否かを判定する。
例えば、「複数レベルでのTrisoupが許可(trisoup_multilevel_enabled_flagの値が「1」)」で、且つ、「対象Depthのノードサイズ(N-n)がCTUサイズ」の場合に、ツリー合成部2020は、「Trisoup_node_sizeの復号が必要である」と判定してもよい。
なお、本実施例では、「Trisoupノードサイズを復号するノード」のことをCTU(Coding Tree Unit)と呼ぶ。CTUという名称はあくまで一例であり、「Trisoupノードサイズを復号するノード」であれば、他の名称でもよい。
また、ツリー合成部2020は、上述の条件が満たされない場合、「Trisoup_node_sizeの復号が必要ない」と判定してもよい。
ここで、最大のTrisoupノードサイズについては、例えば、(log2_trisoup_max_node_size_minus2+2)で定義できる。
同様に、最小のTrisoupノードサイズについては、例えば、(log2_trisoup_min_node_size_minus2+2)で定義できる。
上述の判定が完了したら、ツリー合成部2020は、ステップS603へ移る。
ステップS603において、ツリー合成部2020は、対象Depthに含まれる全てのノードの処理が完了したかどうかを判定する。
対象Depthの全てのノードの処理が完了したと判定した場合、ツリー合成部2020は、ステップS601へ移り、次のDepthの処理を行う。
一方、対象Depthの全てのノードの処理が完了していない場合、ツリー合成部2020は、ステップS604へ移る。
ステップS604において、ツリー合成部2020は、ステップS602で判定したTrisoup_node_sizeの復号の要否について確認する。
なお、ステップS602を省略して、ステップS604の処理タイミングにおいて、ステップS602と同様な方法でTrisoup_node_sizeの復号の要否を判定してもよい。
Trisoup_node_sizeの復号が必要であると判定されている場合は、ツリー合成部2020は、ステップS605へ進み、Trisoup_node_sizeの復号が必要でないと判定されている場合は、ツリー合成部2020は、ステップS606へ移る。
ステップS605において、ツリー合成部2020は、Trisoup_node_sizeを復号する。
Trisoup_node_sizeは、かかるCTUをOctree又はQtBtによって再帰的に分割することで得られる子孫ノードが、どのサイズになった際にTrisoupを適用するかを示す情報である。
例えば、CTUサイズが5(=25=32)であり、復号したTrisoup_node_sizeが2(=22=4)である場合、当該CTUをOctreeによって3回(=5―2)分割した際に得られる各ノード(ノードサイズ2)に対して、Trisoupを適用することを意味してもよい。
ここで復号したTrisoupを適用するノードサイズ(以降、Trisoupノードサイズと呼ぶ)を、当該ノードの付加情報として記憶する。なお、Trisoupノードサイズの初期値は0(=20=1)としておき、ステップS605において復号した値で上書きしてもよい。
ツリー合成部2020は、Trisoup_node_sizeを復号した後、ステップS606へ移る。
ステップS606において、ツリー合成部2020は、当該ノードの内部情報として記憶しているTrisoupノードサイズの値を確認する。
対象ノードにTrisoupを適用する場合、すなわち、当該ノードのサイズと当該ノードの内部情報として記憶しているTrisoupノードサイズが等しい場合、ツリー合成部2020は、ステップS607へ移る。
対象ノードにTrisoupを適用しない場合、すなわち、当該ノードのサイズと当該ノードの内部情報として記憶しているTrisoupノードサイズが異なる場合は、ツリー合成部2020は、ステップS608へ移る。
ステップS607において、ツリー合成部2020は、対象ノードを、Trisoupを適用するノード、すなわち、Trisoupノードとして記憶する。かかる対象ノードに対しては、これ以上、「Octree」によるノードの分割を適用しないこととする。その後、ツリー合成部2020は、ステップS603に進み、次のノードの処理へ移る。
ステップS608において、ツリー合成部2020は、occpancy codeと呼ばれる情報を復号する。
occpancy codeは、「Octree」の場合は、対象ノードをx、y、z軸方向にそれぞれ半分に分割して、8つのノード(子ノードと呼ぶ)に分割した際に、それぞれの子ノード内に復号対象の点が含まれているか否かを示す情報である。
例えば、occpancy codeは、各子ノードに対して1ビットの情報を割り当て、かかる1ビットの情報が「1」の場合は、かかる子ノード内に復号対象の点が含まれると定義され、かかる1ビットの情報が「0」の場合は、かかる子ノード内に復号対象の点が含まれないと定義されてもよい。
ツリー合成部2020は、かかるoccpancy codeを復号する際に、各子ノードに復号対象の点が存在する確率を予め推定し、その確率に基づいて各子ノードに対応するビットをエントロピー復号してもよい。
また、ステップS608では、ツリー合成部2020は、後述するS901で使用するために、Trisoupを適用しなかったノードの位置情報をDepthごとに一次元配列等に保存するようにしてもよい。
具体的には、ツリー合成部2020は、ステップS608における対象ノード(分割する前のノード)の位置情報を保存するようにしてもよい。例えば、ツリー合成部2020は、対象ノード(直方体)の頂点のうち、一番原点に近い点の座標値をDepthごとに一次元配列に保存し、この情報が、後述する近似表面合成部2030で使用されてもよい。
直方体のサイズ(x軸、y軸、z軸方向の辺の長さ)がDepthごとに決定している場合、上記のようにノード内の一番原点に近い点の座標値とDepthが特定できれば、当該ノードの位置情報を復元することができる。
同様に、点群符号化装置100においては、エントロピー符号化してもよい。
また、ステップS608では、当該ノードの内部情報として記憶しているTrisoupノードサイズを、当該ノードの各子ノードの内部情報として記憶させてもよい。言い換えると、Trisoupノードサイズを子ノードに継承してもよい。これにより、ステップS605で復号したTrisoupノードサイズの値を、子孫ノードに伝播することができる。
(近似表面合成部2030)
以下、図8~図20を用いて近似表面合成部2030の処理の一例について説明する。
図8は、近似表面合成部2030の処理の一例を示すフローチャートである。
図8に示すように、ステップS701において、近似表面合成部2030は、全てのtrisoup_depthでの処理が完了したかどうかを判定する。
全てのtrisoup_depthについて処理が完了した場合、ステップS709へ進む。全てのtrisoup_depthの処理が完了していない場合、ステップS702へ進む。
ステップS702において、近似表面合成部2030は、当該trisoup_depthに対応するTrisoupノードサイズが、最大Trisoupノードサイズと等しいかどうかを判定する。
両者が等しい場合は、本動作は、ステップS704へ進み、両者が等しくない場合、すなわち、当該trisoup_depthに対応するTrisoupノードサイズが、最大Trisoupノードサイズより小さい場合、本動作は、ステップS703へ進む。
ステップS702において、近似表面合成部2030は、ノード毎の頂点位置の取得及び統合を行う。
ステップS703において、近似表面合成部2030は、後述するステップS708によって生成される「内挿された頂点(内挿処理が行われた頂点)」に対応するセグメントを生成する。図9は、ステップS703の処理の一例を示すフローチャートである。
以下、図9を用いて、ステップS703の処理の一例について説明する。
図9に示すように、ステップS801において、近似表面合成部2030は、後述するステップS708で生成した全ての「内挿された頂点」について処理が完了したか否かを判定する。
完了した場合、本動作は、ステップS805へ進み、処理を終了する。完了していない場合、本動作は、次の「内挿された頂点」について処理するため、ステップS802へ進む。
ステップS802において、近似表面合成部2030は、「内挿された頂点」がどの方向(x、y、z方向のいずれか)のセグメント上に存在する点なのかを判定する。
例えば、後述するようにセグメント及びTrisoupの頂点が、整数座標位置から0.5ずれた位置に存在する場合、x方向のセグメントでは、「内挿された頂点」のx座標のみが、整数値(x.0)になり、y座標及びz座標は、小数値(x.5)となる。
同様に、y方向のセグメントでは、y座標のみが整数値となり、z方向のセグメントでは、z座標のみが整数値となるため、近似表面合成部2030は、いずれの軸方向の座標が整数であるについて確認することで、当該「内挿された頂点」が存在すべきセグメントの方向を判定することができる。
なお、座標値を整数形式で保存している場合、例えば、0.5を表現するために、真の座標値を2倍した上で整数値として保持している場合は、近似表面合成部2030は、各軸方向の座標値の最下位ビットが1であるかどうかで、整数か小数(x.5)かを判定することができる。
近似表面合成部2030は、このように判定した結果を保存し、次のステップS803へ進む。
ステップS803において、近似表面合成部2030は、当該「内挿された頂点」が、現在のTrisoupノードサイズにおける辺上に存在するか否かを判定する。例えば、近似表面合成部2030は、以下の方法で、かかる判定を行うことができる。
(1)第1に、近似表面合成部2030は、「内挿された頂点」のx、y、z軸のそれぞれの座標値を整数に量子化する。
具体的には、近似表面合成部2030は、各座標値に0.5を足した後に小数点以下を切り捨てする。
ここで、近似表面合成部2030は、座標値が真の値の2倍の整数値で保存されている場合、1を加えた後に2で除算し小数点以下を切り捨てする。
或いは、近似表面合成部2030は、座標値が真の値の2倍の整数値で保存されている場合、1を加えた後に右に1ビットシフトする。
なお、ここでは、x、y、z軸の全ての軸方向について整数化する場合を説明したが、近似表面合成部2030は、ステップS802で判定した「方向」以外の軸のみを整数化するようにしてもよい。
例えば、近似表面合成部2030は、上述の「方向」がx軸の場合、y座標及びz座標のみ整数化すればよい。
(2)第2に、近似表面合成部2030は、ステップS802で判定した「方向」以外の軸の整数化後の座標値が、当該Trisoupノードサイズの倍数になっているか否かを確認する。
例えば、近似表面合成部2030は、上述の「方向」がx軸方向で、当該Trisoupノードサイズの値が8(=23)の場合、当該整数化されたy座標及びz座標が、それぞれ8の倍数になっているかどうかを確認する。
上述の(2)の処理において、「方向」以外の軸の整数化後の座標値が、いずれも当該Trisoupノードサイズの倍数になっている場合、近似表面合成部2030は、当該「内挿された頂点」が現在のTrisoupノードサイズにおける辺上に存在すると判定し、ステップS804へ進む。
そうでない場合、すなわち、少なくとも1つの軸方向の座標値が当該Trisoupノードサイズの倍数になっていない場合、近似表面合成部2030は、当該「内挿された頂点」が現在のTrisoupノードサイズにおける辺上に存在しないと判定し、ステップS801へ進み、次の「内挿された頂点」の処理に移る。
ステップS804において、近似表面合成部2030は、ステップS803で整数化した「内挿された頂点」の座標を用いて、「内挿された頂点」に対応するセグメントを生成する。
ここで、セグメントは、始点の座標(x、y、z)、終点の座標(x、y、z)、及びセグメント上における頂点位置(0~Trisoupノードサイズー1)の3つの要素から構成されていてもよい。
上述の始点は、例えば、前記の整数化した「内挿された頂点」の座標値を、Trisoupノードサイズで量子化することにより得られる。
具体的には、例えば、Trisoupノードサイズの2を底とする対数をとった値をTrisoupNodeSizeLog2とすると、「内挿された頂点」の座標値にそれぞれ下記の演算を行うことで導出できる。
量子化後の座標値 = (座標値>>TrisoupNodeSizeLog2)<<TrisoupNodeSizeLog2
ここで、>>は、右ビットシフト、<<は、左ビットシフトをそれぞれ意味している。
なお、ステップS804の処理に進む場合、ステップS802で判定した「方向」以外の軸の座標値は、既にTrisoupノードサイズの倍数であることが明らかであるので、ステップS804では、近似表面合成部2030は、ステップS802で判定した「方向」に対応する軸の座標値のみ上記の量子化処理を行うこととしてもよい。
次に、終点の座標は、始点の座標に対して、ステップS802で判定した「方向」に対応する軸の座標値に、当該Trisoupノードサイズの値を加算することで算出できる。
最後に、セグメント上における頂点位置は、ステップS802で判定した「方向」に対応する軸における整数化された「内挿された頂点」の座標値から、上述の「方向」に対応する軸における始点の座標値を減ずることで導出できる。
以上の処理を行った後に、本動作は、ステップS801へ進み、次の「内挿された頂点」の処理に進む。
以上のように、近似表面合成部2030は、図8のステップS703において「内挿された頂点」からセグメントを生成した後、ステップS704へ進む。
ステップS704において、近似表面合成部2030は、次のステップS705における頂点の復号に用いるための隣接情報を収集する。
図10は、ステップS704の処理の一例を示すフローチャートである。以下、図10を用いて、ステップS704の処理の一例について説明する。
図10に示すように、ステップS901において、近似表面合成部2030は、マスク情報を生成する。図11に、マスク情報の生成方法の具体例を示す。
マスク情報を生成する場合、図11に示すように、近似表面合成部2030は、ステップS1001において、当該Trisoupノードサイズにおける全Trisoupノードについて処理が完了したか否かを判定する。
完了した場合は、本動作は、ステップS1003へ進み、完了していない場合は、本動作は、ステップS1002へ進む。
ステップS1002において、近似表面合成部2030は、当該Trisoupノードについて、36本のセグメント及び各セグメントに対応するマスク値を生成する。
図12に、セグメント及びマスク値の生成例を示す。図12の網掛け部分が、当該Trisoupノードの例を示し、各線分が、セグメントの例を示し、セグメント上に記載されている数字が、マスク値の例を示している。
なお、全てのセグメントについてマスク値の例を記載するのが困難であるため、マスク値の例は、一部のセグメントにのみ記載しているが、実際は、全てのセグメントについて、以下の通り、マスク値を設定する。
まず、近似表面合成部2030は、セグメントについては、当該Trisoupノードの12本の辺、x方向、y方向、z方向のそれぞれについて当該ノードより座標値の大きな隣接位置、及び、座標値の小さな隣接位置にそれぞれ4本ずつのセグメントを生成し、図12に示すように、計36本のセグメントを生成する。
ここで、各セグメントは、始点及び終点の情報を持ち、頂点は存在しないため、頂点位置の情報は保持しない。
次に、各セグメントのマスク値の設定例について説明する。
近似表面合成部2030は、当該Trisoupノードの12本の辺に対応するセグメントに対して、それぞれマスク値の下位4ビットのいずれかのビットのみが1で、それ以外が0のマスク値を設定する。
例えば、図12に示すように、近似表面合成部2030は、x軸方向のセグメントには、1、2、4、8のマスク値を設定してもよい。
同様に、近似表面合成部2030は、y軸方向のセグメントには、1+(1<<13)、2+(1<<13)、4+(1<<13)、8+(1<<13)のマスク値を設定してもよい。
同様に、近似表面合成部2030は、z軸方向のセグメントには、1+(1<<14)、2+(1<<14)、4+(1<<14)、8+(1<<14)のマスク値を設定してもよい。
このように設定した場合、マスク値の1ビット目~4ビット目のいずれかのビットが1の場合、当該セグメントに対応するノードがTrisoupノードであることが判別できる。
次に、近似表面合成部2030は、当該Trisoupノードよりx方向、y方向、z方向にそれぞれ座標値が大きくなる方向の隣接ノードに対応するセグメント(x、y、z方向のそれぞれで4本ずつ計12本)には、図12に示すように、それぞれ16、32、64、128のマスク値を設定してもよい。
このように設定した場合、マスク値の5ビット目~8ビット目のいずれかのビットが1の場合、当該セグメントに対して座標値が小さくなる方の隣接ノードが、Trisoupノードであることが判別できる。
次に、近似表面合成部2030は、当該Trisoupノードよりx方向、y方向、z方向にそれぞれ座標値が小さくなる方向の隣接ノードに対応するセグメント(x、y、z方向のそれぞれで4本ずつ計12本)には、図12に示すように、それぞれ256、512、1024、2048のマスク値を設定してもよい。
このように設定した場合、マスク値の9ビット目~12ビット目のいずれかのビットが1の場合、当該セグメントに対して座標値が大きくなる方の隣接ノードが、Trisoupノードであることが判別できる。
上述のように、近似表面合成部2030は、セグメント及びそれに対応するマスク値を生成した後、ステップS1001へ進み、次のTrisoupノードの処理に移る。
ここで、ステップS1001での処理対象のノードに、上述のステップS608で保存した、当該DepthにおいてTrisoupを適用しなかったノードを、本ステップの処理対象として加えてもよい。
「当該DepthにおいてTrisoupを適用しなかったノード」には、当該Depthにおいては、Trisoupが適用されないため、当該ノード自体にTrisoupの頂点等は生成されないが、当該Depthより大きなDepthにおいてTrisoupが適用されるはずの領域である。よって、ステップS1002で「当該DepthにおいてTrisoupを適用しなかったノード」のマスクを生成する際は、上述の「マスク値の1ビット目~4ビット目のいずれかのビットが1」になるマスクは設定せず、「マスク値の5ビット目~8ビット目のいずれかのビットが1」になるマスクと、「マスク値の9ビット目~12ビット目のいずれかのビットが1」になるマスクのみを設定する。
ステップS1003において、近似表面合成部2030は、ステップS703で生成した「内挿された頂点」に対応するセグメントについて、全てのセグメントの処理を完了したかどうかを判定する。
完了した場合は、本動作は、ステップS1005へ進み、ステップS901のマスク生成処理を終了する。完了していない場合、本動作は、ステップS1004へ進む。
ステップS1004において、近似表面合成部2030は、当該「内挿された頂点」に対応するセグメントについて、当該セグメントに「内挿された頂点」が存在することを意味するマスク値を生成する。
近似表面合成部2030は、このマスク値について、例えば、1<<15の値を設定しても良い。このような値を設定した場合、マスク値の16ビット目が1の場合、当該セグメントには「内挿された頂点」が存在すると判定することができる。
近似表面合成部2030は、マスク値を生成した後、ステップS1003へ進み、次のセグメントの処理に進む。
なお、ステップS1002及びステップS1004で生成したマスク値のそれぞれは、いずれも2のべき乗の値である。このようにすることで、後述するステップS905において、同一位置に存在するセグメントのマスク値を合成する際に、ビット演算(論理和)をとることで容易にマスク値を合成できる。
また、このように合成したマスク値の各ビットが1か0かで、上述したように、当該セグメントの情報(Trisoupノードか否か、隣接にTrisoupノードが存在するか、当該セグメントに「内挿された頂点」が存在するか等)を得ることができる。
近似表面合成部2030は、以上のようにマスク情報を生成した後、ステップS902へ進む。
ステップS902において、近似表面合成部2030は、ステップS901で生成したセグメント、及び、「内挿された頂点」に対応するセグメントを全てまとめた上で、ソートする。
近似表面合成部2030は、例えば、各セグメントの始点座標及び終点座標に基づいてソートする。かかる処理を行うことで、同一の始点と終点を持つセグメントが連続するように並べ替えることができる。
近似表面合成部2030は、かかるソートが完了した後に、ステップS903へ進む。
ステップS903において、近似表面合成部2030は、ステップS902でソートした後のセグメントについて、全てのセグメントの処理が完了したか否かを判定する。
完了した場合は、本動作は、ステップS909へ進み、ステップS704の隣接情報の収集処理を終了する。完了していない場合は、本動作は、ステップS904へ進む。
ステップS904において、近似表面合成部2030は、当該セグメントが、直前に処理したセグメントと同一位置であるかどうかを判定する。
具体的には、近似表面合成部2030は、例えば、セグメントの始点の座標及び終点の座標の両方が、直前に処理したセグメントと同一か否かを判定する。
直前に処理したセグメントと同一位置である場合は、本動作は、ステップS905へ進む。直前に処理したセグメントと同一位置ではない場合は、本動作は、ステップS906へ進む。
ステップS905において、近似表面合成部2030は、ステップS901で生成した当該セグメントに対応するマスク値と、直前までに処理した同一位置の各セグメントのマスク値とを統合する。
例えば、近似表面合成部2030は、ステップS901で説明したように各セグメントに対応するマスク値が2のべき乗で構成される場合、それぞれのセグメントのマスク値の論理和をとることでマスクを統合することができる。
近似表面合成部2030は、マスクを統合した後、ステップS907へ進む。
ステップS906において、近似表面合成部2030は、当該セグメントの直前に処理したセグメントを、所定条件Aを満たす場合、ユニークセグメントとして保存する。
例えば、所定条件Aは、直前に処理したセグメントがTrisoupノードに対応するセグメントである場合、としてもよい。
例えば、ステップS905で統合したマスク値の下位4ビットの少なくともいずれか1ビットが1である場合、直前に処理したセグメントはTrisoupノードに対応するセグメントであることが分かる。
近似表面合成部2030は、ユニークセグメントに関する情報として、例えば、当該ユニークセグメントに関する、始点の座標、終点の座標、後述するステップS907で説明する内挿点の情報、後述するステップS908で説明する隣接セグメントの情報、及び、ステップS905で統合したマスク値を、それぞれ保存することとしてもよい。これらの情報は、ステップS705の頂点の復号処理において使用される。
近似表面合成部2030は、ユニークセグメントに関する情報を保存した後、各種情報(内挿点の情報、隣接セグメントの情報、統合したマスク値等)を初期化する。
また、近似表面合成部2030は、所定条件を満たさなかった場合、初期化のみを実施する。以上の処理が完了後、本動作は、ステップS907へ進む。
ステップS907において、近似表面合成部2030は、所定条件Bを満たす場合、内挿点に関する情報を保存する。
例えば、所定条件Bは、当該セグメントのマスク値が、当該セグメントに「内挿された頂点」が存在することを示している場合としてもよい。具体的には、例えば、所定条件Bは、マスク値の16ビット目が1であること、としてもよい。
近似表面合成部2030は、所定条件Bを満たす場合、「内挿された頂点」の座標を保存する。具体的には、近似表面合成部2030は、ステップS804で生成した「セグメント上における頂点位置」の値を保存する。ここで保存された値は、ステップS906においてユニークセグメントに関する情報として保存される。
当該セグメントが、ステップS906においてユニークセグメントであると判定されなかった場合(ステップS906の所定条件Aが満たされなかった場合)は、ステップS907で保存された当該セグメントの内挿点に関する情報は、破棄される。
なお、近似表面合成部2030は、「セグメント上における頂点位置」の値を保存する配列を別途準備しておき、当該ステップではその配列における当該セグメントに対応する値を特定するためのindex値を、座標値そのものの代わりに保存するようにしてもよい。
以上の処理が完了した後、本動作は、ステップS908へ進む。
ステップS908において、近似表面合成部2030は、隣接セグメントの情報を保存する。
具体的には、例えば、近似表面合成部2030は、当該セグメントの始点座標、及び、始点座標或いは終点座標が同一のセグメントを特定するための情報(例えば、セグメントのインデックス等)を保存する。
例えば、当該セグメントの始点座標、及び、始点座標或いは終点座標が同一のセグメントは、具体的には、当該セグメントと同一の軸方向で、終点座標が当該セグメントの始点座標と同一になるセグメントが1つと、当該セグメントと直交する軸方向のセグメントが4つ存在する。ここで保存された情報は、ステップS906においてユニークセグメントに関する情報として保存される。
当該セグメントが、ステップS906においてユニークセグメントであると判定されなかった場合(ステップS906の所定条件Aが満たされなかった場合)は、ステップS908で生成された当該セグメントの隣接セグメントの情報は、破棄される。
上述の処理が完了後、本動作は、ステップS903へ進み、次のセグメントの処理へ進む。
以上のように、近似表面合成部2030は、ステップS704における隣接情報の収集を行った後、ステップS705へ進む。
ステップS705において、近似表面合成部2030は、当該trisoup_depthにおけるTrisoupの頂点を復号する。
図13は、ステップS705における頂点の復号方法の一例を示すフローチャートである。以下、図13を用いて、ステップS705の処理の一例を説明する。
図13に示すように、ステップS1201において、近似表面合成部2030は、ステップS703で生成した全てのユニークセグメントについて処理が終了したか否かを判定する。
全てのユニークセグメントについて処理が完了した場合、本動作は、ステップS1207へ進み、ステップS703の処理を終了する。全てのユニークセグメントについて処理が完了していない場合、本動作は、ステップS1202へ進む。
ステップS1202において、近似表面合成部2030は、当該ユニークセグメントに「内挿された頂点」が存在するか否かを判定する。
「内挿された頂点」が存在するか否かは、ステップS906で保存された統合されたマスク値に基づいて判定できる。「内挿された頂点」が存在する場合、本動作は、ステップS1203へ進む。「内挿された頂点」が存在しない場合、本動作は、ステップS1204へ進む。
ステップS1203において、近似表面合成部2030は、ステップS906で保存した「セグメント上における頂点位置」を、当該ユニークセグメントにおける頂点位置として保存する。
言い換えると、近似表面合成部2030は、ステップS906で保存した「セグメント上における頂点位置」を、当該ユニークセグメントにおける頂点位置の復号値とする。
さらに、近似表面合成部2030は、当該ユニークセグメントにおける「頂点有無」の復号値を、「頂点あり」とする。
すなわち、ステップS1203は、ビットストリームから頂点位置及び頂点の有無を示す情報を復号する代わりに、内挿された値を用いて頂点位置及び頂点有無を示す情報を暗黙的に決定する処理である。
上述の処理が完了した後、本動作は、ステップS1201へ進み、次のユニークセグメントの処理へ進む。
ステップS1204において、近似表面合成部2030は、ビットストリームから当該ユニークセグメントに頂点が存在するか否かを示す、頂点の有無を示す情報を復号する。
頂点の有無を示す情報は、1ビットのフラグであり、点群符号化装置100においてエントロピー符号化されていてもよい。近似表面合成部2030は、エントロピー符号化(符号化装置)/復号(復号装置)に際して、複数の確率モデルを用意しておき、コンテクストに応じて選択してもよい。コンテクストは、例えば、ステップS906で保存されて統合されたマスク値に基づいて設定されてもよい。
近似表面合成部2030は、頂点の有無を示す情報を復号した後、ステップS1205へ進む。
ステップS1205において、近似表面合成部2030は、当該ユニークセグメントに頂点が存在するか否かを判定する。
近似表面合成部2030は、ステップS1204で復号した頂点の有無を示す情報に基づき、頂点が存在する場合、ステップS1206へ進む。かかる頂点が存在しない場合は、近似表面合成部2030は、ステップS1201へ進み、次のユニークセグメントの処理へ進む。
ステップS1206において、近似表面合成部2030は、頂点が存在すると判定されたユニークセグメントにおいて、「セグメント上における頂点位置」を復号する。ここで、頂点位置は、エントロピー符号化されていてもよい。エントロピー符号化(符号化装置)/復号(復号装置)に際して、近似表面合成部2030は、複数の確率モデルを用意しておき、コンテクストに応じて選択してもよい。コンテクストは、例えば、ステップS906で保存された隣接セグメントの情報に基づいて設定されてもよい。
ここで、頂点位置は、上述のTrisoupの頂点位置の精度(bit数)を指定するシンタックス(trisoup_vertex_number_bits)で指定されたビット精度で復号されてもよい。
例えば、trisoup_vertex_number_bitsが2の場合、0、1、2、3の4種類の値をとるように復号されてもよい。更に、trisoup_vertex_number_bitsがDepth毎に復号されている場合、当該Depthに対応するビット精度で復号されてもよい。
また、trisoup_vertex_number_bitsで指定するビット精度は最小Trisoupノードサイズに対応するDepth(一番大きなDepth)でのみ使用し、以降、ノードサイズが1大きくなる(Depthが1小さくなる)に従って、ビット精度を1ずつ増やしてもよい。
例えば、ノードサイズが2種類(最小と最大の2段階)の場合、最小Trisoupノードサイズに対応するDepthでは、trisoup_vertex_number_bitsの値、最大Trisoupノードサイズに対応するDepthでは、trisoup_vertex_number_bitsに1を加えた値を、それぞれ当該Depthのビット精度として、頂点位置を復号してもよい。
近似表面合成部2030は、頂点位置を復号した後、ステップS1201へ進み、次のユニークセグメントの処理へ進む。
以上のように、近似表面合成部2030は、ステップS705において頂点を復号した後、ステップS706へ進む。
ステップS706において、近似表面合成部2030は、ステップS705で復号した頂点に基づいて、再構成点群を生成する。図14は、再構成点群の生成方法の一例を示すフローチャートである。以下、図14を用いて、ステップS706の処理の一例について説明する。
図14に示すように、ステップS1301において、近似表面合成部2030は、当該trisoup_depthにおける全てのTrisoupノードについて処理が完了したか否かを判定する。
全てのTrisoupノードについて処理が完了した場合、本動作は、ステップS1306へ進み、処理を終了する。全てのTrisoupノードについて処理が完了していない場合、本動作は、ステップS1302へ進む。
ステップS1302において、第1に、近似表面合成部2030は、当該Trisoupノードの各辺(セグメント)に対応するユニークセグメントを特定する。例えば、近似表面合成部2030は、ステップS705で処理した各ユニークセグメントの中から、当該Trisoupノードの各辺(セグメント)の始点座標と終点座標とが同一ユニークセグメントを探すことで、特定することができる。
第2に、近似表面合成部2030は、特定したユニークセグメントに頂点が存在する場合、以下の手順で、頂点を再構成点群に追加する。
(1)近似表面合成部2030は、セグメントの位置を、-0.5だけずらす。具体的には、近似表面合成部2030は、セグメントの始点座標及び終点座標のそれぞれについて、セグメントの方向に沿った軸以外の座標値から0.5を減ずる。
例えば、セグメントの始点座標が(x、y、z)=(12、100、32)で、ノードサイズが4で、且つ、当該セグメントの方向がx軸であった場合、終点座標は、始点のx座標にノードサイズを加えて(16、100、32)となる。
これに対して、x軸以外、すなわち、かかる例では、y座標及びz座標を、それぞれ0.5だけ減ずる。よって、始点座標及び終点座標は、それぞれ(12、99.5、31.5)及び(16、99.5、31.5)となる。
(2)近似表面合成部2030は、上述の始点座標に、当該セグメントの「セグメント上における頂点位置」を加算する。例えば、上述の例において、「セグメント上における頂点位置」が2である場合、(14、99.5、31.5)となる。
(3)近似表面合成部2030は、上述の(2)で求めた座標に対して、セグメントの方向に沿った軸以外の座標値に0.5を加える。例えば、上述の例においては、(14、100、32)となる。この値は、上述の(1)の手順を実行する前の当該ユニークセグメントの始点座標(12、100、32)に、当該ユニークセグメント上の頂点位置2を加算することでも同一の結果を得ることができるので、近似表面合成部2030は、そのように計算してもよい。
(4)上述の(3)で算出した座標が、当該Trisoupノードの内部に存在する場合、近似表面合成部2030は、上述の(3)で算出した座標に点を生成し、再構成点群に追加する。
ここで、当該Trisoupノードの内部とは、x、y、z座標の値が、それぞれ当該Trisoupノードの始点(x座標、y座標、z座標のそれぞれが一番小さい点)+Trisoupノードサイズ-1の範囲に存在する点である。
例えば、当該Trisoupノードの始点座標が(x、y、z)=(12、100、32)で、Trisoupノードサイズが4の場合、(12~15、100~103、32~35)の範囲に存在する点は、当該Trisoupノードの内部とみなす。
この場合、上述の(3)で算出した座標が(14、100、32)とすると、この座標は、当該Trisoupノードの内部であると判定され、近似表面合成部2030は、この座標の点を再構成点群に追加する。図16Aに、かかる結果を、x-y平面に投影したケースについて示す。
一方、例えば、当該Trisoupノードの始点座標が(x、y、z)=(12、96、32)の場合、(12~15、96~99、32~35)の範囲にある点が、Trisoupノードの内部となるため、この場合は、(14、100、32)は、Trisoupノードの内部には存在しないと判定され、上述の(3)で算出された座標は、再構成点群に追加させずに、本動作は、処理を終了する。図16Bに、かかるケースの例について示す。
上記の処理を終了した後、本動作は、ステップS1303へ進む。
ステップS1303において、近似表面合成部2030は、当該Trisoupノードに対応する頂点から、セントロイドの初期座標を算出する。
例えば、セントロイドの初期座標は、当該Trisoupノードの全ての頂点位置のx、y、z成分をそれぞれ平均することで算出され得る。なお、当該Trisoupノードの頂点が3点以下の場合、セントロイド処理の算出を省略してもよい。
かかる処理が完了した後、本動作は、ステップS1304へ進む。
ステップS1304において、近似表面合成部2030は、頂点のソート及び投影面の決定処理を行う。具体的には、例えば、近似表面合成部2030は、以下の手順で、頂点のソート及び投影面を決定できる。
(1)近似表面合成部2030は、頂点をx-y平面に投影する。かかる処理は、各頂点座標からx座標、y座標の値を抽出することと等価である。
頂点は、もともとノードの辺上に存在するため、投影した平面状では、各頂点は、ノードを平面に投影した正方形或いは長方形の辺上に存在することになる。正方形も、長方形の一種であるため、以降の説明では、投影後のノードの形状を長方形として説明する。
(2)近似表面合成部2030は、ノードを投影した長方形の辺上にある点を、時計回り或いは反時計回りの順になるようにソートする。
また、近似表面合成部2030は、ソートした順に、各頂点に仮のIndex値(0、1、2、・・・)を与える。
(3)近似表面合成部2030は、ソート順で隣接する2つの頂点及びセントロイドの3点で定義される三角形を定義し、この三角形の面積を算出する。三角形の面積は、例えば、セントロイドを始点としてそれぞれ2つの頂点座標に向かうベクトルを生成し、それらの外積を用いることで算出できる。
近似表面合成部2030は、このように、三角形の面積をソート順で隣接する2つの頂点の全ての組み合わせ(0、1)、(1、2)、・・・(N、0)について算出し、合算する。
なお、近似表面合成部2030は、頂点が3点しかない場合、セントロイドを用いず、3つの頂点で構成される三角形の面積を算出する。また、この面積は、投影した平面状での面積である。
(4)近似表面合成部2030は、上述の(1)~(3)の手順を、x-z平面及びy-z平面についても同様に行い、上述の(3)で算出した面積が最大になる平面を投影面とし、その際に、上述の(2)でソートした順及び付与した仮のIndexを、最終的なソート順及びIndexとして採用する。
以上のように、近似表面合成部2030は、頂点のソート及び投影面を決定した後に、ステップS1305に進む。
ステップS1305において、近似表面合成部2030は、ステップS1304で生成した三角形及びレイトレーシングによって再構成点群を生成する。
具体的には、近似表面合成部2030は、以下の手順で、再構成点群を生成する。
(1)第1に、近似表面合成部2030は、ステップS1304で決定したIndexとセントロイドとに基づいて、ステップS1304と同様に、三角形を生成する。但し、近似表面合成部2030は、ステップS1304では、2次元平面上で三角形を生成したが、ステップS1305では、各頂点のx、y、z座標の全てを使用して、3次元空間上で三角形を生成する。
(2)第2に、近似表面合成部2030は、投影面の法線ベクトル(投影面がx-y平面であれば、z方向のベクトル)を定義し、投影面上に配置する。
例えば、近似表面合成部2030は、初期位置を、投影面上での当該ノード形状(すなわち、長方形)の最も原点に近い点とする。
(3)第3に、近似表面合成部2030は、法線ベクトルのノルムを大きくしていった際に、上述の(1)で生成した三角形と交差するか否か、交差する場合は、その座標を算出する。
例えば、近似表面合成部2030は、一般的なレイトレーシングの手法等を用いることで、かかる処理を実現できる。図16Aに、三角形の構成の一例をについて示す。
(4)第4に、近似表面合成部2030は、上述の(3)で算出した法線ベクトルと三角形とが交差する座標が、当該Trisoupノードの内部に存在する場合、かかる座標位置に点を生成し、再構成点群に加える。
(5)第5に、近似表面合成部2030は、投影面上の当該ノード(長方形)内の各整数座標位置にそれぞれ配置した場合について、上述の(3)及び(4)の手順を繰り返す。
このとき、法線ベクトルを配置する間隔は、1(すなわち、全ての整数座標位置)としてもよい。ここで間隔1が、取りうる最も小さな間隔である。図16Aの三角形から生成した再構成点群の例について、図16Bに示す。
近似表面合成部2030は、以上のようにして、当該Trisoupノードに対する再構成点を生成した後、ステップS1301へ進み、次のTrisoupノードの処理に進む。
以上のように、ステップS706において、近似表面合成部2030は、再構成点群を生成した後、ステップS707へ進む。
ステップS707において、近似表面合成部2030は、当該trisoup_depthにおけるTrisoupノードサイズが、最小Trisoupノードサイズであるか否かを判定する。
最小Trisoupノードサイズである場合は、本動作は、ステップS701へ進む。そうでない場合、すなわち、当該trisoup_depthにおけるTrisoupノードサイズが、最小Trisoupノードサイズより大きい場合、本動作は、ステップS708へ進む。
ステップS708において、近似表面合成部2030は、ステップS705で復号したtrisoup_depthにおけるTrisoupノードサイズに対応する頂点に基づいて、最小Trisoupノードサイズにおけるノードのセグメント上に頂点を内挿する。
図15は、ステップS708の処理の一例を示すフローチャートである。以下、図15を用いて、ステップS708の処理例を説明する。なお、図15の処理は、図14の処理とほとんど共通しており、同一の処理には、同一の符号を付している。以下、図14との差異のみを説明する。
図15に示すように、ステップS1402において、近似表面合成部2030は、当該Trisoupノードの頂点を、「内挿された頂点」として保存する。
具体的には、近似表面合成部2030は、ステップS1302で説明した手順(1)及び(2)まで実施した後の座標値をそのまま「内挿された頂点」として保存する。
例えば、ステップS1302の例では、近似表面合成部2030は、(14、99.5、31.5)という座標値を「内挿された頂点」として保存する。これは、セグメントの位置が整数座標位置から0.5ずれた位置にあるように定義しているためである。
また、この値を整数として保持するために、近似表面合成部2030は、真の座標値を2倍にした値として保持してもよい。上述の例では、近似表面合成部2030は、(28、199、63)という値を「内挿された頂点」として保存してもよい。
ステップS1405において、近似表面合成部2030は、ステップS1305の手順(2)において、法線ベクトルを配置する位置を、当該Trisoupノードを最小Trisoupノードサイズで分割した時のセグメントが存在する位置に配置するように変更する。
ステップS1305の手順(3)と同様にして算出した交差する座標が、当該Trisoupノードを最小Trisoupノードサイズで分割した時のセグメント上にある場合、近似表面合成部2030は、かかる座標値を「内挿された頂点」として保存する。
ステップS1402で座標値を2倍することで整数化した値を保存した場合は、近似表面合成部2030は、ステップS1405においても、上述の座標値を2倍した値を保存する。
近似表面合成部2030は、以上の処理で生成した「内挿された頂点」を保存し、次のtrisoup_depthにおけるステップS703で使用する。
また、当該trisoup_depthが0より大きい場合、すなわち、当該trisoup_depthにおけるTrisoupノードサイズが最大Trisoupノードサイズではない場合、より大きなノードサイズに生成した「内挿された頂点」が存在するが、近似表面合成部2030は、これらの「内挿された頂点」の集合については削除せず、ステップS1402で新たに生成した「内挿された頂点」を、上述の集合に追加していく形で保存する。
なお、図16Cに示すように、近似表面合成部2030は、「内挿された頂点」については、当該Trisoupノードの表面に存在するもののみを保存するようにしてもよい。
なお、ここでは、便宜上、ステップS706及びステップS708について別々の処理として説明したが、両者は、共通部分が多いため、同時に実施されてもよい。
例えば、近似表面合成部2030は、ステップS1302において、ステップS707の条件が満たされる場合は、ステップS1402も実施し、同様に、ステップS1305において、ステップS707の条件が満たされる場合は、ステップS1405も実施するようにしてもよい。
ステップS709では、前記方法で生成した当該スライスにおける再構成点群をサブサンプリングする。図17は、ステップS709の処理の一例を示すフローチャートである。以下、図17を用いて、ステップS709の処理の一例を説明する。
図17に示すように、ステップS1701において、近似表面合成部2030は、再構成点群に含まれる再構成点をソートする。かかるソートは、事前に定めた方法で再構成点を並び替える処理である。
例えば、近似表面合成部2030は、各点の座標値を基にソートしてもよい。また、例えば、近似表面合成部2030は、各点のx座標が小さい順にソートしてもよい。
このとき、例えば、近似表面合成部2030は、x座標が同一の点が複数存在する場合は、y座標が小さい順にソートしてもよい。さらに、近似表面合成部2030は、x座標とy座標が同一の点が複数存在する場合は、z座標が小さい順にソートしてもよい。近似表面合成部2030は、かかるソートを行った後、ステップS1702へ進む。
ステップS1702において、近似表面合成部2030は、図5で説明した再構成点のサブサンプリング間隔を制御するシンタックス(trisoup_sampling_value_minus1)、或いは、図6で説明したサブサンプリング後の最大点数を示す閾値(trisoup_sampling_threshold)に基づいてサブサンプリング間隔Sを決定する。
例えば、近似表面合成部2030は、再構成点のサブサンプリング間隔を制御するシンタックスの値そのものをSとしてもよい。
また、例えば、近似表面合成部2030は、再構成点のサブサンプリング間隔の最小値を1として、再構成点のサブサンプリング間隔を制御するシンタックスの値に1を加えたものをSとしてもよい。
次に、サブサンプリング後の最大点数を示す閾値を用いてSを決定する方法の一例を説明する。
ここで、近似表面合成部2030は、(サブサンプリング前の)再構成点群に含まれる点数をNとしたとき、以下の関係を満たす最小の正の整数をSと設定してもよい。このとき、Sの最小値は、1である。
N/S≦trisoup_sampling_threshold
或いは、近似表面合成部2030は、以下の式を変形して、以下の関係を満たす最小の正の整数をSと設定してもよい。
N≦S×trisoup_sampling_threshold
以上のように、近似表面合成部2030は、サブサンプリング間隔Sを決定した後、ステップS1703へ進む。
ステップS1703において、近似表面合成部2030は、サブサンプリングを行う。
例えば、近似表面合成部2030は、ステップS1701でソートした順に各点にインデックスi(i=0、1、2、・・・、N-1)を付与したとき、i%S=0となる点のみを残し、それ以外の点を破棄することで、サブサンプリングしてもよい。ここで、%は、剰余を算出する演算子である。
近似表面合成部2030は、サブサンプリングの完了後、ステップS1704進み、処理を終了する。
以上のように、上述の構成によれば、一旦、細かい密度で点群を復号した後に、サブサンプリングすることで、任意の点数以下となる再構成点群を容易に生成できる。
また、かかる構成によれば、点群符号化装置100側から伝送されてきたシンタックスの値に基づいてサブサンプリング間隔Sを決定してサブサンプリングすることで、点群符号化装置100側で異なるスライス間でのサブサンプリング密度等や主観品質を考慮して、上述のシンタックスの値を設定することができ、再構成点群の主観品質を制御できるという利点がある。
近似表面合成部2030は、ステップS709のサブサンプリング処理が完了後、ステップS710へ進み、処理を終了する。
以上のように、本実施形態における近似表面合成部2030は、所定サイズのノードごとに、当該ノードをOctreeによって再帰的に分割することで得られる子孫ノードにTrisoupを適用するノードサイズを復号するように構成されていてもよい。
また、以上のように、本実施形態における近似表面合成部2030は、Trisoupノードを構成する各セグメントの頂点有無及び頂点位置を復号する際、空間的に隣接する復号済みセグメントの頂点有無及び頂点位置の情報を用いたコンテクスト適応復号を行うように構成されていてもよい。
また、以上のように、本実施形態における近似表面合成部2030は、Trisoupノードを構成する各セグメントの頂点有無及び頂点位置を復号する際、 空間的に隣接する復号済みセグメントのうち、当該Trisoupノードと同一サイズのノードを構成するセグメントの頂点有無及び頂点位置の情報を用いたコンテクスト適応復号を行うように構成されていてもよい。
このような構成とすることで、局所領域ごとに点群の特性に応じて適切なTrisoupノードサイズを選択しつつ、局所領域内では同一サイズのTrisoupノードが隣接するようになるため、空間方向の相関を活用することで符号化効率が向上する。
なお、図8では、サブサンプリングをスライス単位で実施する場合を例に説明したが、かかるサブサンプリング処理をノードごとに実施してもよい。
図18を参照して、サブサンプリングをノードごとに実施する場合の処理の一例について説明する。図18は、図14の処理に、サブサンプリング処理であるステップS709を追加したものである。
図18に示すように、近似表面合成部2030は、当該ノードについてS1302~S1305の処理を行って、当該ノードにおける再構成点群を生成する。
その後、近似表面合成部2030は、当該ノードにおける再構成点群に対して、ステップS709のサブサンプリング処理を行う。
基本的には、ステップS709の処理の説明における当該スライスの再構成点群を、当該ノードにおける再構成点群に置き換えることで、同様の処理が実現できる。
ステップS1702におけるサブサンプリング間隔の決定においては、近似表面合成部2030は、サブサンプリング間隔を制御するシンタックス(trisoup_sampling_value_minus1)に基づいてサブサンプリング間隔Sを決定する。
以上のように、本実施形態における点群復号装置200は、サブサンプリング間隔に関するパラメータを復号する幾何情報復号部2010と、当該スライス又は当該ノードの再構成点群を生成し、上述のサブサンプリング間隔Sに関するパラメータに基づいてサブサンプリング間隔を決定し、かかるサブサンプリング間隔Sに基づいて当該スライス又は当該ノードの再構成点群をサブサンプリングする近似表面合成部2030を備えるように構成されていてもよい。
このような構成とすることで、点群符号化装置100側で再構成点群の主観品質を考慮したパラメータ設定が可能であり、かつ、再構成点群を任意の点数以下に抑えることができる。
ここで、任意の点数とは、例えば、標準規格で規定される1スライス単位の再構成点数の上限であり、かかる標準規格を満たす装置間の相互接続性を担保す上で順守すべきものである。
また、以上のように、本実施形態における近似表面合成部2030は、上述のスライス又は当該ノードの再構成点群を所定方法でソートし、ソートした順で再構成点群にインデックスを付与し、各点のインデックス値をサブサンプリング間隔で除した際の剰余が0になる点のみを保持し、その他の点を破棄することでサブサンプリングを行うように構成されていてもよい。
このような構成とすることで、再構成点群から空間的に均等に点をサブサンプリングすることができるため、サブサンプリングによる主観画質の劣化を抑えることができる。
また、以上のように、本実施形態における点群復号装置200は、サブサンプリング間隔Sに関するパラメータとして、再構成点のサブサンプリング間隔を制御するシンタックスを復号し、近似表面合成部2030は、かかる再構成点のサブサンプリング間隔Sを制御するシンタックスの値或いは再構成点のサブサンプリング間隔Sを制御するシンタックスの値に1を加えた値をサブサンプリング間隔Sとし、サブサンプリングを行うように構成されていてもよい。
このような構成とすることで、点群復号装置200は、サブサンプリング間隔Sの導出に係る演算を省略することができる。
また、以上のように、本実施形態における点群復号装置200は、サブサンプリング間隔Sに関するパラメータとして、サブサンプリング後の最大点数を示す閾値を復号し、近似表面合成部2030は、サブサンプリング後の最大点数を示す閾値に正の整数Sを乗じた際、当該スライスの再構成点群の点数以上となる最小のSの値をサブサンプリング間隔とし、サブサンプリングを行うように構成されていてもよい。
このような構成とすることで、点群復号装置200は、明示的に再構成点群を何点以下にすればよいかがわかるため、動作検証が容易になる。
以上では、異なるサイズのTrisoupノード境界において、図8を用いて大きなノードサイズにおける頂点から小さいノードサイズの頂点を内挿する場合の例を説明したが、逆に小さなノードサイズにおける頂点を用いて大きなノードサイズの頂点を置き換えてもよい。
図19及び図20を用いて、異なるサイズのTrisoupノード境界において、小さなノードサイズにおける頂点を用いて大きなノードサイズの頂点を置き換える場合の処理の一例について説明する。なお、図8と同様な処理については同一の符号を付与し、説明を省略する。
図19に示すように、ステップS721において、近似表面合成部2030は、最小ノードサイズにおける頂点を内挿する。
ここで、基本的な内挿方法は、図8のステップS708及び図15、図16で説明した方法と同一である。唯一の違いは、ステップS708では、図16Cに示すように、元のノードの表面にのみ内挿した頂点を生成していたが、ステップS721では、図20に示すように、元のノードの内部についても、内挿した頂点を生成する点である。
このようにして、近似表面合成部2030は、元のTrisoupノードサイズに依らず、最小Trisoupノードサイズ単位での頂点を生成する。
ステップS722において、近似表面合成部2030は、頂点の統合を行う。ここでは、ステップS721によって内挿された最小ノードサイズの各セグメントにおける頂点及び最小Trisoupノードサイズにおいて復号された頂点を入力とする。
このとき、隣接ノード間でノードサイズが異なる場合、ある一つのセグメントに対して大きなノードサイズから内挿した複数の頂点及び最小Trisoupノードサイズにおいて復号した頂点が存在する場合がある。
例えば、近似表面合成部2030は、これらの頂点から、セグメントごとに1点のみを残し、他を破棄することで頂点を統合できる。
具体的には、例えば、近似表面合成部2030は、複数の頂点が存在した場合、その中で最も小さなTrisoupノードサイズから生成された頂点のみを残すことで、統合が可能である。
以上のように、近似表面合成部2030は、各セグメントについて頂点を1つに統合した後、ステップS723の再構成点群の生成処理に進む。
ステップS723において、近似表面合成部2030は、ステップS722で統合した頂点に基づいて、再構成点群を生成する。
このとき、ステップS721及びステップS722によって、Trisoupの頂点は、最小Trisoupノードサイズにおける各セグメントに対応する形になっているため、最小Trisoupノードサイズにおいて図14の処理を行うことでスライス全体の再構成点群を生成できる。
(点群符号化装置100)
以下、図21を参照して、本実施形態に係る点群符号化装置100について説明する。図21は、本実施形態に係る点群符号化装置100の機能ブロックの一例について示す図である。
図21に示すように、点群符号化装置100は、座標変換部1010と、幾何情報量子化部1020と、ツリー解析部1030と、近似表面解析部1040と、幾何情報符号化部1050と、幾何情報再構成部1060と、色変換部1070と、属性転移部1080と、RAHT部1090と、LoD算出部1100と、リフティング部1110と、属性情報量子化部1120と、属性情報符号化部1130とを有する。
座標変換部1010は、入力点群の3次元座標系から、任意の異なる座標系への変換処理を行うよう構成されている。座標変換は、例えば、入力点群を回転することにより、入力点群のx、y、z座標を任意のs、t、u座標に変換してもよい。また、変換のバリエーションの1つとして、入力点群の座標系をそのまま使用してもよい。
幾何情報量子化部1020は、座標変換後の入力点群の位置情報の量子化及び座標が重複する点の除去を行うように構成されている。なお、量子化ステップサイズが1の場合は、入力点群の位置情報と量子化後の位置情報とが一致する。すなわち、量子化ステップサイズが1の場合は、量子化を行わない場合と等価になる。
ツリー解析部1030は、量子化後の点群の位置情報を入力として、後述のツリー構造に基づいて、符号化対象空間のどのノードに点が存在するかについて示すoccupancy codeを生成するように構成されている。
ツリー解析部1030は、本処理において、符号化対象空間を再帰的に直方体で区切ることにより、ツリー構造を生成するように構成されている。
ここで、ある直方体内に点が存在する場合、かかる直方体を複数の直方体に分割する処理を、直方体が所定のサイズになるまで再帰的に実行することでツリー構造を生成することができる。なお、かかる各直方体をノードと呼ぶ。また、ノードを分割して生成される各直方体を子ノードと呼び、子ノード内に点が含まれるか否かについて0又は1で表現したものがoccupancy codeである。
以上のように、ツリー解析部1030は、所定のサイズになるまでノードを再帰的に分割しながら、occupancy codeを生成するように構成されている。
本実施形態では、上述の直方体を常に立方体として8分木分割を再帰的に行う「Octree」と呼ばれる手法、及び、8分木分割に加え、4分木分割及び2分木分割を行う「QtBt」と呼ばれる手法を使用することができる。
ここで、「QtBt」を使用するか否かについては、制御データとして点群復号装置200に伝送される。
或いは、任意のツリー構成を用いるPredicitive codingを使用するように指定されてもよい。かかる場合、ツリー解析部1030が、ツリー構造を決定し、決定されたツリー構造は、制御データとして点群復号装置200へ伝送される。
例えば、ツリー構造の制御データは、図6で説明した手順で復号できるよう構成されていてもよい。
近似表面解析部1040は、ツリー解析部1030によって生成されたツリー情報を用いて、近似表面情報を生成するように構成されている。
近似表面情報は、例えば、物体の3次元点群データを復号する際等において、点群が物体表面に密に分布しているような場合に、個々の点群を復号するのではなく、点群の存在領域を小さな平面で近似して表現したものである。
具体的には、近似表面解析部1040は、例えば、「Trisoup」と呼ばれる手法で、近似表面情報を生成するように構成されていてもよい。また、Lidar等で取得した疎な点群を復号する場合は、本処理を省略することができる。
幾何情報符号化部1050は、ツリー解析部1030によって生成されたoccupancy code及び近似表面解析部1040によって生成された近似表面情報等のシンタックスを符号化してビットストリーム(幾何情報ビットストリーム)を生成するように構成されている。ここで、ビットストリームには、例えば、図4及び図5で説明したシンタックスを含まれていてもよい。
符号化処理は、例えば、コンテクスト適応二値算術符号化処理である。ここで、例えば、シンタックスは、位置情報の復号処理を制御するための制御データ(フラグやパラメータ)を含む。
幾何情報再構成部1060は、ツリー解析部1030によって生成されたツリー情報及び近似表面解析部1040によって生成された近似表面情報に基づいて、符号化対象の点群データの各点の幾何情報(符号化処理が仮定している座標系、すなわち、座標変換部1010における座標変換後の位置情報)を再構成するように構成されている。
色変換部1070は、入力の属性情報が色情報であった場合に、色変換を行うように構成されている。色変換は、必ずしも実行する必要は無く、色変換処理の実行の有無については、制御データの一部として符号化され、点群復号装置200へ伝送される。
属性転移部1080は、入力点群の位置情報、幾何情報再構成部1060における再構成後の点群の位置情報及び色変換部1070での色変化後の属性情報に基づいて、属性情報の歪みが最小となるように属性値を補正するように構成されている。
RAHT部1090は、属性転移部1080による転移後の属性情報及び幾何情報再構成部1060によって生成された幾何情報を入力とし、RAHT(Region Adaptive Hierarchical Transform)と呼ばれるHaar変換の一種を用いて、各点の残差情報を生成するように構成されている。RAHTの具体的な処理としては、例えば、上述の文献2に記載の方法を用いることができる。
LoD算出部1100は、幾何情報再構成部1060によって生成された幾何情報を入力とし、LoD(Level of Detail)を生成するように構成されている。
LoDは、ある点の属性情報から、他のある点の属性情報を予測し、予測残差を符号化或いは復号するといった予測符号化を実現するための参照関係(参照する点及び参照される点)を定義するための情報である。
言い換えると、LoDは、幾何情報に含まれる各点を複数のレベルに分類し、下位のレベルに属する点については上位のレベルに属する点の属性情報を用いて属性を符号化或いは復号するといった階層構造を定義した情報である。
LoDの具体的な決定方法としては、例えば、上述の文献2に記載の方法を用いてもよい。
リフティング部1110は、LoD算出部1100によって生成されたLoD及び属性転移部1080での属性転移後の属性情報を用いて、リフティング処理により残差情報を生成するように構成されている。
リフティングの具体的な処理としては、例えば、文献(Text of ISO/IEC 23090-9 DIS Geometry-based PCC、ISO/IEC JTC1/SC29/WG11 N19088)に記載の方法を用いてもよい。
属性情報量子化部1120は、RAHT部1090又はリフティング部1110から出力される残差情報を量子化するように構成されている。ここで、量子化ステップサイズが1の場合は、量子化を行わない場合と等価である。
属性情報符号化部1130は、属性情報量子化部1120から出力される量子化後の残差情報等をシンタックスとして符号化処理を行い、属性情報に関するビットストリーム(属性情報ビットストリーム)を生成するように構成されている。
符号化処理は、例えば、コンテクスト適応二値算術符号化処理である。ここで、例えば、シンタックスは、属性情報の復号処理を制御するための制御データ(フラグ及びパラメータ)を含む。
点群符号化装置100は、以上の処理により、点群内の各点の位置情報及び属性情報を入力として符号化処理を行い、幾何情報ビットストリーム及び属性情報ビットストリームを出力するように構成されている。
また、上述の点群符号化装置100及び点群復号装置200は、コンピュータに各機能(各工程)を実行させるプログラムであって実現されていてもよい。
なお、上記の各実施形態では、本発明を点群符号化装置100及び点群復号装置200への適用を例にして説明したが、本発明は、かかる例のみに限定されるものではなく、点群符号化装置100及び点群復号装置200の各機能を備えた点群符号化/復号システムにも同様に適用できる。