Android OpenCv 提取图像的RGB三原色分割图像Split Core.split

2023-11-19

基础知识

如果你还不了解 图片 是如何存储的,建议先去看这篇文章 关于三通道彩色图像的存储方式理解

函数简析

我们都知道,彩色图片每个像素点都对应三个值 如 [R,G,B],Core.split()这个函数则是帮我们这三个值分开,即分别提取 R,G,B各通道的灰度值

效果演示

代码解析

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <ImageView
        android:id="@+id/iv_img"
        android:layout_width="match_parent"
        android:layout_height="300dp"/>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <Button
            android:id="@+id/btn_loadimg"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="wrap_content"
            android:text="导入图片"/>
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <ImageView
            android:id="@+id/iv_img_one"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"/>
        <ImageView
            android:id="@+id/iv_img_two"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"/>
        <ImageView
            android:id="@+id/iv_img_three"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"/>
    </LinearLayout>

</LinearLayout>

MainActivity

package com.wust.opencv0;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import android.content.ContentResolver;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

import org.opencv.android.OpenCVLoader;
import org.opencv.android.Utils;
import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.imgproc.Imgproc;

import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    // Used to load the 'native-lib' library on application startup.
    static {
        System.loadLibrary("native-lib");
    }

    private ImageView iv_img;
    private Button btn_loadimg;
    private Bitmap bitmap;
    private List<ImageView> imageViewList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        iv_img = findViewById(R.id.iv_img);
        btn_loadimg = findViewById(R.id.btn_loadimg);

        ImageView iv_img_one = findViewById(R.id.iv_img_one);
        ImageView iv_img_two = findViewById(R.id.iv_img_two);
        ImageView iv_img_three = findViewById(R.id.iv_img_three);
        imageViewList = new ArrayList<>();
        imageViewList.add(iv_img_one);
        imageViewList.add(iv_img_two);
        imageViewList.add(iv_img_three);


        btn_loadimg.setOnClickListener(this);
    }

    /**
     * A native method that is implemented by the 'native-lib' native library,
     * which is packaged with this application.
     */
    public native String stringFromJNI();

    @Override
    public void onClick(View v) {
        switch(v.getId()){
            case R.id.btn_loadimg:
                loadImage();
                break;
        }
    }

    private void loadImage() {
        Intent intent = new Intent();
        intent.setType("image/*");
        intent.setAction(Intent.ACTION_GET_CONTENT);
        startActivityForResult(intent,1);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == RESULT_OK){
            try {
                Uri uri = data.getData();
                ContentResolver cr = getContentResolver();
                bitmap = BitmapFactory.decodeStream(cr.openInputStream(uri));
                iv_img.setImageBitmap(bitmap);
                minMaxLoc(bitmap); //在这个地方调用了 minMaxLoc() 讲解Core.split()只是个小 
                                   //插曲,所以,函数命名看起来不是很规范
            } catch (Exception e) {
                Log.e("MainActivity",e.getMessage(),e);
            }
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        if (!OpenCVLoader.initDebug()){
            Log.e("MainActivity","内置OpenCv没有找到,请下载OpenCV Manage");
        }else {
            Log.e("MainActivity","内置OpenCv找到了");
        }
    }

    private void minMaxLoc(Bitmap sorce){
        Mat sorceMat = new Mat();
        Utils.bitmapToMat(sorce,sorceMat);
        List<Mat> bgrList = new ArrayList();
        //最为关键的就是这句话,第一个参数:4通道图像对应的 Mat,第二个参数:装 Mat 的 List
        Core.split(sorceMat,bgrList);  
        for (int i = 0; i < 3; i++) {  //因为 bgrList 里面有4个(包含透明度) 为了与 
                                       //imageViewList长度对 
                                       //应,所以写死了 为 3 
            Mat letMat = bgrList.get(i);
            System.out.println("我被执行了" + letMat);
            Bitmap letBitmap = Bitmap.createBitmap(letMat.width(),letMat.height(), Bitmap.Config.ARGB_8888);
            Utils.matToBitmap(letMat,letBitmap);
            imageViewList.get(i).setImageBitmap(letBitmap);
        }
    }
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android OpenCv 提取图像的RGB三原色分割图像Split Core.split 的相关文章

