我一直在尝试制作一个Android应用程序,允许用户拍照并计算具有相似颜色的对象的数量,用户可以在屏幕上点击以选择他们想要的颜色。然而,我遇到了一个问题,当用户点击屏幕时,我打印出了颜色和像素的坐标,这两者看起来都很对。但当我尝试使用展开方法(从像素展开并将附近所有颜色相似的像素转换为红色),并将对象转换为完全不同的颜色(因此不会再次计数)时,程序崩溃。

这是我的代码:

package com.example.myapplication;

import  androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import android.Manifest;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    private static final int CAM_PERM_CODE = 101;
    private static final int CAM_REQ_CODE = 102;
    private static int NumOfObj = 0;

    ImageView selectedImage;
    Button CameraB;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        selectedImage = findViewById(R.id.displayImageView);
        CameraB = findViewById(R.id.CameraB);

        CameraB.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                askCamPerm();
            }
        });

    }

    private void askCamPerm() {
        if(ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, CAM_PERM_CODE);
        } else  {
            openCam();
        }
    }

    @SuppressLint("MissingSuperCall")
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if (requestCode == CAM_PERM_CODE) {
            if (grantResults.length < 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                openCam();
            } else {
                Toast.makeText(this, "Camera permission is required", Toast.LENGTH_SHORT).show();
            }
        }
    }

    private void openCam(){
        Intent camera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        NumOfObj = 0;
        startActivityForResult(camera, CAM_REQ_CODE);
    }

    @SuppressLint("MissingSuperCall")
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        if(requestCode == CAM_REQ_CODE) {
            Bitmap image = (Bitmap) data.getExtras().get("data");
            selectedImage.setImageBitmap(image);
            Toast.makeText(this, "Select the object you want to count", Toast.LENGTH_LONG).show();
            selectedImage.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View view, MotionEvent motionEvent) {
                    if(motionEvent.getAction() == MotionEvent.ACTION_DOWN || motionEvent.getAction() == MotionEvent.ACTION_MOVE) {
                        int viewX = (int) motionEvent.getX();
                        int viewY = (int) motionEvent.getY();

                        int viewWidth = selectedImage.getWidth();
                        int viewHeight = selectedImage.getHeight();

                        Bitmap image2 = ((BitmapDrawable)selectedImage.getDrawable()).getBitmap();

                        int imageWidth = image2.getWidth();
                        int imageHeight = image2.getHeight();
                        System.out.println(viewX + ", " + viewWidth);
                        //int Offset = (viewWidth - imageWidth) / 2;

                        int imageX = (int)((float)(viewX) * ((float)imageWidth / (float)viewWidth));
                        int imageY = (int)((float)viewY * ((float)imageHeight / (float)viewHeight));

                        int DumpColor = image2.getPixel(imageX, imageY);

                        Counter(image2, DumpColor);
                    }
                    return true;
                }
            });
        }
    }

    public void Counter(Bitmap image, int DumpColor) {
        //Bright: 200, 192, 182
        //Dim: 141, 130, 120
        int height = image.getHeight();
        int width = image.getWidth();
        for(int col = 0; col < width; col+=5){
            for(int row = 0; row < height; row += 5){
                int color = image.getPixel(col, row);
                if(IsDumpColor(color, DumpColor)){
                    NumOfObj++;
                    System.out.println("Counter: " + row + ", " + col);
                    Expand(image, row, col, DumpColor);
                }
            }
        }

        Toast.makeText(this, "The number of object is: " + NumOfObj, Toast.LENGTH_LONG).show();
    }

    public void Expand(Bitmap image, int row, int col, int DumpColor){
        if(row == 0 || col == 0 || row == image.getHeight() || col == image.getWidth()) {
            return;
        }
        int Pixel = image.getPixel(col, row);
        System.out.println(col + ", " + row);
        System.out.println("color of pixel: " + image.getPixel(col, row));
        if (!IsDumpColor(Pixel, DumpColor) && Pixel == 0xFF0000){
            return;
        } else {
            image.setPixel(col, row, 0xFF0000);
            System.out.println(col + ", " + row);
            System.out.println("color of pixel2: " + image.getPixel(col, row));
            Expand(image, row - 1, col, DumpColor);
            Expand(image, row + 1, col, DumpColor);
            Expand(image, row, col - 1, DumpColor);
            Expand(image, row, col + 1, DumpColor);

        }
    }

    public boolean IsDumpColor(int color, int DumpColor){
        int red = Color.red(color);
        int green = Color.green(color);
        int blue = Color.blue(color);
        int DumpR = Color.red(DumpColor);
        int DumpG = Color.green(DumpColor);
        int DumpB = Color.blue(DumpColor);
        if(
                DumpR - red < 30 && red - DumpR < 30 &&
                DumpG - green < 30 && green - DumpG < 30 &&
                DumpB - blue < 30 && blue - DumpB < 30
        ){
            return true;
        }
        return false;
    }
}

