【问题标题】:coordinate conversion from org.opencv.core.Point to android.graphics.Point从 org.opencv.core.Point 到 android.graphics.Point 的坐标转换
【发布时间】:2015-06-21 04:35:24
【问题描述】:

可能这个问题可能是重复的。但我发现很难得到答案,因为我是 OpenCV 和 Canvas 绘图的新手,这是我的代码

List<Point> pts = new ArrayList<Point>();
Converters.Mat_to_vector_Point(MatOfPoint, pts);

我得到正确的列表,其中点抽象 org.opencv.core.Point。 现在我正在使用正确的 MatOfPoint 将这些点转换为 android.graphics.Point 坐标。

android.graphics.Point pt1 = new android.graphics.Point((int) pts.get(0).x, (int) pts.get(0).y);

得到这个后,我正在尝试使用 android.graphics.Point 绘制 Canvas,但坐标与图像坐标不匹配。检查下面给出的代码。

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    Paint paint = new Paint();
    paint.setStyle(Paint.Style.FILL_AND_STROKE);
    paint.setStrokeWidth(3);

    paint.setAntiAlias(true);
    paint.setDither(true);
    paint.setColor(Color.parseColor("#55000000"));
    paint.setStyle(Paint.Style.FILL);
    paint.setStrokeJoin(Paint.Join.ROUND);
    paint.setStrokeWidth(5);
    canvas.drawPaint(paint);


    canvas.drawLine(point1.x,point1.y, point2.x, point2.y, paint);
}

使用从openCV坐标检测到的正方形绘制的画布与画布点坐标不匹配。我是否需要用像素或图像密度来操作点?任何帮助将不胜感激。 谢谢

【问题讨论】:

    标签: android opencv canvas graphics


    【解决方案1】:

    您需要通过添加偏移量来缩放点和移动点的位置

    参见CameraBridgeViewBase.java 中的第 412 行

    参见JavaCameraView.java 中的第 171 行

    scale=Math.min(mOpenCvCameraView.getWidth()/Matwidth,mOpenCvCameraView.getHeight())/Matheight)
    
    xoffset=(mOpenCvCameraView.getWidth()-scale*Matwidth)/2
    yoffset=(mOpenCvCameraView.getHeight()-scale*Matheight)/2
    final point1's X coordinate is: point1.x*scale+xoffset
    final point1's Y coordinate is: point1.y*scale+yoffset
    
    final point2's X coordinate is: point2.x*scale+xoffset
    final point2's Y coordinate is: point2.y*scale+yoffset
    

    【讨论】:

      【解决方案2】:

      您使用 opencv 计算的点,参考您的 MAT(或您的位图图像)上的坐标。 您必须将这些坐标缩放到您的显示对象,以使您的线条适合图像。 您可以使用下面的代码来实现您的目标。 希望对您有所帮助。

       @Override
          protected void onDraw(Canvas canvas){
      
              super.onDraw(canvas);
              Paint paint = new Paint();
              paint.setStyle(Paint.Style.FILL_AND_STROKE);
              paint.setStrokeWidth(3);
              paint.setAntiAlias(true);
              paint.setDither(true);
              paint.setColor(Color.parseColor("#55000000"));
              paint.setStyle(Paint.Style.FILL);
              paint.setStrokeJoin(Paint.Join.ROUND);
              paint.setStrokeWidth(5);
              canvas.drawPaint(paint);
              //iv is the ImageView which you can draw canvas over it
              // imgbitmap is bitmap image 
      
      
      
                double scaledWidth=iv.getWidth();
                 double scaledHeight=iv.getHeight();
      
                 double xScaleFactor= scaledWidth/imgbitmap.getWidth();
                 double yScaleFactor= scaledHeight/imgbitmap.getHeight();                                
      
       android.graphics.Point canvas_point1 = new android.graphics.Point((int)((point1.x*xScaleFactor)),(int)((point1.y*yScaleFactor)));
       android.graphics.Point canvas_point2 = new android.graphics.Point((int)((point2.x*xScaleFactor)),(int)((point2.y*yScaleFactor)));
                 canvas.drawLine(canvas_point1.x,canvas_point1.y, canvas_point2.x, canvas_point2.y, paint);
              }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-22
        • 1970-01-01
        • 2020-04-06
        • 1970-01-01
        • 2011-11-09
        相关资源
        最近更新 更多