この質問はすでに何度も解決されているように感じますが、わかりません。私は基本的にこのモバイルビジョンに関する小さなチュートリアルに従っていて、それを完了しました. その後、ColorBlob から始めてその境界線を描画して、自分でオブジェクトを検出しようとしました。
アイデアは、フレームの中央から開始し (オブジェクトを意図的にカメラの中央に保持)、そのオブジェクトのエッジをその色で検出することです。電話を横向きモード(Frame.ROTATION_0)で保持している限り機能します。ポートレート モード (Frame.Rotation_90) になるとすぐに、境界の Rect が回転して描画されるため、高さの大きいオブジェクトは幅が広くなり、少しずれて描画されます。
ドキュメントによると、検出器は常に回転していない直立フレームに座標を提供するとのことですが、その回転に関連する外接する長方形の座標をどのように計算すればよいのでしょうか? 私はそれがあまり重要ではないと思いますが、これが私が色を見つける方法です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 s draw メソッドで単純に描画します。私はすでにtransformX/Y
Graphic のメソッドを使用しており、回転も考慮されると考えています。サンプルから提供されたCameraSource
andクラスも使用します。CameraSourcePreview