我试图打印出像素坐标(x,y)和像素的颜色编号,但这给了我完全意想不到的结果。首先,我点击的像素是正常的,它给了我大约600900的值,但在扩展函数运行后不久,它给我15和2,颜色是-6556,我完全不知道这意味着什么。我被卡住了,因为理论上我的代码应该可以工作,我尝试过在谷歌上搜索,但没有得到任何结果。

我的Java代码给了我非常奇怪的错误,关于颜色和像素坐标的更多相关文章

  1. android – 如何在屏幕方向上停止活动娱乐?

    我如何在屏幕方向上停止重新启动或调用create(),我想停止在屏幕方向上重新创建活动.在此先感谢请告诉我任何更好的解决方案,它真正创造了一个问题.就像在我的程序中我选择一些图片但在屏幕方向上图像消失,这就是为什么我想停止在屏幕方向上重新开始活动.解决方法在API13之前,configChanges属性screenSize有一个新值因此,如果您使用大屏幕,请确保在configChanges属性中添加screenSize:

  2. android将XML视图转换为Bitmap而不显示它

    我正在尝试为我的地图集群设置视图.我正在从XML膨胀视图并根据群集大小设置文本,我想显示该视图.在下面的代码中我得到一个空位图作为回报:在下面的代码中我得到第四行的空指针(布局参数):当将其更改为以下代码时,我得到的不是错误,但没有绘制任何内容:这是我的XML:解决方法您的cluster.getLayoutParams()可能为null.首先,您需要测量膨胀视图的宽度/高度,然后分配给它.做如下:

  3. 是否有可能在android中创建一个Bitmap数组

    我想创建一个位图数组.可能吗?如果是,那是声明Bitmap数组的方法.以及如何初始化它?谢谢解决方法你可以使用Arraylist:或者只是一个位图数组,如:不过要小心你的图像大小.如果你试图存储很多大图像,你可能会遇到一些麻烦.

  4. android – 将一个ImageView的Bitmap内容复制到anoher

    我这样做的方式:请注意,bmSrc2是可变的,即你可以将它粘贴在Canvas中,并在绘制它之前做任何你喜欢的事情.

  5. 如果用户已经远离它,AsyncTask如何仍然使用Activity?

    在Android上,您可以在单独的线程中工作,例如使用Runnable或AsyncTask.在这两种情况下,您可能需要在完成工作后完成一些工作,例如通过覆盖AsyncTask中的onPostExecute().但是,用户可能会在后台完成工作时离开或关闭应用程序.我的问题是:如果用户导航或关闭应用程序时会发生什么情况,而我仍然引用用户刚刚在我的AsyncTask中关闭的Activity?我的猜测是,一旦用户导航就应该销毁它,但是当我出于某种原因在设备上测试它时,我仍然可以在Activity上调用方法,即使它

  6. Android Bitmap Masking(Xfermode)背后留下不透明的黑色背景

    如何避免这种黑色不透明背景?

  7. android – 旋转位图导致outOfMemoryException

    我以这种方式旋转位图,在每个按钮上单击图像旋转90度我用很多图像试过这个,但是现在一个引起了OutOfMemoryError.有办法防止这种情况吗?

  8. Android:Bitmap:如何在Android中保存带绿色背景的画布?

    我正在使用Bitmap创建数字签名图像.在设备上存储签名时,只有签名存储在黑色背景中.我希望绿色背景与签名.这是我的Bitmap代码我可以在创建签名时看到绿色背景,但它保存在黑色背景上.请帮帮我,谢谢你解决方法@rahul你也可以在onDraw中使用它请检查我的代码的更新

  9. Android – 新的BitmapDrawable已弃用;替代Bitmap.createBitmap必须具有w / h&gt; 0

    我用过PopupWindow.使用此PopupWindow,我将BackgroundDrawable设置为空的BitmapDrawable.当我使用以下代码时,它会给出一个弃用的警告:所以我改成了:这给了我一个错误,即Bitmap的宽度和高度必须大于0.现在我使用:它有效.但是使用1×1像素的Bitmap而不是像我想要的那样完全空的Bitmap似乎有点不对.还有另一种实际使用空BitmapDrawable的方法,而不是1乘1像素吗?

  10. android – 将URI转换为Bitmap的问题(2014):

    谢谢.解决方法请从uri获取输入流开始意图得到结果}

