在横向模式下,我使用myImageView.setImageBitmap(myBitmap)并使用ontouch监听器对getXgetY进行调整,并调整myImageView的位置(与getRawXgetRawY相同)。然后,我使用bitmapToMat来构建MAT,以使用OpenCV进一步处理图像。我发现了两种调整大小的方案,其中onTouch位置将在我触摸的位置精确地画一个圆圈,但有时该位置将在Mat之外,并导致NPE并在处理过程中失败。

方案1:resize(myImageView.getWidth(), myImageView.getHeight())
方案2:resize(myImageView.getHeight(), myImageView.getWidth())

x = x(myImage.getHeight()/myImageView.getWidth())

y = y(myImage.getWidth()/myImageView.getHeight())

如果不更改x,y,则可以单击不带NPE的图像中的任何位置,但是绘制的圆圈离我触摸的地方不远。

处理后,我matToBitmap(myMAT, newBitmap)myImageView.setImageBitmap(newBitmap)

我显然缺少了一些东西,但是有没有一种简单的方法来获取触摸位置并在MAT中使用该位置呢?任何帮助都是极好的!

最佳答案

您必须偏移触摸的坐标,因为 View 可能大于或小于垫子。这样的事情应该工作

private Scalar getColor(View v, MotionEvent event){
    int cols = yourMat.cols();
    int rows = yourMat.rows();

    int xOffset = (v.getWidth() - cols) / 2;
    int yOffset = (v.getHeight() - rows) / 2;

    int x = (int)event.getX() - xOffset;
    int y = (int)event.getY() - yOffset;

  Point  touchedPoint    = new Point(x,y);

  Rect   touchedRect = new Rect();

    touchedRect.x = (x>4) ? x-4 : 0;
    touchedRect.y = (y>4) ? y-4 : 0;

    touchedRect.width = (x+4 < cols) ? x + 4 - touchedRect.x : cols - touchedRect.x;
    touchedRect.height = (y+4 < rows) ? y + 4 - touchedRect.y : rows - touchedRect.y;

    Mat touchedRegionRgba = yourMat.submat(touchedRect);

    Scalar mBlobColor = Core.mean(touchedRegionRgba);

    touchedRegionRgba.release();

    return mBlobColor;
}

10-05 18:26