Получение данных о цвете в Java Tango SDK (или C SDK)

Я только что получил свой планшет, где раньше был телефон. Как многие из вас, вероятно, знают, SDK телефона позволял захватывать суперкадры с помощью обратного вызова камеры Android. При правильном анализе суперкадры содержали все соответствующие данные датчиков.

В Архимеде я попробовал следующее. Я сделал действие, которое реализует CameraPreviewListener:

public class MainActivity extends Activity implements CameraPreviewListener
{
    // Inside of this class we manage another object that implements PreviewCallback
    ...
}

Это позволяет захватывать изображение с камеры, как и на любом другом устройстве Android. (Обратите внимание, что на телефоне Peanut это обеспечивало суперкадры; на планшете это просто предоставлял необработанный буфер RGB.) Точно так же простая реализация обратных вызовов из службы Tango работает просто отлично.

public class MainActivity extends Activity
{
    private Tango mTango;
    protected void onActivityResult(int requestCode, int resultCode, Intent data)
    {
        ...
        setTangoListeners();
    }
    private void setTangoListeners()
    {
        mTango.connectListener(framePairs, new OnTangoUpdateListener() {

        @Override
        public void onPoseAvailable(final TangoPoseData pose) 
        {
            System.out.println("Pose data received.");
        }
        @Override
        public void onXyzIjAvailable(final TangoXyzIjData xyzIj)
        {
            System.out.println("Cloud data received.");
        }
        @Override
        public void onTangoEvent(final TangoEvent event)
        {
            ...
        }
    }
}

Однако, когда я пытаюсь объединить их вместе, вот так,

public class MainActivity extends Activity implements CameraPreviewListener
{
    // Inside of this class we manage another object that implements PreviewCallback
    private Tango mTango;
    protected void onActivityResult(int requestCode, int resultCode, Intent data)
    {
        ...
        setTangoListeners();
    }
    private void setTangoListeners()
    {
        mTango.connectListener(framePairs, new OnTangoUpdateListener() {

        @Override
        public void onPoseAvailable(final TangoPoseData pose) 
        {
            System.out.println("Pose data received.");
        }
        @Override
        public void onXyzIjAvailable(final TangoXyzIjData xyzIj)
        {
            System.out.println("Cloud data received.");
        }
        @Override
        public void onTangoEvent(final TangoEvent event)
        {
            ...
        }
    }
}

Происходит что-то странное. Обратный вызов камеры срабатывает просто отлично, и я также получаю обратные вызовы onPoseAvailable. Однако я больше не получаю никаких обратных вызовов onXyzIjAvailable.

Итак, мои вопросы:

  1. Правильно ли я предполагаю, что сервису Tango требуется доступ к обратному вызову камеры для создания данных PointCloud?

  2. Если да, то можно ли как-то обойти это, чтобы я мог получить буфер RGB и Pointcloud примерно в одно и то же время? (Да, я знаю, что калибровка не тривиальна.)

  3. Если нет решения для 2, планируются ли какие-либо будущие обновления SDK, которые позволят это сделать?

  4. Я еще не изучил C SDK. Может быть, есть способ сделать это там, и если да, то есть ли у кого-нибудь опыт?

В идеале мне нужен доступ к необработанному буферу RGB, изображению интенсивности и изображению «рыбий глаз»; Мне все равно как, лишь бы работало.


person indianajohn    schedule 06.11.2014    source источник
comment
какой планшет вы держите? Это Йеллоустонская архитектура?   -  person Nikolaos Giotis    schedule 06.11.2014


Ответы (1)


  1. Tango Service требует доступа к камере для создания данных облака точек. Вы можете установить разрешения камеры в файле манифеста Android вашего приложения.

  2. Службе Tango требуется дескриптор камеры RGB-IR для получения обратных вызовов от onXyzIjAvailable. Из того, что я заметил из вашего кода, похоже, что вы пытаетесь использовать API-интерфейсы Android Camera вместе с Tango Service. Это означает, что камера RGB-IR уже используется API-интерфейсами Android Camera, а это означает, что сервис Tango больше не может использовать ИК-камеру RGB для создания данных облака точек. Но вы по-прежнему будете получать onPoseAvailable обратных вызовов, так как отслеживание движения использует камеру FishEye для оценки позы.

Этот пример показывает способ использования connectSurface вызов для рендеринга данных RGB на поверхность Android с помощью службы Tango. Использование этого вызова не влияет на onXyzIjAvailable обратных вызовов, так как он является частью Tango Service API.

tl:dr: Не используйте API камеры Android с Tango Service. Вместо этого используйте функцию connectSurface(int cameraId, Surface surface) для подключения к нужной камере.

person r4ravi2008    schedule 06.11.2014
comment
Это работает для рендеринга данных RGB в SurfaceView, но как получить данные RGB (или YUV, как для Peanut)? Я не могу найти способ прикрепить PreviewCallback, как с Peanut, который дал SuperFrame в виде массива байтов. Спасибо за дополнительные разъяснения по этому поводу - person ArthurT; 14.02.2015
comment
Обратите внимание, что в выпуске Android Tango Jacobi указанный выше метод connectSurface(in cameraId, Surface surface) устарел/удален. Теперь вам нужно будет использовать метод connectToTangoCamera в классе TangoCameraPreview. См. обновленный VideoOverlaySample. github.com/googlesamples/tango-examples-java/tree/master/ - person henderso; 22.03.2015