2016-09-19 129 views
3

我想從onPreviewFrame接收的原始字節中查找輪廓。 當我們執行setDisplayOrientation(根據android開發人員文檔)時,這些接收到的原始字節不會旋轉。單獨旋轉輪廓變​​得越來越困難。如何有效地旋轉這些字節然後處理它?我正在使用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設置角度旋轉。

回答

0

圍繞一個點旋轉是一個相當標準的幾何過程。從this answer惡癖:

由arbitraty點旋轉的方式是先在。減去點 座標,做關於原點旋轉,然後添加點 座標。

x2 = px + (x1-px)*cos(q)-(y1-py)*sin(q) 
y2 = py + (x1-px)*sin(q)+(y1-py)*cos(q) 

其中PX,PY是旋轉點座標,X1,Y1的 原始2D形狀頂點和X2,Y2旋轉的座標,和q弧度 角度。

我會想象最有效的方法是將轉換應用到4個頂點,然後在旋轉的畫布上繪製一個新的矩形。