2016-09-19 24 views
3

onPreviewFrameから受信した生のバイトから輪郭を探しようとしています。 受信した未処理のバイトは、setDisplayOrientationを実行すると回転しません(アンドロイドの開発者ドキュメントに準拠)。輪郭のみを回転させることは困難になりつつあります。どのようにこれらのバイトを効率的に回転させ、それを処理するのですか?私は輪郭を見つけるためにopenCVを使用しています。ここonPreviewFrameの画像処理

@Override 
    public void onPreviewFrame(byte[] data, Camera camera) { 
     previewSize = cameraConfigUtil.cameraInstance.getParameters().getPreviewSize(); 
     Mat srcMat = new Mat(previewSize.height, previewSize.width, CvType.CV_8UC3); 
     srcMat.put(0, 0, data); 
     rect = ImageCorrection.getLargestContour(data, previewSize.height, previewSize.width); 
     android.graphics.Rect rectangle = new android.graphics.Rect(); 
     rectangle.left = rect.x; 
     rectangle.top = rect.y; 
     rectangle.right = rect.x + rect.width; 
     rectangle.bottom = rect.y + rect.height; 
     mOverlay.clear(); 
     BarcodeGraphic graphic = new BarcodeGraphic(mOverlay); 
     mOverlay.add(graphic); 
     graphic.updateItem(rectangle); 
     Imgproc.rectangle(srcMat, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height), new Scalar(255, 0, 0, 255), 3); 
     Utils.matToBitmap(srcMat, bitmap); 
    } 

矩形は、私はこれがsetDisplayOrientationに設定された角度に応じて回転されるようにする、輪郭の4点を与えます。

答えて

0

ポイント回りの回転は、かなり標準的な幾何学的プロセスです。 this answerからカンニング:

arbitratyポイントによって回転するようにされている第一substract点は 座標を、原点を中心とする回転を行い、その後、点を 座標を追加します。

PX、PYは、回転点座標、及びX1、Y1 元の2D形状の頂点およびX2、Y2回転座標、qはラジアン 角度である
x2 = px + (x1-px)*cos(q)-(y1-py)*sin(q) 
y2 = py + (x1-px)*sin(q)+(y1-py)*cos(q) 

私はこれを行うための最も効率的な方法は、4つの頂点に変換を適用し、その後、回転キャンバス上に新しい四角形を描画するだろうと想像。