牙叔教程 简单易懂
效果展示
KMeans 数据分类
- KMeans算法的作者是MacQueen, KMeans的算法是对数据进行分类的算法,采用的硬分类方式,是属于非监督学习的算法;
- 对于给定的样本集,按照样本之间的距离大小,将样本划分为K个簇,让簇内的点尽量紧密的连接在一起,而让簇间的距离尽量的大。
参数控制
- 聚类的颜色数量, 第一张图片是3个颜色, 其他是10个颜色
技能点
- 全屏
- 在autojs中使用kmeans
- 选择文件
- 绘制色卡
- list的使用
- 浏览和保存mat
- 颜色rgb三通道分离
- toolbar修改左上角图标及其颜色
环境
手机: Mi 11 Pro
Android版本: 12
Autojs版本: 9.1.6
代码讲解
1. 色卡是一个View
<View id="colorCard" marginTop="10" h="40dp" visibility="gone" bg="#ff0000"></View>
颜色聚类, 获取到数据以后, 绘制色卡用下面的方法
function drawColor(view, dataList) {
var drawable = new android.graphics.drawable.Drawable({
draw: function (canvas) {
var len = dataList.length;
let viewWidth = view.getWidth();
let viewHeight = view.getHeight();
let lastX = 0;
let paint = new android.graphics.Paint();
for (var i = 0; i < len; i++) {
let color = dataList[i].color;
let percent = dataList[i].percent;
let x = lastX;
let y = 0;
let width = viewWidth * percent;
let height = viewHeight;
lastX = x + width;
let rect = new android.graphics.Rect(x, y, x + width, y + height);
paint.setColor(colors.parseColor(color));
canvas.drawRect(rect, paint);
}
},
});
view.setBackgroundDrawable(drawable);
}
2. 颜色列表
<list id="list" marginTop="10">
<horizontal gravity="center" w="*" marginTop="16">
<card cardCornerRadius="15" w="30" h="30" marginRight="60" bg="#ff00ff">
<View id="colorDisplayArea" bg="{{this.color}}">
</View>
</card>
<text id="colorValue" w="110dp" marginRight="60" text="{{this.color}}" size="20sp" textColor="#000000">
</text>
<text id="colorRatio" w="60dp" text="{{this.percent}}" size="20sp" textColor="#000000">
</text>
</horizontal>
</list>
美观一点, 我们把View呈现为圆形, 再显示颜色数值, 和颜色的比例
3. 选择文件
ui.logo.click(function () {
intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
activity.startActivityForResult(intent, imgRequestCode);
});
选择文件之前, 要设置文件选择监听, 然后获取到文件路径
4. 监听文件选择结果
activity.getEventEmitter().on("activity_result", (requestCode, resultCode, data) => {
if (requestCode == imgRequestCode) {
if (resultCode == activity.RESULT_OK) {
let uri = data.getData();
let path = uri.getPath();
path = decodeURIComponent(path);
}
}
});
5, 模块调试
if (typeof module === "object") {
module.exports = getColorData;
} else {
let imgPath = "./small11645897022391.png";
getColorData(imgPath);
}
有时候要单独调试模块, 不想频繁的切换注释module.exports, 就可以通过判断module是不是object,
如果是就说明是当模块来使用, 如果不是就说明在调试模块,
这样就不用一直切换module.exports的注释了
6. 图片类型
Imgproc.cvtColor(mat, mat2, Imgproc.COLOR_BGRA2RGBA);
保存图片之前, 需要转换图片的颜色类型, 因为opencv是bgr格式的图片, autojs是rgb格式的图片
名人名言
思路是最重要的, 其他的百度, bing, stackoverflow, github, 安卓文档, autojs文档, 最后才是群里问问
--- 牙叔教程
声明
部分内容来自网络
本教程仅用于学习, 禁止用于其他用途