如何将帧坐标映射到视觉中的叠加

时间:2016-09-14 06:49:07

标签: android camera drawing screen-rotation android-vision

我觉得这个问题已经解决了很多次,但我无法弄清楚。我基本上关注移动视觉this little Tutorial并完成了它。之后我尝试从ColorBlob开始检测对象并绘制边框。

想法是从框架的中间开始(有目的地将对象保持在相机的中间)并通过其颜色检测该对象的边缘。只要我以横向模式(Frame.ROTATION_0)保持手机,它就可以正常工作。一旦我处于纵向模式(Frame.Rotation_90),边界Rect就会被绘制成旋转,因此具有更多高度的对象将被绘制为具有更多宽度,并且还有点偏离。

docs表示探测器总是向未旋转的直立框架提供坐标,所以我应该如何计算相对于其旋转的边界矩形坐标? 我认为这不重要,但这里是我找到颜色Rect

的方式
public Rect getBounds(Frame frame){
  int w = frame.getMetadata().getWidth();
  int h = frame.getMetadata().getHeight();
  int scale = 50;
  int scaleX = w / scale;
  int scaleY = h / scale;
  int midX = w / 2;
  int midY = h / 2;
  float ratio = 10.0
  Rect mBoundary = new Rect();
  float[] hsv = new float[3];
  Bitmap bmp = frame.getBitmap();
  int px = bmp.getPixel(midX, midY);
  Color.colorToHSV(px, hsv);
  Log.d(TAG, "detect: mid hsv: " + hsv[0] + ", " + hsv[1] + ", " + hsv[2]);
  float hue = hsv[0];
  float nhue;
  int x, y;
  for (x = midX + scaleX; x < w; x+=scaleX){
      px = bmp.getPixel(x, midY);
      Color.colorToHSV(px, hsv);
      nhue = hsv[0];
      if (nhue <= (hue + ratio) && nhue >= (hue - ratio)){
          mBoundary.right = x
      } else {
          break;
      }
  }

  for (x = midX - scaleX; x >= 0; x-= scaleX){
      px = bmp.getPixel(x, midY);
      Color.colorToHSV(px, hsv);
      nhue = hsv[0];
      if (nhue <= (hue + ratio) && nhue >= (hue - ratio)){
          mBoundary.left = x
      } else {
          break;
      }
  }

  for (y = midY + scaleY; y < h; y+=scaleY){
      px = bmp.getPixel(midX, y);
      Color.colorToHSV(px, hsv);
      nhue = hsv[0];
      if (nhue <= (hue + ratio) && nhue >= (hue - ratio)){
          mBoundary.bottom = y;
      } else {
          break;
      }
  }

  for (y = midY - scaleY; y >= 0; y-=scaleY){
      px = bmp.getPixel(midX, y);
      Color.colorToHSV(px, hsv);
      nhue = hsv[0];
      if (nhue <= (hue + ratio) && nhue >= (hue - ratio)){
          mBoundary.top = y
      } else {
          break;
      }
  }
  return mBoundary;
}

然后我只是在画布上的GraphicOverlay.Graphic绘制方法中绘制它。我已经在Graphic上使用了transformX/Y方法,并认为它也会考虑轮换。 我还使用了示例中提供的CameraSourceCameraSourcePreview类。

0 个答案:

没有答案