You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

102 lines
5.4 KiB

package com.intel.realsense.capture;
import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.Handler;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.appcompat.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import com.intel.realsense.librealsense.Colorizer;
import com.intel.realsense.librealsense.Config;
import com.intel.realsense.librealsense.DeviceList;
import com.intel.realsense.librealsense.DeviceListener;
import com.intel.realsense.librealsense.Extension;
import com.intel.realsense.librealsense.Extrinsic;
import com.intel.realsense.librealsense.FrameSet;
import com.intel.realsense.librealsense.GLRsSurfaceView;
import com.intel.realsense.librealsense.Intrinsic;
import com.intel.realsense.librealsense.Pipeline;
import com.intel.realsense.librealsense.PipelineProfile;
import com.intel.realsense.librealsense.Pixel;
import com.intel.realsense.librealsense.Point_3D;
import com.intel.realsense.librealsense.RsContext;
import com.intel.realsense.librealsense.StreamType;
import com.intel.realsense.librealsense.Utils;
import com.intel.realsense.librealsense.VideoFrame;
// Aim of this fragment is to show how the following functions must be used:
// From class Utils:
// deprojectPixelToPoint
// transformPointToPoint
// projectPointToPixel
// getFov
// project2dPixelToDepthPixel
private int framesCounter = 1;
Runnable mStreaming = new Runnable() {
@Override
public void run() {
try {
try(FrameSet frames = mPipeline.waitForFrames()) {
try(FrameSet processed = frames.applyFilter(mColorizer)) {
mGLSurfaceView.upload(processed);
if((++framesCounter % 80) == 0) {
// getting depth frame
DepthFrame depthFrame = frames.first(StreamType.DEPTH).as(Extension.DEPTH_FRAME);
Intrinsic depthFrameIntrinsic = depthFrame.getProfile().getIntrinsic();
// getting depth frame field of view
float fov[] = Utils.getFov(depthFrameIntrinsic);
Log.d(TAG, "fov = (" + fov[0] + ", " + fov[1] + ")");
// getting color frame
VideoFrame colorFrame = frames.first(StreamType.COLOR).as(Extension.VIDEO_FRAME);
Intrinsic colorFrameIntrinsic = colorFrame.getProfile().getIntrinsic();
// computing extrinsics between the profiles
Extrinsic depthToColorExtrinsic = depthFrame.getProfile().getExtrinsicTo(colorFrame.getProfile());
Extrinsic colorToDepthExtrinsic = colorFrame.getProfile().getExtrinsicTo(depthFrame.getProfile());
// finding depth pixel with distance not zero (means that there is depth data in this pixel)
int w = depthFrameIntrinsic.getWidth();
int h = depthFrameIntrinsic.getHeight();
byte[] depthFrameData = new byte[ w * h ];
depthFrame.getData(depthFrameData);
float depthDataAtMiddleOfFrame = depthFrameData[w * h / 2];
int halfWidth = w / 2;
while (depthDataAtMiddleOfFrame < 0.2) {
halfWidth += 10;
depthDataAtMiddleOfFrame = depthFrameData[halfWidth * h];
}
// using get distance api to convert from raw distance to meters
float depthAtMiddleOfFrame = depthFrame.getDistance(halfWidth, h / 2);
Log.d(TAG, "depth = " + depthAtMiddleOfFrame);
// deproject, transform, project - in order to convert from depth pixel to color pixel
Pixel depth_pixel = new Pixel(halfWidth, h/2);
Point_3D depth_point = Utils.deprojectPixelToPoint(depthFrameIntrinsic, depth_pixel, depthAtMiddleOfFrame );
Point_3D color_point = Utils.transformPointToPoint(depthToColorExtrinsic, depth_point );
Pixel color_pixel = Utils.projectPointToPixel(colorFrameIntrinsic, color_point);
Log.d(TAG, "depthPoint = (" + depth_point.mX + ", " + depth_point.mY + ", " + depth_point.mZ + ")");
Log.d(TAG, "colorPoint = (" + color_point.mX + ", " + color_point.mY + ", " + color_point.mZ + ")");
Log.d(TAG, "pixel = (" + depth_pixel.mX + ", " + depth_pixel.mY + ")");
Log.d(TAG, "color pixel = (" + color_pixel.mX + ", " + color_pixel.mY + ")");
// convert color pixel to depth pixel
float depthMin = 0.1f;
float depthMax = 10.f;
Pixel toPixel = Utils.project2dPixelToDepthPixel(depthFrame, mDepthScale, depthMin, depthMax,
depthFrameIntrinsic, colorFrameIntrinsic, colorToDepthExtrinsic, depthToColorExtrinsic, color_pixel);
Log.d(TAG, "to_pixel = (" + toPixel.mX + ", " + toPixel.mY + ")");
}
}
}
mHandler.post(mStreaming);
}
catch (Exception e) {
Log.e(TAG, "streaming, error: " + e.getMessage());
}
}
};