【问题标题】:What is the best way to implement Color Detection in Android?在 Android 中实现颜色检测的最佳方法是什么?
【发布时间】:2015-02-23 09:51:19
【问题描述】:

我想在 Android 中实现颜色检测。我真正想做的是,在用 Android Camera 拍照后,我想检测那张照片中物体的颜色。我的目标是根据颜色强度检测颜色。在这一点上,我搜索并看到了与此目标相关的不同方法。有一些算法将图像转换为位图,然后检测颜色,其中一些使用 RGB。此外,我看到 OpenCV 也是这个问题的已知解决方案。

现在,我想知道我应该走哪条路。哪种方式更适合我的情况。有没有人可以通过某种方法帮助和指导我?

任何帮助将不胜感激。提前谢谢大家。

【问题讨论】:

  • this
  • 我已经看到了这个问题,但正如我所说,我正在寻找帮助来指导我通过适合我自己案例的最佳方法。我也没有使用 OpenCV 的经验。我是初学者。还是谢谢你。
  • “根据颜色强度检测颜色”并不能告诉我们太多信息。你的最终目标是什么?您是否正在为消费者制作相机应用程序?或科学家的相机应用程序?您是否正在尝试模仿与图片中的颜色相匹配的图库应用程序?还是完全不同的东西?
  • 我的主要目标是为盲人改进一个有用的应用程序,使他们能够识别物体颜色。所以我需要在一张拍摄的照片中检测物体的主要颜色。我的意思是我的目标是检测图片中最主要的色调。
  • 检测到这种颜色后,你想用它做什么?只是显示该值还是要以某种方式更改它?

标签: android opencv colors image-recognition


【解决方案1】:

如果我正确理解您的问题,您需要一种方法来获取图像并确定该方法中最主要的颜色,然后返回结果。

我已经整理了一个应该为您提供结果的类,不知道它是否是最有效的算法,但请尝试一下。 要实施该解决方案,您可以执行以下操作

new ColorFinder(new CallbackInterface() {
    @Override
    public void onCompleted(String color) {
        Toast.makeText(context, "Your Color : " + color, Toast.LENGTH_SHORT).show();
    }
}).findDominantColor(yourBitmap);

ColorFinder.java

import android.graphics.Bitmap;
import android.os.AsyncTask;

import java.util.HashMap;
import java.util.Map;

/**
 * Created by Neil on 15/02/23.
 */
public class ColorFinder {
    private static final String TAG = ColorFinder.class.getSimpleName();

    private CallbackInterface callback;

    public ColorFinder(CallbackInterface callback) {
        this.callback = callback;
    }

    public void findDominantColor(Bitmap bitmap) {
        new GetDominantColor().execute(bitmap);
    }

    private int getDominantColorFromBitmap(Bitmap bitmap) {
        int [] pixels = new int[bitmap.getWidth()*bitmap.getHeight()];
        bitmap.getPixels(pixels,0,bitmap.getWidth(),0,0, bitmap.getWidth(), bitmap.getHeight());

        Map<Integer, PixelObject> pixelList = getMostDominantPixelList(pixels);
        return getDominantPixel(pixelList);
    }

    private Map<Integer, PixelObject> getMostDominantPixelList(int [] pixels) {
        Map<Integer, PixelObject> pixelList = new HashMap<>();

        for (int pixel : pixels) {
            if (pixelList.containsKey(pixel)) {
                pixelList.get(pixel).pixelCount++;
            } else {
                pixelList.put(pixel, new PixelObject(pixel, 1));
            }
        }

        return pixelList;
    }

    private int getDominantPixel(Map<Integer, PixelObject> pixelList) {
        int dominantColor = 0;
        int largestCount = 0;
        for (Map.Entry<Integer, PixelObject> entry : pixelList.entrySet()) {
            PixelObject pixelObject = entry.getValue();

            if (pixelObject.pixelCount > largestCount) {
                largestCount = pixelObject.pixelCount;
                dominantColor = pixelObject.pixel;
            }
        }

        return dominantColor;
    }

    private class GetDominantColor extends AsyncTask<Bitmap, Integer, Integer> {

        @Override
        protected Integer doInBackground(Bitmap... params) {
            int dominantColor = getDominantColorFromBitmap(params[0]);
            return dominantColor;
        }

        @Override
        protected void onPostExecute(Integer dominantColor) {
            String hexColor = colorToHex(dominantColor);
            if (callback != null)
                callback.onCompleted(hexColor);
        }

        private String colorToHex(int color) {
            return String.format("#%06X", (0xFFFFFF & color));
        }
    }

    public interface CallbackInterface {
        public void onCompleted(String dominantColor);
    }
}

PixelObject.java

public class PixelObject {
    public int pixel;
    public int pixelCount;

    public PixelObject(int pixel, int pixelCount) {
        this.pixel = pixel;
        this.pixelCount = pixelCount;
    }
}

【讨论】:

  • 首先对我迟到的回答感到抱歉。我尝试实现此解决方案,但它给出了一个致命异常,例如:' FATAL EXCEPTION: main java.lang.RuntimeException: Unable to instance activity ComponentInfo{com.example.burcu1.colordetectortrial/com.example.burcu1.colordetectortrial.ColorFinder }:java.lang.InstantiationException:无法实例化类 com.example.burcu1.colordetectortrial.ColorFinder; android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2106)' 处没有空构造函数
  • 你试过调试吗?当我发布它时效果很好。
  • 是的,我在调试模式下运行它,但最初应用程序停止并在 logcat 中给出了该异常。也许我以错误的方式实现了它?在将此解决方案添加到我的应用程序之前,我已经实现了捕获图像并获取该图像的 uri。然后我将您的解决方案添加到另一个类“ColorFinder”中。我已经在我的主要活动中设定了进行 ColorFinder 活动的意图。然后,在 onCreate 函数中,我获取了图像 uri,然后我得到了它的位图版本。然后我按照您所说的在 onCreate 函数中运行您的解决方案:
  • new ColorFinder(new CallbackInterface() { @Override public void onCompleted(String color) { Toast.makeText(getApplicationContext(), "Your Color : " + color, Toast.LENGTH_SHORT).show(); } }).findDominantColor(imageBitmap);是不是我在实现中犯了错误?
  • 在实现中看起来像一个错误。我得看看你是如何实现代码才能提供帮助的。
猜你喜欢
  • 1970-01-01
  • 2011-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多