随机推荐

  1. 如何扩展ATmega324PB微控制器的以下宏寄存器?

    我目前正在学习嵌入式,我有以下练习:展开以下宏寄存器:如果有人解决了这个问题,我将不胜感激,以便将来参考

  2. Python将ONNX运行时设置为返回张量而不是numpy数组

    在python中,我正在加载预定义的模型:然后我加载一些数据并运行它:到目前为止,它仍在正常工作,但我希望它默认返回Tensor列表,而不是numpy数组。我对ONNX和PyTorch都是新手,我觉得这是我在这里缺少的基本内容。这将使转换中的一些开销相同。

  3. 在macOS上的终端中使用Shell查找文件中的单词

    我有一个文本文件,其中有一行:我需要找到ID并将其提取到变量中。我想出了一个RexEx模式:但它似乎对我尝试过的任何东西都不起作用:grep、sed——不管怎样。我的一个尝试是:我为这样一个看似愚蠢的问题感到抱歉,但我在互联网上找不到任何东西:我在SO和SE上读了几十个类似的问题,并在谷歌上搜索了几个教程,但仍然无法找到答案。欢迎提供任何指导!

  4. react-chartjs-2甜甜圈图中只有标题未更新

    我正在使用react-chartjs-2在我的网站中实现甜甜圈图。下面是我用来呈现图表的代码。我将甜甜圈图的详细信息从父组件传递到子组件,所有道具都正确传递。当我在beforeDraw函数外部记录props.title时,它会记录正确的值,但当我在beforeDraw函数内部记录props.title时,它将记录标题的前一个值,从而呈现标题的前值。我在这里做错了什么?

  5. 如何在tkinter中使用Python生成器函数?

    生成器函数承诺使某些代码更易于编写。但我并不总是知道如何使用它们。假设我有一个斐波那契生成器函数fib(),我想要一个显示第一个结果的tkinter应用程序。当我点击“下一步”按钮时,它会显示第二个数字,依此类推。我如何构建应用程序来实现这一点?我可能需要在线程中运行生成器。但如何将其连接回GUI?

  6. 如何为每次提交将存储库历史记录拆分为一行?

    我正在尝试获取存储库的历史记录,但结果仅以单行文本的形式返回给我。

  7. 尝试在颤振项目上初始化Firebase时出错

    当尝试在我的颤振项目上初始化firebase时,我收到了这个错误有人知道我能做什么吗?应用程序分级Gradle插件Gradle项目颤振相关性我已经将firebase设置为Google文档已经在另一个模拟器上尝试过,已经尝试过创建一个全新的模拟器,已经在不同的设备上尝试过了,已经尝试了特定版本的firebase,已经尝试添加但没有任何效果,已经在youtube上看到了关于它的每一个视频,该应用程序在android和iOS两个平台上都抛出了这个错误

  8. 在unix中基于当前日期添加新列

    我试图在unix中基于时间戳列在最后一个单元格中添加一个状态列。我不确定如何继续。

  9. 麦克斯·蒙特利。我一直得到UncaughtReferenceError:当我在终端中写入node-v时,节点未定义

    如果这是您应该知道的,请确认:我已将所有shell更改为默认为zsh。当我在终端中写入node-v时,我一直收到“UncaughtReferenceError:nodeisnotdefined”。但它显示节点已安装。我是个新手,在这方面经验不足。

  10. 如何在前端单击按钮时调用后端中的函数?

    那么如何在后端添加一个新的端点,点击按钮调用这个函数。

返回
顶部