使用Google Tango Leibniz版本1.10,TangoService_connectOnFrameAvailable()卡住或崩溃

时间:2015-04-20 14:09:20

标签: android c++ google-project-tango

Leibniz Release 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(),cam id 0,内部失败。

发行说明说

  

[...] config_enable_color_camera已添加到配置标志中。如果访问彩色摄像机,我们建议您始终将此标志显式设置为true。您必须将标志设置为true   TangoService_connectOnFrameAvailable()或   TangoService_connectTextureId()成功之后   调用TangoService_connect()。 [...]

因此,如果我在TangoService_connect()TangoService_connectOnFrameAvailable()的调用之间将该标志设置为true,则永远不会调用回调onFrameAvailable(),如果我在{之前将该标志设置为true {1}} TangoService_connect()将永远崩溃。

因此,我做错了什么?是否有可用的代码片段?那将是真的有用......不幸的是,没有一个例子使用彩色帧...

Man,在卡尔曼1.9版本遇到类似问题之后,我开始怀疑SDK在首先发布之前是否经过了彻底的测试......

2 个答案:

答案 0 :(得分:1)

好吧,假设问题不是我在评论部分提到的。以下是测试onFrameAvailable Callback的代码段。

注意:我已经修改了Tango-examples-c存储库中的HelloTangoJni Example

在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;
}

答案 1 :(得分: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