【问题标题】:Image processing in onPreviewFrameonPreviewFrame 中的图像处理
【发布时间】:2016-09-19 02:32:13
【问题描述】:

我正在尝试从从 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中设置的角度进行旋转。

【问题讨论】:

    标签: android opencv android-camera


    【解决方案1】:

    围绕一个点旋转是一个相当标准的几何过程。来自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 个顶点,然后在旋转的画布上绘制一个新矩形。

    【讨论】:

      猜你喜欢
      • 2012-03-08
      • 2016-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-06
      • 2012-03-20
      相关资源
      最近更新 更多