| @@ -87,10 +87,8 @@ public class ObjectPhotoActivity extends AppCompatActivity { | |||||
| super.onActivityResult(requestCode, resultCode, data); | super.onActivityResult(requestCode, resultCode, data); | ||||
| if (RC_CHOOSE_PHOTO == requestCode && null != data && null != data.getData()) { | if (RC_CHOOSE_PHOTO == requestCode && null != data && null != data.getData()) { | ||||
| if (data != null) { | |||||
| this.imageUri = data.getData(); | this.imageUri = data.getData(); | ||||
| showOriginImage(); | showOriginImage(); | ||||
| } | |||||
| } else { | } else { | ||||
| finish(); | finish(); | ||||
| } | } | ||||
| @@ -204,7 +202,7 @@ public class ObjectPhotoActivity extends AppCompatActivity { | |||||
| Integer maxHeight = this.getMaxHeightOfImage(); | Integer maxHeight = this.getMaxHeightOfImage(); | ||||
| targetWidth = this.isLandScape ? maxHeight : maxWidth; | targetWidth = this.isLandScape ? maxHeight : maxWidth; | ||||
| targetHeight = this.isLandScape ? maxWidth : maxHeight; | targetHeight = this.isLandScape ? maxWidth : maxHeight; | ||||
| Log.i(ObjectPhotoActivity.TAG, "height:" + targetHeight + ",width:" + targetWidth); | |||||
| Log.i(TAG, "height:" + targetHeight + ",width:" + targetWidth); | |||||
| return new Pair<>(targetWidth, targetHeight); | return new Pair<>(targetWidth, targetHeight); | ||||
| } | } | ||||
| } | } | ||||
| @@ -88,12 +88,12 @@ public class ObjectRectView extends View { | |||||
| mRecognitions.clear(); | mRecognitions.clear(); | ||||
| mRecognitions.addAll(recognitions); | mRecognitions.addAll(recognitions); | ||||
| invalidate(); | |||||
| postInvalidate(); | |||||
| } | } | ||||
| public void clearCanvas() { | public void clearCanvas() { | ||||
| mRecognitions.clear(); | mRecognitions.clear(); | ||||
| invalidate(); | |||||
| postInvalidate(); | |||||
| } | } | ||||
| @Override | @Override | ||||
| @@ -60,8 +60,8 @@ public class Posenet { | |||||
| } | } | ||||
| public class Position { | public class Position { | ||||
| int x; | |||||
| int y; | |||||
| float x; | |||||
| float y; | |||||
| } | } | ||||
| public class KeyPoint { | public class KeyPoint { | ||||
| @@ -151,7 +151,6 @@ public class Posenet { | |||||
| int[] intValues = new int[bitmap.getWidth() * bitmap.getHeight()]; | int[] intValues = new int[bitmap.getWidth() * bitmap.getHeight()]; | ||||
| bitmap.getPixels(intValues, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight()); | bitmap.getPixels(intValues, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight()); | ||||
| int pixel = 0; | int pixel = 0; | ||||
| for (int y = 0; y < bitmap.getHeight(); y++) { | for (int y = 0; y < bitmap.getHeight(); y++) { | ||||
| for (int x = 0; x < bitmap.getWidth(); x++) { | for (int x = 0; x < bitmap.getWidth(); x++) { | ||||
| @@ -281,16 +280,16 @@ public class Posenet { | |||||
| } | } | ||||
| // Calculating the x and y coordinates of the keypoints with offset adjustment. | // Calculating the x and y coordinates of the keypoints with offset adjustment. | ||||
| int[] xCoords = new int[numKeypoints]; | |||||
| int[] yCoords = new int[numKeypoints]; | |||||
| float[] xCoords = new float[numKeypoints]; | |||||
| float[] yCoords = new float[numKeypoints]; | |||||
| float[] confidenceScores = new float[numKeypoints]; | float[] confidenceScores = new float[numKeypoints]; | ||||
| for (int i = 0; i < keypointPositions.length; i++) { | for (int i = 0; i < keypointPositions.length; i++) { | ||||
| Pair position = keypointPositions[i]; | Pair position = keypointPositions[i]; | ||||
| int positionY = (int) position.first; | int positionY = (int) position.first; | ||||
| int positionX = (int) position.second; | int positionX = (int) position.second; | ||||
| yCoords[i] = (int) ((float) positionY / (float) (height - 1) * bitmap.getHeight() + offsets[0][positionY][positionX][i]); | |||||
| xCoords[i] = (int) ((float) positionX / (float) (width - 1) * bitmap.getWidth() + offsets[0][positionY][positionX][i + numKeypoints]); | |||||
| yCoords[i] = ((float) positionY / (float) (height - 1) * bitmap.getHeight() + offsets[0][positionY][positionX][i]); | |||||
| xCoords[i] = ((float) positionX / (float) (width - 1) * bitmap.getWidth() + offsets[0][positionY][positionX][i + numKeypoints]); | |||||
| confidenceScores[i] = sigmoid(heatmaps[0][positionY][positionX][i]); | confidenceScores[i] = sigmoid(heatmaps[0][positionY][positionX][i]); | ||||
| } | } | ||||
| @@ -52,7 +52,14 @@ import static com.mindspore.posenet.Posenet.BodyPart.RIGHT_WRIST; | |||||
| @Route(path = "/posenet/PosenetMainActivity") | @Route(path = "/posenet/PosenetMainActivity") | ||||
| public class PosenetMainActivity extends AppCompatActivity implements CameraDataDealListener { | public class PosenetMainActivity extends AppCompatActivity implements CameraDataDealListener { | ||||
| private final List bodyJoints; | |||||
| private final List bodyJoints = Arrays.asList( | |||||
| new Pair(LEFT_WRIST, LEFT_ELBOW), new Pair(LEFT_ELBOW, LEFT_SHOULDER), | |||||
| new Pair(LEFT_SHOULDER, RIGHT_SHOULDER), new Pair(RIGHT_SHOULDER, RIGHT_ELBOW), | |||||
| new Pair(RIGHT_ELBOW, RIGHT_WRIST), new Pair(LEFT_SHOULDER, LEFT_HIP), | |||||
| new Pair(LEFT_HIP, RIGHT_HIP), new Pair(RIGHT_HIP, RIGHT_SHOULDER), | |||||
| new Pair(LEFT_HIP, LEFT_KNEE), new Pair(LEFT_KNEE, LEFT_ANKLE), | |||||
| new Pair(RIGHT_HIP, RIGHT_KNEE), new Pair(RIGHT_KNEE, RIGHT_ANKLE)); | |||||
| ; | |||||
| /** | /** | ||||
| @@ -74,16 +81,6 @@ public class PosenetMainActivity extends AppCompatActivity implements CameraData | |||||
| private int lensFacing = CameraCharacteristics.LENS_FACING_BACK; | private int lensFacing = CameraCharacteristics.LENS_FACING_BACK; | ||||
| private PoseNetFragment poseNetFragment; | private PoseNetFragment poseNetFragment; | ||||
| public PosenetMainActivity() { | |||||
| bodyJoints = Arrays.asList( | |||||
| new Pair(LEFT_WRIST, LEFT_ELBOW), new Pair(LEFT_ELBOW, LEFT_SHOULDER), | |||||
| new Pair(LEFT_SHOULDER, RIGHT_SHOULDER), new Pair(RIGHT_SHOULDER, RIGHT_ELBOW), | |||||
| new Pair(RIGHT_ELBOW, RIGHT_WRIST), new Pair(LEFT_SHOULDER, LEFT_HIP), | |||||
| new Pair(LEFT_HIP, RIGHT_HIP), new Pair(RIGHT_HIP, RIGHT_SHOULDER), | |||||
| new Pair(LEFT_HIP, LEFT_KNEE), new Pair(LEFT_KNEE, LEFT_ANKLE), | |||||
| new Pair(RIGHT_HIP, RIGHT_KNEE), new Pair(RIGHT_KNEE, RIGHT_ANKLE)); | |||||
| } | |||||
| @Override | @Override | ||||
| protected void onCreate(Bundle savedInstanceState) { | protected void onCreate(Bundle savedInstanceState) { | ||||
| super.onCreate(savedInstanceState); | super.onCreate(savedInstanceState); | ||||
| @@ -211,8 +208,8 @@ public class PosenetMainActivity extends AppCompatActivity implements CameraData | |||||
| new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()), | new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()), | ||||
| new Rect(left, top, right, bottom), paint); | new Rect(left, top, right, bottom), paint); | ||||
| float widthRatio = screenWidth / MODEL_WIDTH; | |||||
| float heightRatio = screenHeight / MODEL_HEIGHT; | |||||
| float widthRatio = (float) screenWidth / MODEL_WIDTH; | |||||
| float heightRatio = (float) screenHeight / MODEL_HEIGHT; | |||||
| for (Posenet.KeyPoint keyPoint : person.keyPoints) { | for (Posenet.KeyPoint keyPoint : person.keyPoints) { | ||||
| if (keyPoint.score > minConfidence) { | if (keyPoint.score > minConfidence) { | ||||
| @@ -14,18 +14,22 @@ | |||||
| android:roundIcon="@mipmap/ic_launcher_round" | android:roundIcon="@mipmap/ic_launcher_round" | ||||
| android:supportsRtl="true" | android:supportsRtl="true" | ||||
| android:theme="@style/AppTheme"> | android:theme="@style/AppTheme"> | ||||
| <activity android:name=".TestActivity" | |||||
| <activity | |||||
| android:name=".TestActivity" | |||||
| android:screenOrientation="portrait" | android:screenOrientation="portrait" | ||||
| android:theme="@style/Theme.AppCompat.NoActionBar"> | android:theme="@style/Theme.AppCompat.NoActionBar"> | ||||
| <intent-filter> | |||||
| <action android:name="android.intent.action.MAIN" /> | |||||
| <category android:name="android.intent.category.LAUNCHER" /> | |||||
| </intent-filter> | |||||
| </activity> | </activity> | ||||
| <activity android:name=".MainActivity" | |||||
| <activity | |||||
| android:name=".MainActivity" | |||||
| android:screenOrientation="portrait" | android:screenOrientation="portrait" | ||||
| android:theme="@style/Theme.AppCompat.NoActionBar"> | android:theme="@style/Theme.AppCompat.NoActionBar"> | ||||
| <intent-filter> | |||||
| <action android:name="android.intent.action.MAIN" /> | |||||
| <category android:name="android.intent.category.LAUNCHER" /> | |||||
| </intent-filter> | |||||
| </activity> | </activity> | ||||
| </application> | </application> | ||||
| @@ -204,8 +204,8 @@ public class MainActivity extends AppCompatActivity implements CameraDataDealLis | |||||
| new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()), | new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()), | ||||
| new Rect(left, top, right, bottom), paint); | new Rect(left, top, right, bottom), paint); | ||||
| float widthRatio = screenWidth / MODEL_WIDTH; | |||||
| float heightRatio = screenHeight / MODEL_HEIGHT; | |||||
| float widthRatio = (float) screenWidth / MODEL_WIDTH; | |||||
| float heightRatio = (float) screenHeight / MODEL_HEIGHT; | |||||
| for (Posenet.KeyPoint keyPoint : person.keyPoints) { | for (Posenet.KeyPoint keyPoint : person.keyPoints) { | ||||
| if (keyPoint.score > minConfidence) { | if (keyPoint.score > minConfidence) { | ||||
| @@ -60,8 +60,8 @@ public class Posenet { | |||||
| } | } | ||||
| public class Position { | public class Position { | ||||
| int x; | |||||
| int y; | |||||
| float x; | |||||
| float y; | |||||
| } | } | ||||
| public class KeyPoint { | public class KeyPoint { | ||||
| @@ -151,7 +151,6 @@ public class Posenet { | |||||
| int[] intValues = new int[bitmap.getWidth() * bitmap.getHeight()]; | int[] intValues = new int[bitmap.getWidth() * bitmap.getHeight()]; | ||||
| bitmap.getPixels(intValues, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight()); | bitmap.getPixels(intValues, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight()); | ||||
| int pixel = 0; | int pixel = 0; | ||||
| for (int y = 0; y < bitmap.getHeight(); y++) { | for (int y = 0; y < bitmap.getHeight(); y++) { | ||||
| for (int x = 0; x < bitmap.getWidth(); x++) { | for (int x = 0; x < bitmap.getWidth(); x++) { | ||||
| @@ -281,16 +280,16 @@ public class Posenet { | |||||
| } | } | ||||
| // Calculating the x and y coordinates of the keypoints with offset adjustment. | // Calculating the x and y coordinates of the keypoints with offset adjustment. | ||||
| int[] xCoords = new int[numKeypoints]; | |||||
| int[] yCoords = new int[numKeypoints]; | |||||
| float[] xCoords = new float[numKeypoints]; | |||||
| float[] yCoords = new float[numKeypoints]; | |||||
| float[] confidenceScores = new float[numKeypoints]; | float[] confidenceScores = new float[numKeypoints]; | ||||
| for (int i = 0; i < keypointPositions.length; i++) { | for (int i = 0; i < keypointPositions.length; i++) { | ||||
| Pair position = keypointPositions[i]; | Pair position = keypointPositions[i]; | ||||
| int positionY = (int) position.first; | int positionY = (int) position.first; | ||||
| int positionX = (int) position.second; | int positionX = (int) position.second; | ||||
| yCoords[i] = (int) ((float) positionY / (float) (height - 1) * bitmap.getHeight() + offsets[0][positionY][positionX][i]); | |||||
| xCoords[i] = (int) ((float) positionX / (float) (width - 1) * bitmap.getWidth() + offsets[0][positionY][positionX][i + numKeypoints]); | |||||
| yCoords[i] = ((float) positionY / (float) (height - 1) * bitmap.getHeight() + offsets[0][positionY][positionX][i]); | |||||
| xCoords[i] = ((float) positionX / (float) (width - 1) * bitmap.getWidth() + offsets[0][positionY][positionX][i + numKeypoints]); | |||||
| confidenceScores[i] = sigmoid(heatmaps[0][positionY][positionX][i]); | confidenceScores[i] = sigmoid(heatmaps[0][positionY][positionX][i]); | ||||
| } | } | ||||
| @@ -17,13 +17,29 @@ package com.mindspore.posenetdemo; | |||||
| import android.graphics.Bitmap; | import android.graphics.Bitmap; | ||||
| import android.graphics.Canvas; | import android.graphics.Canvas; | ||||
| import android.graphics.Color; | |||||
| import android.graphics.Paint; | import android.graphics.Paint; | ||||
| import android.graphics.drawable.Drawable; | import android.graphics.drawable.Drawable; | ||||
| import android.os.Bundle; | import android.os.Bundle; | ||||
| import android.widget.ImageView; | import android.widget.ImageView; | ||||
| import androidx.appcompat.app.AppCompatActivity; | import androidx.appcompat.app.AppCompatActivity; | ||||
| import androidx.core.util.Pair; | |||||
| import java.util.Arrays; | |||||
| import java.util.List; | |||||
| import static com.mindspore.posenetdemo.Posenet.BodyPart.LEFT_ANKLE; | |||||
| import static com.mindspore.posenetdemo.Posenet.BodyPart.LEFT_ELBOW; | |||||
| import static com.mindspore.posenetdemo.Posenet.BodyPart.LEFT_HIP; | |||||
| import static com.mindspore.posenetdemo.Posenet.BodyPart.LEFT_KNEE; | |||||
| import static com.mindspore.posenetdemo.Posenet.BodyPart.LEFT_SHOULDER; | |||||
| import static com.mindspore.posenetdemo.Posenet.BodyPart.LEFT_WRIST; | |||||
| import static com.mindspore.posenetdemo.Posenet.BodyPart.RIGHT_ANKLE; | |||||
| import static com.mindspore.posenetdemo.Posenet.BodyPart.RIGHT_ELBOW; | |||||
| import static com.mindspore.posenetdemo.Posenet.BodyPart.RIGHT_HIP; | |||||
| import static com.mindspore.posenetdemo.Posenet.BodyPart.RIGHT_KNEE; | |||||
| import static com.mindspore.posenetdemo.Posenet.BodyPart.RIGHT_SHOULDER; | |||||
| import static com.mindspore.posenetdemo.Posenet.BodyPart.RIGHT_WRIST; | |||||
| public class TestActivity extends AppCompatActivity { | public class TestActivity extends AppCompatActivity { | ||||
| @@ -41,16 +57,33 @@ public class TestActivity extends AppCompatActivity { | |||||
| // Draw the keypoints over the image. | // Draw the keypoints over the image. | ||||
| Paint paint = new Paint(); | Paint paint = new Paint(); | ||||
| paint.setColor(Color.RED); | |||||
| paint.setColor(getResources().getColor(R.color.text_blue)); | |||||
| paint.setTextSize(80.0f); | |||||
| paint.setStrokeWidth(5.0f); | |||||
| Bitmap mutableBitmap = imageBitmap.copy(Bitmap.Config.ARGB_8888, true); | Bitmap mutableBitmap = imageBitmap.copy(Bitmap.Config.ARGB_8888, true); | ||||
| Canvas canvas = new Canvas(mutableBitmap); | Canvas canvas = new Canvas(mutableBitmap); | ||||
| for (Posenet.KeyPoint keypoint : person.keyPoints) { | for (Posenet.KeyPoint keypoint : person.keyPoints) { | ||||
| canvas.drawCircle( | canvas.drawCircle( | ||||
| keypoint.position.x, | keypoint.position.x, | ||||
| keypoint.position.y, 2.0f, paint); | keypoint.position.y, 2.0f, paint); | ||||
| } | } | ||||
| for (int i = 0; i < bodyJoints.size(); i++) { | |||||
| Pair line = (Pair) bodyJoints.get(i); | |||||
| Posenet.BodyPart first = (Posenet.BodyPart) line.first; | |||||
| Posenet.BodyPart second = (Posenet.BodyPart) line.second; | |||||
| if (person.keyPoints.get(first.ordinal()).score > minConfidence & | |||||
| person.keyPoints.get(second.ordinal()).score > minConfidence) { | |||||
| canvas.drawLine( | |||||
| person.keyPoints.get(first.ordinal()).position.x, | |||||
| person.keyPoints.get(first.ordinal()).position.y, | |||||
| person.keyPoints.get(second.ordinal()).position.x, | |||||
| person.keyPoints.get(second.ordinal()).position.y, paint); | |||||
| } | |||||
| } | |||||
| sampleImageView.setAdjustViewBounds(true); | sampleImageView.setAdjustViewBounds(true); | ||||
| sampleImageView.setImageBitmap(mutableBitmap); | sampleImageView.setImageBitmap(mutableBitmap); | ||||
| @@ -64,4 +97,17 @@ public class TestActivity extends AppCompatActivity { | |||||
| drawable.draw(canvas); | drawable.draw(canvas); | ||||
| return bitmap; | return bitmap; | ||||
| } | } | ||||
| private final static int MODEL_WIDTH = 257; | |||||
| private final static int MODEL_HEIGHT = 257; | |||||
| private final double minConfidence = 0.5; | |||||
| private final float circleRadius = 8.0f; | |||||
| private final List bodyJoints = Arrays.asList( | |||||
| new Pair(LEFT_WRIST, LEFT_ELBOW), new Pair(LEFT_ELBOW, LEFT_SHOULDER), | |||||
| new Pair(LEFT_SHOULDER, RIGHT_SHOULDER), new Pair(RIGHT_SHOULDER, RIGHT_ELBOW), | |||||
| new Pair(RIGHT_ELBOW, RIGHT_WRIST), new Pair(LEFT_SHOULDER, LEFT_HIP), | |||||
| new Pair(LEFT_HIP, RIGHT_HIP), new Pair(RIGHT_HIP, RIGHT_SHOULDER), | |||||
| new Pair(LEFT_HIP, LEFT_KNEE), new Pair(LEFT_KNEE, LEFT_ANKLE), | |||||
| new Pair(RIGHT_HIP, RIGHT_KNEE), new Pair(RIGHT_KNEE, RIGHT_ANKLE)); | |||||
| } | } | ||||