我正在尝试从onPreviewFrame接收的原始字节中找到轮廓。 当我们执行setDisplayOrientation时(根据android开发人员文档),这些原始字节不会被旋转。单独旋转轮廓变得越来越困难。如何有效地旋转这些字节然后处理它?我正在使用openCV来查找轮廓。
@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 :(得分:0)
围绕一个点旋转是一个相当标准的几何过程。来自this answer的琐事:
通过任意点旋转的方法首先是减去该点 坐标,围绕原点进行旋转,然后添加点 坐标。
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个顶点,然后在旋转的画布上绘制一个新的矩形。