2

Leibniz リリース 1.10 にもカラー フレームの受信に関する問題があるようです: コールバックを使用し TangoService_connectOnFrameAvailable(TANGO_CAMERA_COLOR,NULL,onFrameAvailable)てコールバックを登録すると、コールバックonFrameAvailable()が呼び出されないかTangoService_connectOnFrameAvailable()、次のエラーでクラッシュします。

04-20 13:29:44.384: E/tango_client_api(4712): TangoErrorType TangoService_connectOnFrameAvailable(TangoCameraId, void*, void ( )(void , TangoCameraId, const TangoImageBuffer*)): 内部エラー: connectSurface(), カム id 0, 失敗しました初めの。

リリースノートによると

[...] config_enable_color_camera が構成フラグに追加されました。カラー カメラにアクセスする場合は、常にこのフラグを明示的に true に設定することをお勧めします。TangoService_connect() が呼び出された後に成功するには、TangoService_connectOnFrameAvailable() または TangoService_connectTextureId() のフラグを true に設定する必要があります。[...]

したがって、 と の呼び出しの間にそのフラグを trueに設定すると、常にクラッシュする前にそのフラグを true に設定すると、コールバックが呼び出されることはありませTangoService_connect()TangoService_connectOnFrameAvailable()onFrameAvailable()TangoService_connect() TangoService_connectOnFrameAvailable()

したがって、私は何を間違っていますか?利用可能なコードスニペットなどはありますか? それは本当に役に立ちます...残念ながら、どの例もカラーフレームを使用していません...

男、カルマン リリース 1.9 で同様の問題が発生した後、SDK が最初にリリースされる前に徹底的にテストされているかどうか疑問に思うようになりました...

4

2 に答える 2

1

問題がコメントセクションで述べたものではないと仮定して大丈夫です。onFrameAvailable コールバックをテストするコード スニペットを次に示します。

注:このために、Tango-examples-c リポジトリからHelloTangoJni の例を変更しました。

TangoHandler.h に追加

 TangoErrorType ConnectYUVFrameCallback();

TangoHandler.cc の変更

TangoErrorType TangoHandler::SetupConfig() {
  // TANGO_CONFIG_DEFAULT is enabling Motion Tracking and disabling Depth
  // Perception.
  tango_config_ = TangoService_getConfig(TANGO_CONFIG_DEFAULT);
  if (tango_config_ == nullptr) {
  return TANGO_ERROR;
  }
  TangoConfig_setBool(tango_config_,"config_enable_color_camera",true);
  return TANGO_SUCCESS;
}


TangoErrorType TangoHandler::ConnectYUVFrameCallback() {
    TangoErrorType onFrameErrorType=TangoService_connectOnFrameAvailable( TANGO_CAMERA_COLOR, NULL, onFrameAvailable);
    if( onFrameErrorType!= TANGO_SUCCESS)
    {
         LOGI("GOOGLE TANGO ONFRAMEAVAILABLE FAILED!");
    }
    LOGI("GOOGLE TANGO ONFRAMEAVAILABLE SUCCESS!");
    return onFrameErrorType;
}

static void onFrameAvailable( void* context, const TangoCameraId id, const TangoImageBuffer* buffer )
{
  int width = buffer->width;
  int height = buffer->height;
  LOGI("width and height is: %d,%d",width,height);
}

TangoNative.cc に追加

JNIEXPORT jint JNICALLJava_com_projecttango_experiments_nativehellotango_TangoJNINative_connectOnFrameAvailableCallback(
JNIEnv*, jobject) 
{
    return static_cast<int>(tango_handler.ConnectYUVFrameCallback());
}

TangoJNINative.java に追加

// Connect the onFrameAvailable callback.
public static native int connectOnFrameAvailableCallback();

HelloTangoActivity.java で onResume() を変更します。

protected void onResume() {
   super.onResume();
   // Setup Tango configuraturation.
   TangoJNINative.setupConfig();
   int status = 0;
   TangoJNINative.connect();
   status = TangoJNINative.connectOnFrameAvailableCallback();
   mIsTangoServiceConnected = true;
}
于 2015-04-22T22:03:53.153 に答える
0

NV21 を RGB フレームに変換するコードを次に示します。何かの役に立ってるかも…

static void
  cb_onFrameAvailable
  (
    void*                     contextA,
    TangoCameraId             idA,
    const TangoImageBuffer*  imageBufferA
  )
{
  // --- local constants ------------------------------

  // image width and height
  const int W               = imageBufferA->width;
  const int H               = imageBufferA->height;

  // sizes of Y, U, and V pixel arrays.
  const int sizeOfYDataL   = W * H;

  // indices, marking the begin of the y, u, and v data in the pixel buffer.
  const int beginOfYDataL  = 0;
  const int beginOfUVDataL  = sizeOfYDataL;

  // YUV, Y, and UV pixel sub arrays.
  const byte*  yuvArrL     = imageBufferA->data;
  const byte*  yArrL       = &yuvArrL[ beginOfYDataL  ];
  const byte*  uvArrL      = &yuvArrL[ beginOfUVDataL ];

  // --- local variables ------------------------------

  // image pixel coordinates.
  int xL,yL;

  // halved image pixel coordinates.
  int hxL,hyL;

  // ARGB value.
  int argbL;

  // --------------------------------------------------

  // translate YUV NV21 -> ARGB, using
  //
  //      / R \   / 1.000   0.000   1.596 \   /   Y   \
  //      | G | = | 1.000  -0.391  -0.813 | * | U-128 |
  //      \ B /   \ 1.000   2.018   0.000 /   \ V-128 /
  //

  // Note: start value yL=1 as the first scan line of the color image is ..
  //       .. reserved for metadata instead of image pixels.

  for( yL=1,hyL=0; yL<H; yL++,hyL=yL>>1 )
  {
    for( xL=0,hxL=0; xL<W; xL++,hxL=xL>>1 )
    {
      const int y = static_cast<int>( yArrL [  yL*W +    xL   ] )      ;
      const int v = static_cast<int>( uvArrL[ hyL*W + 2*hxL   ] ) - 128;
      const int u = static_cast<int>( uvArrL[ hyL*W + 2*hxL+1 ] ) - 128;

      int R = static_cast<int>( y               + ( 1.596f*v) );
      int G = static_cast<int>( y + (-0.391f*u) + (-0.813f*v) );
      int B = static_cast<int>( y + ( 2.018f*u)               );

      // clip RGB values to [0..255].
      R = R < 0 ? 0 : (R > 255 ? 255 : R);
      G = G < 0 ? 0 : (G > 255 ? 255 : G);
      B = B < 0 ? 0 : (B > 255 ? 255 : B);

      // combine to ARGB value.
      argbL = 0xff000000 | (R << 16) | (G << 8) | B;
    } // for
  } // for
} // function
于 2015-04-22T10:11:29.293 に答える