none
Xbox One Kinect  ピクセル単位でのHSV情報取得方法について RRS feed

  • 質問

  • 現在,Kinectを用いてカラー映像上で色検出を行い,その点までの距離をだしたいと思っています

    環境はWindows10, Visual Studio 2017, OpenCV 3.2です.

    問題になっているのは,各ピクセルのHSVの情報を得る場合のデータ型がわからないことです.

    以下にプログラムの流れを書かせていただきます.

    Kinectを検出.cvtColorでrgbをhsvに変換.splitでhsvのマルチチャンネルをシングルチャンネル(channelsとしました)に分離.depthのx,yで画面上を走査しつつ,16bitで距離情報を取得,depth座標とrgb座標をdp・cpで定義,MapDepthPointToColorSpace(dp, d, &cp)で座標変換,cp.Xとcp.Yをint型にキャストしたものをax,ayとする.

    ここまでは問題ありません.次に,走査している各ピクセルでHSV値を得るために

    channels[0].at<uchar>(ay, ax)

    を用いています.コンパイルは通るのですが,

    OpenCV Error: Assertion failed ((unsigned)i0 < (unsigned)size.p[0]) in cv::Mat::at, file c:\opencv3.2.0\build\include\opencv2\core\mat.inl.hpp, line 955
    c:\opencv3.2.0\build\include\opencv2\core\mat.inl.hpp:955: error: (-215) (unsigned)i0 < (unsigned)size.p[0] in function cv::Mat::at

    がコンソールに出ます.調べると<uchar>の部分が間違えているとわかりました.この部分をintやdoubleなど考えうるデータ型を試したのですが,同じエラーが出てしまいます.試したデータ型を下に書いておきます.

    ”int" "float " "double" "uchar " "char" "ushort" "short" "unsigned short" "UNIT16"

    axとayの部分を単にx,yとすると正常に動きます.ただ,x,yとするとrgb座標では無いので見当違いな部分を検出します.

    次に,rgb映像とdepth映像のピクセル比から

    ax = x * 1920 / 512,ay = y * 1090 / 424

    としてみましたが,画面の端になるほど誤差が増大してしまいした.

    解決方法のわかる方がいらっしゃればどうぞよろしくお願いいたします.また,追加で書かなければならないことがありましたら書きますのでよろしくお願いいたします.

    2017年6月25日 10:52

回答

すべての返信