随机推荐

  • SemanticKitti数据集的使用

    简单介绍 SemanticKitti数据集是在Kitti数据集上进行语义分割等操作的结果 主要任务包括点云的语义预测等 Kitti的点云里程计数据集一共有00 21这22个序列 每个序列都是一段录制的点云包 SemanticKitti为所有
  • ER模型详解

    ER 实体联系 模型中有三个主要的概念 实体集 属性 联系集 实体集对应的是数据库中的一个表 一个实体则对应数据库表中的一行 一个属性则对应数据库表中的一列 则就是一个字段 联系集就是表与表之间的关联关系 一对一关联 两个表的实体是一一对应
  • QT信号和槽的链接问题

    QT中常用的连接信号和槽的方式为以下两种 方法1 connect ui btnClose SIGNAL clicked Widget SLOT close 方法2 connect ui btnClose QPushButton clicke
  • R语言学习笔记:分析学生的考试成绩

    孩子上初中时拿到过全年级一次考试所有科目的考试成绩表 正好可以用于R语言的统计分析学习 为了不泄漏孩子的姓名 就用学号代替了 感兴趣可以下载测试数据进行练习 num class chn math eng phy chem politics
  • splunk 之 搜索(Searching)

    Let s Searching Results Example Results Example 注意 在结果之上 有一个菜单项允许您更改页面上显示的事件的数量 默认情况下 这个选项是每页20个 但是您可以单击这个选项来增加或减少这个数字 t
  • hooks中useEffect()使用总结

    常见使用 获取数据案例 import React useState useEffect from react import axios from axios function App const data setData useState
  • 非线性控制3.0——常用镇定算法之Lyapunov 直接法与间接法

    一 非线性系统镇定方法 Lyapunov 直接法与间接法 俄国学者李雅普诺夫提出的稳定性定理采用了状态向量来描述 适用于单变量 线性 非线性 定常 时变 多变量等系统 该方法称为李雅普诺夫法 有两种分类 1 李氏第一法 间接法 求解特征方程
  • css 实现相关案例

    css 实现相关案例 抽屉案例 带吸附箭头
  • ES删除数据

    ES删除数据 注意 删除数据请谨慎执行 删除大于 日期的 其他场景可参照执行 DeleteQuery deleteQuery new DeleteQuery deleteQuery setIndex es中 index deleteQuer
  • ORACLE数据库备份管理-rman备份到NFS

    1 相关案例 1 df h无法正常显示文件系统挂载情况 使用如下命令进行处理 umount f nfsdir 2 节点启动出现问题 询问是否包含nfs服务 将分享节点nfs服务重启 1 案例1从linux linux 实施脚本如下 mkdi
  • LeetCode 237. 删除链表中的节点

    题目链接 点击这里 Definition for singly linked list public class ListNode int val ListNode next ListNode int x val x class Solut
  • 深度学习(一)深度学习的概念

    什么是深度学习 深度学习是机器学习与神经网络 人工智能 图形化建模 优化 模式识别和信号处理等技术融合后产生的一个领域 深度学习网路是神经网络革命性的发展 人们甚至认为可以用它来创建更加强大的预测模型 深度学习的分类 深度学习使用多层机器学
  • CMakeLists中条件判断: if()-endif()成对出现

    缺少endif 时提示代码块opening is not closed 1 if if xxx 要缩进 endif 2 if else if xxx 要缩进 else xxx 要缩进 endif
  • Windows RuntimeError: Distributed package doesn‘t have NCCL built in问题

    问题描述 python在windows环境下dist init process group backend rank world size 处报错 RuntimeError Distributed package doesn t have
  • Serilog + SQL Server 动态分表记录日志

    Serilog SQL Server 分表记录日志 Serilog SQL Server 动态分表记录日志 依赖包 安装依赖包 配置 appsettings json 配置 Program cs Serilog SQL Server 动态分
  • visio 科学图形包_Gnuplot科学绘图(三十九)——地图及圆圈数据图

    Gnuplot科学绘图 系列内容Gnuplot科学绘图 三十一 曲线色彩填充 Gnuplot科学绘图 三十二 填充风格Gnuplot科学绘图 三十三 柱状图Gnuplot科学绘图 三十四 阶梯图Gnuplot科学绘图 三十五 数据平滑Gnu
  • element-ui中日期区间组件

    elementui中日期组件使用 最长只能选择3个月 不限制禁用日期 描述 时间组件代码 描述 点击 确定 按钮进行验证 点击 清空 按钮 清空输入框中的数据 时间范围不能超过3个月 并添加快捷选择今天 最近一周 最近一月 最近3个月 以下
  • js正则 年龄只能为正数,不能为负数,且不能超过150

    需求 要对输入的年龄加条件限制 不能任意输入 只能为正数 不能输入小数 负数
  • 正则表达式(日期、金额、特殊字符)_java语言

    正则表达式 java 正则表达式在线测试网站 个人觉得还算精确 http tool chinaz com regex 备注 如有错误 希望留言指出 虚心请教 金额格式 正数 包含至多2位小数 第1种形式 校验金额格式是否正确 正数 包含至多
  • Android OpenCv 提取图像的RGB三原色分割图像Split Core.split

    基础知识 如果你还不了解 图片 是如何存储的 建议先去看这篇文章 关于三通道彩色图像的存储方式理解 函数简析 我们都知道 彩色图片每个像素点都对应三个值 如 R G B Core split 这个函数则是帮我们这三个值分开 即分别提取 R