android颜色识别

article/2025/8/26 19:37:42

写的一个关于颜色识别的小功能。识别主要颜色。
思路:遍历像素点,找出出现次数最多的像素值作为主要颜色。
采用的方法有:
1.调用摄像头,拍照,裁剪,压缩。
2.找出色值。
3.转换成hsv空间,进行颜色判断
4.异步显示,主要是为了防止遍历图片时出现界面卡死的现象。颜色图片展示在imageview里,颜色信息用textview显示
搬了很多砖,最终可以了嘻嘻
MainActivity代码:

package com.example.newcolor;import androidx.annotation.NonNull;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.StrictMode;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;public class MainActivity extends Activity {private ImageView iv;private Button button;private File file;private Uri uri;private TextView textview;int width;int height;int color=255;String  str="";Handler handler=new Handler(){@Overridepublic void handleMessage(@NonNull Message msg) {super.handleMessage(msg);if(msg.what==0x123){Bitmap bitmap = Bitmap.createBitmap(width, height,Bitmap.Config.RGB_565);bitmap.eraseColor(color);//填充颜色iv.setImageBitmap(bitmap); // 将裁剪后的照片显示出来textview.setText(str);}}};protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);iv = (ImageView) findViewById(R.id.imageView1);button = (Button) findViewById(R.id.button1);if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();StrictMode.setVmPolicy( builder.build() );}file = new File(this.getExternalFilesDir(null), "image.jpg");uri = Uri.fromFile(file);textview=(TextView) findViewById(R.id.textView);button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubIntent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);intent.putExtra(MediaStore.Images.Media.ORIENTATION, 0);intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);startActivityForResult(intent, 2);}});}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {// TODO Auto-generated method stubsuper.onActivityResult(requestCode, resultCode, data);if (resultCode == RESULT_OK) {if (requestCode == 2) {startPhotoZoom(uri);} else {try {processThread();}catch (Exception e) {// TODO: handle exception}}}}/*** 裁剪图片** @param uri*/public void startPhotoZoom(Uri uri) {Intent intent = new Intent("com.android.camera.action.CROP");intent.setDataAndType(uri, "image/*");intent.putExtra("crop", "true");// crop=true 有这句才能出来最后的裁剪页面.intent.putExtra("aspectX", 1);// 这两项为裁剪框的比例.intent.putExtra("aspectY", 1);// x:y=1:1intent.putExtra("outputX", 200);//图片输出大小intent.putExtra("outputY", 200);intent.putExtra("output", uri);intent.putExtra("outputFormat", "JPEG");// 返回格式startActivityForResult(intent, 3);}/*** 将图片image压缩成大小为 size的图片(size表示图片大小,单位是KB)** @param image*            图片资源* @param size*            图片大小* @return Bitmap*/private Bitmap compressImage(Bitmap image, int size) {ByteArrayOutputStream baos = new ByteArrayOutputStream();// 质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中image.compress(Bitmap.CompressFormat.JPEG, 100, baos);int options = 100;// 循环判断如果压缩后图片是否大于100kb,大于继续压缩while (baos.toByteArray().length / 1024 > size) {// 重置baos即清空baosbaos.reset();// 每次都减少10options -= 10;// 这里压缩options%,把压缩后的数据存放到baos中image.compress(Bitmap.CompressFormat.JPEG, options, baos);}// 把压缩后的数据baos存放到ByteArrayInputStream中ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());// 把ByteArrayInputStream数据生成图片Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);return bitmap;}private void processThread(){//构建一个下载进度条new Thread(){@Overridepublic void run(){Log.i("tag", "run()-->"+Thread.currentThread().getName());//在新线程里执行长耗时方法BitmapFactory.Options options = new BitmapFactory.Options();options.inSampleSize = 2;Bitmap mBitmap = BitmapFactory.decodeFile(file.getPath(), options);width = mBitmap.getWidth();height = mBitmap.getHeight();// 保存所有的像素的数组,图片宽×高int[] pixels = new int[width * height];mBitmap.getPixels(pixels, 0, width, 0, 0, width, height);HashMap<Integer,Integer> color2=new HashMap<Integer, Integer>();for (Integer color:pixels){if (color2.containsKey(color)){Integer integer = color2.get(color);integer++;color2.remove(color);color2.put(color,integer);}else{color2.put(color,1);}}//挑选数量最多的颜色Iterator iter = color2.entrySet().iterator();int count=0;while (iter.hasNext()) {Map.Entry entry = (Map.Entry) iter.next();int value = (Integer) entry.getValue();if (count<value){count=value;color= (Integer) entry.getKey();}}float[] hsv = new float[3];int r = Color.red(color);int g = Color.green(color);int b = Color.blue(color);Color.RGBToHSV(r, g, b, hsv);float h=hsv[0]/2;float s=hsv[1]*255;float v=hsv[2]*255;System.out.println(hsv[0]/2);if ((h>= 0 && h<= 180)&& (s >= 0 && s<= 255)&& (v>= 0 && v<= 46)){System.out.println("black");str="black";}else if ((h >= 0 && h <= 180)&& (s >= 0 && s<= 43)&& (v>= 46 && v<= 220)){System.out.println("grey");str="grey";}else if ((h>= 0 && h<= 180)&& (s>= 0 && s<= 30)&& (v>= 221 && v <= 255)){System.out.println("white");str="white";}else if (((h>= 0 && h<= 10) || (h>= 156 && h <= 180))&& (s>= 43 && s <= 255)&& (v>= 46 && v <= 255)){System.out.println("red");str="red";}else if((h>=11&&h<=25)&&(s>=43&&s<=255)&&(v>=46&&v<=255)){System.out.println("orange");}else if ((h>= 26 && h <= 34)&& (s>= 43 && s <= 255)&& (v>= 46 && v<= 255)){System.out.println("yellow");str="yellow";}else if((h>=35&&h<=77)&&(s>=43&&s<=255)&&(v>=46&&v<=255)){System.out.println("green");str="green";}else if((h>=78&&h<=99)&&(s>=43&&s<=255)&&(v>=46&&v<=255)){System.out.println("qing");str="qing";}else if((h>=100&&h<=124)&&(s>=43&&s<=255)&&(v>=46&&v<=255)){System.out.println("blue");str="blue";}else if((h>=125&&h<=155)&&(s>=43&&s<=255)&&(v>=46&&v<=255)){System.out.println("purple");str="purple";}else{System.out.println("颜色库会进行相应补充");str="颜色库会进行相应补充";}//执行完毕后给handler发送一个空消息handler.sendEmptyMessage(0x123);}}.start();}}

activity_main.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"><ImageViewandroid:id="@+id/imageView1"android:layout_width="200dp"android:layout_height="200dp"android:layout_alignParentTop="true"android:layout_centerHorizontal="true"android:layout_marginTop="64dp"/><Buttonandroid:id="@+id/button1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@+id/imageView1"android:layout_centerHorizontal="true"android:layout_marginTop="174dp"android:text="颜色识别" /><TextViewandroid:id="@+id/textView"android:layout_width="match_parent"android:layout_height="48dp"android:text="TextView" /></RelativeLayout>

AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.newcolor"><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme"><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest>

效果展示:
在这里插入图片描述
在这里插入图片描述


http://chatgpt.dhexx.cn/article/wVlVaYk1.shtml

相关文章

颜色及图片识别原理,颜色识别传感器介绍

光及颜色 1.光&#xff1a;是人类眼睛可以看见的一种电磁波&#xff0c;也称可见光谱。在科学上的定义&#xff0c;光是指所有的电磁波谱。光是由光子为基本粒子组成&#xff0c;具有粒子性与波动性&#xff0c;称为波粒二象性&#xff0c;一般人的眼睛所能接受的光的波长在380…

颜色识别总结

颜色检测 1、目标检测detr 【End-to-End Object Detection with Transformers】 论文解读 源码复现 2、目标检测deformable detr 【DEFORMABLE DETR: DEFORMABLE TRANSFORMERS FOR END-TO-END OBJECT DETECTION】 论文解读 源码复现 3、目标检测mmdet中的deformable detr …

Python-OpenCV实现简单的颜色识别(对红色和蓝色识别并输出)

摄像头识别红色和蓝色并框选&#xff0c;当该颜色为摄像头屏幕上大多数颜色时打印出该颜色的名称 新手学习笔记&#xff0c;第一次写博客&#xff0c;若有错误还请指出&#xff08; ~_ &#xff09;~ 1.调包 import cv2 import numpy as np from matplotlib import pyplot as…

Python3识别判断图片主要颜色并和颜色库进行对比的方法

【更新】主要提供两种方案&#xff1a; 方案一&#xff1a;&#xff08;参考网上代码&#xff0c;感觉实用性不是很强&#xff09;使用PIL截取图像&#xff0c;然后将RGB转为HSV进行判断&#xff0c;统计判断颜色&#xff0c;最后输出RGB值 方案二&#xff1a;使用opencv库函…

【Python 之HSV颜色识别】

Python 之HSV颜色识别 前言一、HSV颜色模型二、黄色识别三、使用步骤1.引入库2.处理图片3.识别结果 总结 前言 汽车自动驾驶&#xff0c;需要颜色识别&#xff0c;如黄色/红色车道线&#xff0c;蓝色车牌。 本文从HSV颜色模型出发&#xff0c;提供一种识别黄色车道线的方法供参…

OpenCV识别图像中的颜色

OpenCV识别图像中的颜色 利用OpenCV识别图像中区域的颜色 效果如图所示&#xff1a; 代码中需要读取的图像RGB对照表&#xff1a; 代码中所需读取的BGR对照表在此下载&#xff1a;图像RBG对照表 import cv2 import pandas as pdimg_path "./rgb_pic/color.jpg" i…

openCV python 颜色识别

图像识别 这个代码的功能是根据摄像头输入的图像&#xff0c;识别红色块&#xff0c;绿色块的坐标&#xff0c;并返回红绿色块的中心点的图像坐标&#xff08;单位为像素&#xff09; 当然&#xff0c;识别色可以自己更改&#xff0c;如蓝色&#xff0c;白色&#xff0c;黑色…

K210视觉体验—颜色识别

K210视觉体验—颜色识别 使用设备ZTFR开发板 颜色识别Lab 颜色空间构造函数示例代码1&#xff1a;识别RGB&#xff08;红&#xff0c;绿&#xff0c;蓝&#xff09;示例代码2&#xff1a;识别指定颜色 使用设备 ZTFR开发板 颜色识别 MaixPy 集成了 RGB565 颜色块识别 find_blo…

Halcon 学习笔记八:颜色识别

Halcon 学习笔记八&#xff1a;颜色识别 一、图像处理需要的知识二、图像处理的预处理和分割过程二、颜色识别的方法三、例子一四、例子二五、例子三 一、图像处理需要的知识 1.图像处理基础&#xff08;rgb(hsv),gray&#xff09; 2.图像灰度变换(scale_img) 3.图像基础(emph…

基于Python的颜色识别器

点击上方“小白学视觉”&#xff0c;选择加"星标"或“置顶” 重磅干货&#xff0c;第一时间送达 在这篇文章中&#xff0c;我们将展示如何使用Python构建颜色识别器。此过程也称为“颜色检测”。我们将创建一个基本应用程序&#xff0c;该应用程序将帮助我们检测图像…

python颜色识别demo

一般对颜色空间的图像进行有效处理都是在HSV空间进行的&#xff0c;然后对于基本色中对应的HSV分量需要给定一个严格的范围&#xff0c;下面是通过实验计算的模糊范围&#xff08;准确的范围在网上都没有给出&#xff09;。 H: 0 — 180 S: 0 — 255 V: 0 — 255 此处把部分…

openCV-python实现颜色识别

本文将介绍使用OpenCV实现颜色识别的详细步骤 代码。 背景介绍 在截取出模板匹配到的logo区域之后&#xff0c;需要判断logo是什么颜色。本案例中要识别的对象是纯色的所以适用下面的颜色识别方法&#xff0c;有不同需求的请斟酌借鉴。 原理介绍 数字图像处理中常用的采用模型…

python颜色识别,46行代码实现865种颜色识别,看过的都说顶呱呱!

1.先介绍我做的颜色识别的功能&#xff0c;简单的说&#xff0c;就是该脚本可以打开图片&#xff0c;在图片上点击某个区域&#xff0c;可以识别某个区域的颜色&#xff0c;颜色识别准确度很高&#xff0c;很多时候颜色识别是辅助物体的颜色识别&#xff0c;但这个代码你们可以…

OpenCV(Python)颜色识别(一)

1. 基本原理 1.1 彩色模型 数字图像处理中常用的采用模型是RGB&#xff08;红&#xff0c;绿&#xff0c;蓝&#xff09;模型和HSV&#xff08;色调&#xff0c;饱和度&#xff0c;亮度&#xff09;&#xff0c;RGB广泛应用于彩色监视器和彩色视频摄像机&#xff0c;我们平时…

OpenCV颜色识别

彩色模型 数字图像处理中常用的采用模型是RGB&#xff08;红&#xff0c;绿&#xff0c;蓝&#xff09;模型和HSV&#xff08;色调&#xff0c;饱和度&#xff0c;亮度&#xff09;&#xff0c;RGB广泛应用于彩色监视器和彩色视频摄像机&#xff0c;我们平时的图片一般都是RGB…

LabVIEW色彩匹配实现颜色识别、颜色检验(基础篇—13)

目录 1、颜色识别 2、颜色检验 色彩匹配&#xff08;Color Matching&#xff09;是将模板图像与待测图像或其中某一区域的颜色进行比较&#xff0c;判断它们是否相同或相近的过程。它可以用于颜色识别、颜色检验以及彩色对象定位等基于色彩信息比较的应用程序。 色彩匹配通常…

Python 对图片进行颜色识别

场景&#xff1a;在进行压力测试时&#xff0c;需要判断图片的某一块区域是否是黑色 这里使用的是OpenCV库对图片进行颜色的识别&#xff0c;几乎可以识别所有常见的颜色 直接上代码 import cv2 import numpy as np import collectionsclass colorList:def getColorList(sel…

OpenCV颜色识别(所有颜色均可识别)

OpenCV颜色识别实例&#xff08;所有颜色均可识别&#xff09; 欢迎访问我的博客sakuraの绘梨衣 本文中的颜色识别为红色&#xff0c;颜色阈值设置如下&#xff1a; lower_apple np.array([0, 100, 100]) higher_apple np.array([10, 200, 200])识别其他颜色可以参考HSV颜色…

如何实现视觉识别颜色

1. 功能说明 通过摄像头识别特定颜色&#xff08;红、绿、蓝&#xff09;。摄像头采集图像信息并通过WiFi将信息传递给PC端&#xff0c;然后PC端根据比例判断出目标颜色在色盘上的所属颜色后&#xff0c;指针便会指向对应颜色。 红、绿、蓝-色块 2. 电子硬件 本实验中采用了以下…

Halcon——颜色识别提取

文章目录 前言一、颜色识别原理二、颜色识别为什么将其转换至HSV颜色空间三、源代码写在最后 前言 【Halcon】颜色识别提取 这里以嘉庚建筑风格为例~ 一、颜色识别原理 载入图像后&#xff0c;将其转换至HSV颜色空间&#xff0c;通过判断每个像素是否在所选取的范围内&…