在 Android 中实现颜色检测的最佳方法是什么?
What is the best way to implement Color Detection in Android?
我想在Android中实现颜色检测。我真正想做的是在用 Android 相机拍照后,我想检测该照片中物体的颜色。我的目标是根据颜色强度检测颜色。此时,我搜索并看到了与此目标相关的不同方法。有一些算法将图像转换为位图,然后检测颜色,其中一些使用 RGB。此外,我看到 OpenCV 也是该问题的已知解决方案。
现在,我想知道我应该走哪条路。哪种方式更适合我的情况。有没有人可以通过某种方法帮助和指导我?
如有任何帮助,我们将不胜感激。提前谢谢大家。
如果我对你的问题的理解正确,你需要一种方法来拍摄图像并确定该方法中最主要的颜色,然后 return 结果。
我整理了一个 class,应该可以为您提供结果,不知道它是否是最有效的算法,但请尝试一下。
要实施该解决方案,您可以执行以下操作
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;
}
}
我想在Android中实现颜色检测。我真正想做的是在用 Android 相机拍照后,我想检测该照片中物体的颜色。我的目标是根据颜色强度检测颜色。此时,我搜索并看到了与此目标相关的不同方法。有一些算法将图像转换为位图,然后检测颜色,其中一些使用 RGB。此外,我看到 OpenCV 也是该问题的已知解决方案。
现在,我想知道我应该走哪条路。哪种方式更适合我的情况。有没有人可以通过某种方法帮助和指导我?
如有任何帮助,我们将不胜感激。提前谢谢大家。
如果我对你的问题的理解正确,你需要一种方法来拍摄图像并确定该方法中最主要的颜色,然后 return 结果。
我整理了一个 class,应该可以为您提供结果,不知道它是否是最有效的算法,但请尝试一下。 要实施该解决方案,您可以执行以下操作
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;
}
}