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在首先发布之前是否经过了彻底的测试......
答案 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