当前位置: 首页 > 知识库问答 >
问题:

Android-如何从我的视图中获取画布对象?

祝英博
2023-03-14

我的应用程序使用张量流精简模型来检测上传图像中的对象。

因此,我需要在用户上传的图像上绘制对象的边界框。

这是我的activity_camera.xml上传图像的地方。

<ImageView
        android:id="@+id/imageView"
        android:layout_width="281dp"
        android:layout_height="324dp"
        android:layout_marginTop="30dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:srcCompat="@android:drawable/ic_menu_gallery"
        tools:ignore="ImageContrastCheck" />

这里是我运行tflite模型的地方。(CameraActivity.java)

predictBtn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

                img = Bitmap.createScaledBitmap(img, 128, 128, true);

                try {

                    Android model = Android.newInstance(getApplicationContext());

                    // Creates inputs for reference.
                    TensorImage image = TensorImage.fromBitmap(img);


                    // Runs model inference and gets result.
                    Android.Outputs outputs = model.process(image);
                    Android.DetectionResult detectionResult = outputs.getDetectionResultList().get(0);

                    // Gets result from DetectionResult.
                    float score = detectionResult.getScoreAsFloat();
                    RectF location = detectionResult.getLocationAsRectF();
                    String category = detectionResult.getCategoryAsString();

                    drawDebug(canvas,location);

                    // Releases model resources if no longer used.
                    model.close();
                    // here we will print out the results of the object to text views based on the image that is inputted by the user
                    // we print out object type and its accuracy score

                    objecttv.setText(category);
                    scoretv.setText(Float.toString(score));


                } catch (IOException e) {
                    // TODO Handle the exception
                }

            }

                                          public void drawDebug(final Canvas canvas, RectF location) {

                                              final Paint boxPaint = new Paint();
                                              boxPaint.setColor(Color.RED);
                                              boxPaint.setAlpha(200);
                                              boxPaint.setStyle(Paint.Style.STROKE);

                                              canvas.drawRect(location, boxPaint);
                                          }
        }
        );

边界框的绘制不起作用,因为我需要先绘制画布。

为了从视图中获取画布对象,我需要在该视图中修改或创建什么?

共有1个答案

琴俊人
2023-03-14

视图没有Canvas对象。当在onDraw中绘制视图时,它会传递一个Canvas对象以供使用。这是视图存在Canvas的唯一时间,也是所有绘图必须发生的时间。

相反,你应该做的是使视图无效()。这将告诉视图它需要重新绘制,它将在不久的将来的某个时候调用onDraw。然后将你的绘图代码添加到onDraw。如果需要,将你需要绘制的任何状态存储在视图的成员变量中,这样它就可以在绘制时访问它们。

因为您使用的是ImageView,所以您需要做的是子类ImageView。将新子类添加到xml中。然后覆盖子类的onDraw函数来调用super.onDraw(),然后执行您希望的任何附加绘图。

 类似资料:
  • 我正在写一个小烧瓶应用程序来识别手写数字(0-9)。我写了几乎所有的元素(机器学习模型、web应用等),但我在捕捉图像(使用画布绘制)时遇到了问题,比如: 我想获取图像并将其保存到临时文件中。我懂Python,但从未使用过JavaScript,这是使用Canvas所必需的。 HTML: JS: 函数使用浏览器保存管理器保存图像,但我想将其保存到临时文件,稍后再使用图像。

  • 问题内容: 我正在使用Android中的OpenCV库。我有一个实现的类。 覆盖方法如下所示, 正如我希望图像数据可以在图像处理中进一步使用,而不是保存和重新加载图像。 从Byte数组获取Mat对象的最有效方法是什么?我已经尝试过这些方法: 不知道图像发生了什么。 然后转换为位图, 在这种情况下,红色变为蓝色。 在保存图像以备将来使用时,我也没有任何问题,但这导致我出现异常,因为当我使用先前存储的

  • 这是我的布局xml的结构: 当我想显示视图时,我使用

  • 我试图让用户从图库中选择个人资料图片。我的问题是有些图片向右旋转。 我启动图像选择器,如下所示: 我得到的图像从onActivityResult这样: 如何使图像不旋转? 更新: 根据我收到的一些有用的答案,我设法提出了以下可行的解决方案(它只是一个可行的代码,写得不好)。我很想得到你对我如何改进的反馈!

  • 我有RecyclerView,每个行布局都有一个ImageView和一个TextView。在 RecyclerViewAdapter 的 ViewHolder 中,我将单击侦听器设置为 在那个点击侦听器中,我正在更改布尔标志,以便它可以显示一个项目被选中或not.Depending它的值,我想通过检查遍历整个ArrayList

  • 我在我的项目中实现了一个calendarview,我可以获取月份、月份和年份,但我找不到任何方法来获取星期几,我的代码是这样的: 当我在日历中选择一天时,我需要得到一周的时间,我试图得到答案,但我找不到。 对不起我的英语。