引言
- 本插件是为了Autojs而开发的
OpenCV
插件。 - 学习文档:OpenCV 官方文档、OpenCV 中文文档
- 插件还在开发(Ctrl+C、Ctrl+V)中,本文用于存档。
如何使用插件
安装 Autojs.pro 9.3.11
、安装 OpenCV
插件,在脚本内初始化,仅需调用一次即可
var OpenCV = $plugins.load("com.daowuya.opencv");
详尽的API调用请见下文。
创建与释放
zeros 创建mat对象
创建一个空mat对象。
参数
字段 | 类型 | 必须 | 说明 |
---|---|---|---|
width | int |
是 | 图像宽度 |
heigth | int |
是 | 图像高度 |
type | int |
(可选) 默认=16 | 图像类型。16=彩色图、0=灰色图 24=全彩RGBA图像 |
color | int[] |
(可选) 默认=[0,0,0,0] | 填充颜色(RGBA)。默认:黑色[0,0,0,0]。 |
返回值
mat|null
调用示例
// 生成纯红色图并保存
var mat = OpenCV.zeros(100, 100, 16, [255, 0, 0, 0]);
OpenCV.toFile(mat, "/sdcard/Pictures/红.png");
OpenCV.release(mat);
release 释放mat对象
释放 mat 对象占用的内存空间,释放后该mat对象不应再使用。
参数
无
返回值
无
调用示例
OpenCV.release(mat);
copy 复制mat对象
复制一个现有mat对象的完整拷贝。
参数
字段 | 类型 | 必须 | 说明 |
---|---|---|---|
mat | mat |
是 | mat对象 |
返回值
mat|null
调用示例
var mat = OpenCV.copy(mat);
载入和导出
loadFromFile 从文件加载
从文件加载资源。支持png、bmp、jpg等格式。
参数
字段 | 类型 | 必须 | 说明 |
---|---|---|---|
fileName | string |
是 | 文件路径,如:/sdcard/Pictures/1.jpg |
mode | int |
(可选) 默认=1 | 加载模式。-1=图像的全部通道、 0=灰度。 1=彩色3通道 |
返回值
mat|null
调用示例
// 彩色图转灰色图,载入时使用灰度模式载入,再保存成另一个图像文件
var mat=OpenCV.loadFromFile("/sdcard/Pictures/1.jpg",0);
OpenCV.toFile(mat,"/sdcard/Pictures/彩色转灰色.jpg");
OpenCV.release(mat);
loadFromBitmap 从BitMap加载
从bitMap加载资源。bitmap图像资源必须为3通道或4通道。
参数
字段 | 类型 | 必须 | 说明 |
---|---|---|---|
bitmap | bitmap |
是 | bitmap对象 |
mode | boolean |
(可选) 默认=true | 加载资源时,是否保留A通道。默认保留。 |
返回值
mat|null
调用示例
// 加载Autojs截图数据并保存
var capture = $automator.takeScreenshot(); // 截图
var mat=OpenCV.loadFromBitmap(capture.bitmap); // 从bitmap加载
OpenCV.toFile(mat, "/sdcard/Pictures/bitmap.png"); // 保存到文件
OpenCV.release(mat);//释放
capture.recycle();
toFile 保存到文件
- 把mat对象的图像数据保存到文件。文件的后缀名决定了保存的格式。
- 该功能也可用作png、jpg、bmp、等图像格式之间的转换。
参数
字段 | 类型 | 必须 | 说明 |
---|---|---|---|
mat | mat |
是 | mat矩阵对象 |
filePath | string |
是 | 欲保存的图像路径 |
返回值
boolean
调用示例
OpenCV.toFile(mat, "/sdcard/Pictures/bitmap.png");
toBitmap 转到bitmap
mat矩阵对象中的图像数据,转换到bitmap。
参数
字段 | 类型 | 必须 | 说明 |
---|---|---|---|
mat | mat |
是 | 欲转换mat对象 |
返回值
bitmap | null
调用示例
var bitmap = OpenCV.toBitmap(mat);
console.log(bitmap)
属性获取
getHeight 取高度
取mat对象高度。也可以调用原生 mat.rows()
获取宽度。
参数
字段 | 类型 | 必须 | 说明 |
---|---|---|---|
mat | mat |
是 | mat对象 |
返回值
-1表示mat对象无效。
调用示例
console.log("图像高度:", OpenCV.getHeight(mat));
getWidth 取宽度
取mat对象宽度。也可以调用原生 mat.cols()
获取宽度。
参数
字段 | 类型 | 必须 | 说明 |
---|---|---|---|
mat | mat |
是 | mat对象 |
返回值
-1表示mat对象无效。
调用示例
console.log("图像宽度:", OpenCV.getWidth(mat));
getType 取类型
取mat对象类型。也可以调用原生 mat.type()
获取类型。
参数
字段 | 类型 | 必须 | 说明 |
---|---|---|---|
mat | mat |
是 | mat对象 |
返回值
-1表示mat对象无效。
调用示例
console.log("图像类型:", OpenCV.getType(mat));
getChannels 取通道数
取mat对象中图像的通道数量。也可以调用原生 mat.channels()
获取类型。
参数
字段 | 类型 | 必须 | 说明 |
---|---|---|---|
mat | mat |
是 | mat对象 |
返回值
-1表示mat对象无效。
调用示例
console.log("图像通道数:", OpenCV.getChannels(mat));
颜色转换
toGray 转到灰度
灰度化图像。颜色格式必须为 颜色格式必须为 BGR
、BGRA
、Gray
参数
字段 | 类型 | 必须 | 说明 |
---|---|---|---|
mat | mat |
是 | 欲转换的mat对象 |
返回值
mat | null
调用示例
var mat=OpenCV.loadFromFile("/sdcard/Pictures/1.jpg"); // 载入图像
var mat_gray=OpenCV.toGray(mat); // 转灰度
OpenCV.toFile(mat_gray, "/sdcard/Pictures/转灰色.jpg"); // 保存到文件
OpenCV.release(mat);
OpenCV.release(mat_gray);
toBGR 转到BGR
- 转到BGR。颜色格式必须为 颜色格式必须为
BGR
、BGRA
、Gray
- 本插件所有操作仅支持BGR和灰度
参数
字段 | 类型 | 必须 | 说明 |
---|---|---|---|
mat | mat |
是 | 欲转换的mat对象 |
返回值
mat | null
调用示例
var mat = OpenCV.loadFromFile("/sdcard/Pictures/1.jpg", 0); // 载入时使用灰度模式载入
var mat_bgr=OpenCV.toBGR(mat); // 转BGR
OpenCV.toFile(mat_bgr, "/sdcard/Pictures/转BGR.jpg"); // 保存到文件
OpenCV.release(mat);
OpenCV.release(mat_bgr);
toBGRA 转到BGRA
- 转到BGRA。颜色格式必须为 颜色格式必须为
BGR
、BGRA
、Gray
- 本插件所有操作仅支持BGR和灰度
参数
字段 | 类型 | 必须 | 说明 |
---|---|---|---|
mat | mat |
是 | 欲转换的mat对象 |
返回值
mat | null
调用示例
var mat = OpenCV.loadFromFile("/sdcard/Pictures/1.jpg", 0); // 载入时使用灰度模式载入
var mat_bgra=OpenCV.toBGRA(mat); // 转BGRA
OpenCV.toFile(mat_bgra, "/sdcard/Pictures/转BGRA.jpg"); // 保存到文件
OpenCV.release(mat);
OpenCV.release(mat_bgra);
贴图与裁剪
reSize 缩放图像
缩放图像。
参数
字段 | 类型 | 必须 | 说明 |
---|---|---|---|
mat | mat |
是 | 欲缩放的mat对象 |
width | int |
是 | 图像新宽度(需大于0) |
height | int |
是 | 图像新高度(需大于0) |
参数(重载)
字段 | 类型 | 必须 | 说明 |
---|---|---|---|
mat | mat |
是 | 欲缩放的mat对象 |
bfb | int |
是 | 缩放百分比(需大于0) |
返回值
mat | null
调用示例
// 图像比例缩放、自定义缩放
var mat = OpenCV.loadFromFile("/sdcard/Pictures/1.jpg");// 载入图像
var mat_50 = OpenCV.reSize(mat,50); // 缩放50%
var mat_自定宽高缩放 = OpenCV.reSize(mat,100,100); // 自定宽高缩放
OpenCV.toFile(mat_50, "/sdcard/Pictures/mat_50.png"); // 保存到文件
OpenCV.toFile(mat_自定宽高缩放, "/sdcard/Pictures/mat_自定宽高缩放.png");
OpenCV.release(mat_50); // 释放
OpenCV.release(mat); // 释放
OpenCV.release(mat_自定宽高缩放); // 释放
bitBlt 贴图拷贝
bitBlt可以进行图像块拷贝,从一幅图像中裁剪指定大小图像块,拷贝贴图到另一幅图像中。并可设置阿尔法权重,亮度校正,可用于:制作长图、logo水印。
参数
字段 | 类型 | 必须 | 说明 |
---|---|---|---|
mat1 | mat |
是 | 贴图目标mat |
x1 | int |
是 | 贴图左上角x(应大于 -1) |
y1 | int |
是 | 贴图左上角y (应大于 -1) |
x2 | int |
是 | 贴图右下角x,为-1时,表示缺省大小。否则将对裁剪图进行缩放。以迎合参数设置 |
y2 | int |
是 | 贴图右下角y,为-1时,表示缺省大小。否则将对裁剪图进行缩放。以迎合参数设置 |
mat2 | mat |
是 | 裁剪目标mat |
x1 | int |
是 | 裁剪左上角x (应大于 -1) |
y1 | int |
是 | 裁剪左上角y (应大于 -1) |
x2 | int |
是 | 裁剪右下角x,为-1时,表示缺省大小。 |
y2 | int |
是 | 裁剪右下角y,为-1时,表示缺省大小。 |
alpha | float |
是 | 裁剪图贴到目标图像上时的混合权重,裁剪图的透明度,0-1之间。 |
gamma | float |
是 | 亮度校正值,表示混合之后是否进行亮度校正(提升或降低)-255-255之间,一般设置0 |
返回值
boolean
调用示例
// 图像色调调整
var mat = OpenCV.loadFromFile("/sdcard/Pictures/1.jpg");
//创建一个大小与原图大小、类型一致的图像。
var mat_color = OpenCV.zeros(mat.cols(), mat.rows(), mat.type());
//使用绘制矩形方法,给图像填充指定颜色(粉红)。
OpenCV.rectangle(mat_color, 0, 0, mat.cols(), mat.rows(), [250,103,107,0]);
//使用bitBlt进行贴图。
OpenCV.bitBlt(mat, 0, 0, -1, -1, mat_color, 0, 0, -1, -1, 0.2, 0);
//保存结果到文件。
OpenCV.toFile(mat,"/sdcard/Pictures/tem1.jpg");
//释放
OpenCV.release(mat);
OpenCV.release(mat_color);
// 制作长图
// 原理:先使用zeros创建一个长图的模板,然后使用bitBlt往这个模板贴图,仅需要通过参数控制贴图范围。alpha参数决定了贴图透明度,当不需要透明度时,alpha的值应该设置为1。
var mat = OpenCV.loadFromFile("/sdcard/Pictures/1.jpg");
//将一个图片竖向拼接三份成长图
//创建一个长图模板 w*3h
var mat_long = OpenCV.zeros(OpenCV.getWidth(mat), OpenCV.getHeight(mat) * 3, 16);
//使用bitBlt将原图拷贝三次到长图模板
for (var i = 0; i < 3; i++) {
OpenCV.bitBlt(mat_long, 0, i * OpenCV.getHeight(mat), -1, -1, mat, 0, 0, -1, -1, 1, 0);
}
//保存结果到文件
OpenCV.toFile(mat_long, "/sdcard/Pictures/tem1.jpg");
//释放
OpenCV.release(mat);
OpenCV.release(mat_long);
cut 裁剪图像
从指定mat对象中,裁剪图像的一部分。
参数
字段 | 类型 | 必须 | 说明 |
---|---|---|---|
mat | mat |
是 | 输入mat对象 |
x1 | int |
是 | 裁剪左上角x。如为-1,将返回图像的完整拷贝 |
y1 | int |
是 | 裁剪左上角y。如为-1,将返回图像的完整拷贝 |
x2 | int |
是 | 裁剪右下角x。如为-1,将返回图像的完整拷贝 |
y2 | int |
是 | 裁剪右下角y。如为-1,将返回图像的完整拷贝 |
返回值
mat | null
调用示例
// 图像裁剪
var mat = OpenCV.loadFromFile("/sdcard/Pictures/1.jpg");
//从原图上裁剪[0,0,128,128]区域并返回新的mat对象。
var mat_cut = OpenCV.cut(mat, 0, 0, 128, 128);
//保存结果到文件。
OpenCV.toFile(mat_cut, "/sdcard/Pictures/tem1.jpg");
//释放
OpenCV.release(mat);
OpenCV.release(mat_cut);
pyrUp 上采样
上采样,放大并模糊图像。用于构建图像金字塔。把图像尺寸放大为原来的 2 倍,同时平滑处理,避免锯齿或噪点。
参数
字段 | 类型 | 必须 | 说明 |
---|---|---|---|
mat | mat |
是 | mat对象 |
返回值
mat | null
调用示例
var mat = OpenCV.loadFromFile("/sdcard/Pictures/1.jpg");
//进行pyrUp上采样
var mat_result = OpenCV.pyrUp(mat);
OpenCV.toFile(mat_result, "/sdcard/Pictures/tem1.jpg");
OpenCV.release(mat);//释放
OpenCV.release(mat_result);//释放
pyrDown 下采样
下采样,缩小并模糊图像。用于构建图像构建图像金字塔。先自动高斯模糊,缩小图像为原来的 1/2。
参数
字段 | 类型 | 必须 | 说明 |
---|---|---|---|
mat | mat |
是 | mat对象 |
返回值
mat | null
调用示例
var mat = OpenCV.loadFromFile("/sdcard/Pictures/1.jpg");
//进行pyrDown下采样
var mat_result = OpenCV.pyrDown(mat);
OpenCV.toFile(mat_result, "/sdcard/Pictures/tem1.jpg");
OpenCV.release(mat);//释放
OpenCV.release(mat_result);//释放
基础绘制
drawText 写字
在mat对象中写字。(支持中文)
参数
字段 | 类型 | 必须 | 说明 |
---|---|---|---|
mat | mat |
是 | mat对象 |
str | string |
是 | 欲写到mat上的文字(支持中文),文本换行支持使用换行符\n |
sx | int |
是 | 画出位置x(文字左下角位置) |
sy | int |
是 | 画出位置y(文字左下角位置) |
textSize | int |
(可选)默认=22 | 字体大小 |
color_int_arr4 | int[] |
(可选)默认红色=[255,0,0,255] | 文字颜色。RGBA数组。(A通道控制文字绘制透明度) |
shadowColor | int[] |
(可选)默认=文字颜色 | 阴影颜色。RGBA数组 |
style | int |
(可选)默认=2 | 0、描边、1、填充、2、描边和填充 |
radius | int |
(可选)默认=0 | 阴影半径 |
dx | int |
(可选)默认=0 | 阴影偏移 |
dy | int |
(可选)默认=0 | 阴影偏移 |
SkewX | float |
(可选)默认=0 | 设置文字的 x 轴斜体程度,值越负 → 向右倾斜(正体),值越正 → 向左倾斜(反斜体) |
scaleX | float |
(可选)默认=1 | 设置文字在 X 轴的缩放比例,值 < 1.0 → 压缩字体,值 > 1.0 → 拉伸字体 |
spacing | float |
(可选)默认=0 | 字之间间距 |
fontPath | string |
(可选)默认=null(使用默认字体) | 自定义字体的本地存储路径,字体必须是 .ttf 或 .otf |
返回值
boolean
调用示例
// 常用发光字
var mat = OpenCV.zeros(500, 200, 16);
var mat_text = OpenCV.cut(mat, -1, -1, -1, -1);//拷贝
OpenCV.drawText(mat_text, "道无涯(发光字)", 50, 75, 50, [0, 255, 0, 255], [0, 255, 0, 255], 2, 10);//写字
OpenCV.toFile(mat_text, "/sdcard/Pictures/tem1.jpg");
OpenCV.release(mat_text);// 释放
OpenCV.release(mat);
// 不发光字
var mat = OpenCV.zeros(500, 200, 16);
var mat_text = OpenCV.cut(mat, -1, -1, -1, -1);//拷贝
OpenCV.drawText(mat_text, "道无涯(不发光)", 50, 75, 50, [0, 255, 0, 255], [0, 0, 0, 0], 2);//写字
OpenCV.toFile(mat_text, "/sdcard/Pictures/tem2.jpg");
OpenCV.release(mat_text);// 释放
OpenCV.release(mat);
// 仅描边
var mat = OpenCV.zeros(500, 200, 16);
var mat_text = OpenCV.cut(mat, -1, -1, -1, -1);//拷贝
OpenCV.drawText(mat_text, "道无涯(仅描边)", 50, 75, 50, [0, 255, 0, 255], [0, 0, 0, 0], 0);//写字
OpenCV.toFile(mat_text, "/sdcard/Pictures/tem3.jpg");
OpenCV.release(mat_text);// 释放
OpenCV.release(mat);
// 描边发光
var mat = OpenCV.zeros(500, 200, 16);
var mat_text = OpenCV.cut(mat, -1, -1, -1, -1);//拷贝
OpenCV.drawText(mat_text, "道无涯(描边发光)", 50, 75, 50, [0, 255, 0, 255], [0, 255, 0, 255], 0, 10);//写字
OpenCV.toFile(mat_text, "/sdcard/Pictures/tem4.jpg");
OpenCV.release(mat_text);// 释放
OpenCV.release(mat);
// x轴拉伸
var mat = OpenCV.zeros(500, 200, 16);
var mat_text = OpenCV.cut(mat, -1, -1, -1, -1);//拷贝
OpenCV.drawText(mat_text, "x轴拉伸", 50, 125, 20, [0, 255, 0, 255], [0, 255, 0, 255], 2, 0, 0, 0, 0, 5, 0);//写字
OpenCV.toFile(mat_text, "/sdcard/Pictures/tem5.jpg");
OpenCV.release(mat_text);// 释放
OpenCV.release(mat);
// x轴右倾斜
var mat = OpenCV.zeros(500, 200, 16);
var mat_text = OpenCV.cut(mat, -1, -1, -1, -1);//拷贝
OpenCV.drawText(mat_text, "x轴右倾斜", 50, 125, 50, [0, 255, 0, 255], [0, 255, 0, 255], 2, 0, 0, 0, -0.25, 1, 0);//写字
OpenCV.toFile(mat_text, "/sdcard/Pictures/tem6.jpg");
OpenCV.release(mat_text);// 释放
OpenCV.release(mat);
// 使用自定义字体
var mat = OpenCV.zeros(500, 200, 16);
var mat_text = OpenCV.cut(mat, -1, -1, -1, -1);//拷贝
OpenCV.drawText(mat_text, "这是自定义的TTF字体(问藏书房.ttf)", 50, 125, 30, [0, 255, 0, 255], [0, 255, 0, 255], 2, 0, 0, 0, 0, 1, 0, "/sdcard/Pictures/问藏书房.ttf");//写字
OpenCV.toFile(mat_text, "/sdcard/Pictures/tem7.jpg");
OpenCV.release(mat_text);// 释放
OpenCV.release(mat);
line 画直线
画直线
参数
字段 | 类型 | 必须 | 说明 |
---|---|---|---|
mat | mat |
是 | mat对象 |
sx | int |
是 | 起点坐标x |
sy | int |
是 | 起点坐标y |
ex | int |
是 | 终点坐标x |
ey | int |
是 | 终点坐标y |
color_int_arr4 | int[] |
(可选)默认红色=[255,0,0,255] | 颜色,4成员数组,RGBA。 |
width | int |
(可选)默认=1 | 线宽度 |
type | int |
(可选)默认=8 | 填充类型。8:八邻域填充法;4:四邻域填充法;16:反锯齿填充法 |
shift | int |
(可选)默认=0 | 偏移 |
返回值
boolean
调用示例
// 画一个正方形
var mat = OpenCV.zeros(300, 300, 16);
OpenCV.line(mat, 100, 100, 200, 100, [255, 0, 0, 0], 1);
OpenCV.line(mat, 100, 100, 100, 200, [0, 255, 0, 0], 2);
OpenCV.line(mat, 200, 200, 200, 100, [0, 0, 255, 0], 3);
OpenCV.line(mat, 200, 200, 100, 200, [0, 0, 255, 0], 4);
OpenCV.toFile(mat, "/sdcard/Pictures/tem1.jpg");// 写出到文件
OpenCV.release(mat);// 释放
ellipse 画圆
画圆
参数
字段 | 类型 | 必须 | 说明 |
---|---|---|---|
mat | mat |
是 | mat对象 |
ax | int |
是 | 圆心,中心坐标x |
ay | int |
是 | 圆心,中心坐标y |
widthX | int |
是 | 圆横半径,与圆纵半径,画正圆时,两者值应相等 |
heightY | int |
(可选)默认=widthX | 圆横半径,与圆纵半径,画正圆时,两者值应相等 |
color_int_arr4 | int[] |
(可选)默认红色=[255,0,0,255] | 颜色,4成员数组,RGBA。 |
width | int |
(可选)默认=-1 | 线宽度。-1:填充整个圆;0:等同于 1(实际线宽为1);> 0:绘制轮廓线,线宽为指定的值(像素) |
type | int |
(可选)默认=8 | 填充类型。8:八邻域填充法;4:四邻域填充法;16:反锯齿填充法 |
shift | int |
(可选)默认=0 | 偏移 |
angle | int |
(可选)默认=0 | 圆整体旋转角度 |
sAngle | int |
(可选)默认=0 | 圆开始角度,用于控制绘制圆的某部分 |
eAngle | int |
(可选)默认=360 | 圆结束角度,用于控制绘制圆的某部分 |
返回值
boolean
调用示例
// 画各种圆
var mat = OpenCV.zeros(500, 500, 16);
OpenCV.ellipse(mat, 100, 100, 50, 50, [255, 0, 0, 0], 5);// 圆圈
OpenCV.ellipse(mat, 250, 100, 50, 50, [255, 255, 0, 0], -1);// 实心圆
OpenCV.ellipse(mat, 400, 100, 50, 100, [255, 0, 255, 0], -1, 8, 0, 0, 0, 360);// 椭圆
OpenCV.ellipse(mat, 100, 250, 50, 100, [255, 255, 255, 0], -1, 8, 0, 30, 0, 360);// 圆旋转
OpenCV.ellipse(mat, 250, 250, 50, 50, [0, 255, 0, 0], -1, 8, 0, 0, 0, 270);// 圆饼
OpenCV.toFile(mat, "/sdcard/Pictures/tem1.jpg");
OpenCV.release(mat);// 释放
rectangle 画矩形
画矩形
参数
字段 | 类型 | 必须 | 说明 |
---|---|---|---|
mat | mat |
是 | mat对象 |
sx | int |
是 | 左上角坐标x |
sy | int |
是 | 左上角坐标y |
ex | int |
是 | 右下角坐标x |
ex | int |
是 | 右下角坐标y |
color_int_arr4 | int[] |
(可选)默认红色=[255,0,0,255] | 颜色,4成员数组,RGBA。 |
width | int |
(可选)默认=-1 | 线宽度。-1:填充整个圆;0:等同于 1(实际线宽为1);> 0:绘制轮廓线,线宽为指定的值(像素) |
type | int |
(可选)默认=8 | 填充类型。8:八邻域填充法;4:四邻域填充法;16:反锯齿填充法 |
shift | int |
(可选)默认=0 | 偏移 |
返回值
boolean
调用示例
// 画矩形
var mat = OpenCV.zeros(500, 500, 16);
OpenCV.rectangle(mat, 100, 100, 200, 200, [255, 0, 0, 0], 5);// 画矩形
OpenCV.rectangle(mat, 250, 100, 350, 200, [255, 0, 0, 0], -1);// 画矩形边框
OpenCV.toFile(mat, "/sdcard/Pictures/tem1.jpg");
OpenCV.release(mat);// 释放
setColor 置点颜色
设置颜色。颜色格式RGBA。高效率的操作,请参考OpenCV中 mat.set()方法。
参数
字段 | 类型 | 必须 | 说明 |
---|---|---|---|
mat | mat |
是 | mat对象 |
x | int |
是 | 坐标x |
y | int |
是 | 坐标y |
color_int_arr4 | int[] |
(可选)默认红色=[255,0,0,255] | 颜色,4成员数组,RGBA。 |
返回值
boolean
调用示例
// 回忆下大彩电时代
var mat = OpenCV.zeros(300, 300, 16);
//定义颜色
var color_red = [255, 0, 0, 0];
var color_green = [0, 255, 0, 0];
var color_blue = [0, 0, 255, 0];
//画点
for (var y = 0; y < 300; y++) {
for (var x = 0; x < 300; x += 3) {
OpenCV.setColor(mat, x, y, color_red);
OpenCV.setColor(mat, x + 1, y, color_green);
OpenCV.setColor(mat, x + 2, y, color_blue);
}
}
//写到文件
OpenCV.toFile(mat, "/sdcard/Pictures/tem1.jpg");
//释放mat
OpenCV.release(mat);
getColor 取点颜色
取指定点颜色。返回RGBA格式。 高效率的操作,请参考OpenCV中 mat.get()方法。
参数
字段 | 类型 | 必须 | 说明 |
---|---|---|---|
mat | mat |
是 | mat对象 |
x | int |
是 | 坐标x |
y | int |
是 | 坐标y |
返回值
int[]
调用示例
var mat = OpenCV.zeros(100, 100, 16);
var RGBA_arr = OpenCV.getColor(mat, 0, 1);
console.log(RGBA_arr); // [0, 0, 0]
var mat1 = OpenCV.zeros(100, 100, 24);
var RGBA_arr1 = OpenCV.getColor(mat1, 0, 1);
console.log(RGBA_arr1); // [0, 0, 0, 0]
OpenCV.release(mat);
OpenCV.release(mat1);
位运算
not 取反
取反,翻转图像颜色。 常用于掩膜翻转
参数
字段 | 类型 | 必须 | 说明 |
---|---|---|---|
mat | mat |
是 | mat对象 |
返回值
mat | null
调用示例
// 黑白图取反,取反后白变黑,黑变白
var mat = OpenCV.zeros(50, 50, 16);
// 画线
OpenCV.line(mat, 0, 0, 50, 50, [255, 255, 255, 0], 10);
// 取反
var mat_not = OpenCV.not(mat);
OpenCV.toFile(mat, "/sdcard/Pictures/tem1.jpg");
OpenCV.toFile(mat_not, "/sdcard/Pictures/tem2.jpg");
OpenCV.release(mat);// 释放
OpenCV.release(mat_not);// 释放
// 彩色图取反,取反后底片效果
var mat = OpenCV.loadFromFile("/sdcard/Pictures/1.jpg");
//取反
var mat_not = OpenCV.not(mat);
OpenCV.toFile(mat, "/sdcard/Pictures/tem1.jpg");
OpenCV.toFile(mat_not, "/sdcard/Pictures/tem2.jpg");
OpenCV.release(mat);// 释放
OpenCV.release(mat_not);// 释放
and 位与
- 位与,可增强对比度,使得图像轮廓更清晰。可掩码处理图像、可过滤不需要的部分
- 位与真值表:
A | B | AB |
---|---|---|
1 | 1 | 1 |
1 | 0 | 0 |
0 | 1 | 0 |
0 | 0 | 0 |
参数
字段 | 类型 | 必须 | 说明 |
---|---|---|---|
mat1 | mat |
是 | 参与计算的mat对象 |
mat2 | mat |
是 | 参与计算的mat对象 |
返回值
mat | null
调用示例
// 通过AND运算分离RGB通道
// 需要自己调节颜色值(示例红通道)
var mat = OpenCV.loadFromFile("/sdcard/Pictures/1.jpg");
// 创建另一个运行对象
var mat_mask = OpenCV.zeros(OpenCV.getWidth(mat), OpenCV.getHeight(mat), OpenCV.getType(mat), [255, 0, 0, 255]);
// and计算
var mat_and = OpenCV.and(mat, mat_mask);
// 保存到文件
OpenCV.toFile(mat_and, "/sdcard/Pictures/tem1.jpg");
// 释放
OpenCV.release(mat);
OpenCV.release(mat_mask);
OpenCV.release(mat_and);
or 位或运算
- 位或,可增强图像亮度。可掩码处理图像(常用于掩模合并)。
- 位或真值表:
A | B | AB |
---|---|---|
1 | 1 | 1 |
1 | 0 | 1 |
0 | 1 | 1 |
0 | 0 | 0 |
参数
字段 | 类型 | 必须 | 说明 |
---|---|---|---|
mat1 | mat |
是 | 参与计算的mat对象 |
mat2 | mat |
是 | 参与计算的mat对象 |
返回值
mat | null
调用示例
// or增加图像亮度
var mat = OpenCV.loadFromFile("/sdcard/Pictures/1.jpg");
// 创建另一个运行对象
var mat_mask = OpenCV.zeros(OpenCV.getWidth(mat), OpenCV.getHeight(mat), OpenCV.getType(mat), [50, 50, 50, 0]);
// or计算
var mat_or = OpenCV.or(mat, mat_mask);
// 保存到文件
OpenCV.toFile(mat_or, "/sdcard/Pictures/tem1.jpg");
// 释放
OpenCV.release(mat);
OpenCV.release(mat_mask);
OpenCV.release(mat_or);
xor 异或运算
- 异位,图像计算和还原。去除图像中相同的部分。在找茬类游戏中,该函数可一步到位。
- 异或真值表:
A | B | AB |
---|---|---|
1 | 1 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
0 | 0 | 0 |
参数
字段 | 类型 | 必须 | 说明 |
---|---|---|---|
mat1 | mat |
是 | 参与计算的mat对象 |
mat2 | mat |
是 | 参与计算的mat对象 |
返回值
mat | null
调用示例
// 图像色彩加密和还原(该方法可对图像进行处理加密用)
var mat = OpenCV.loadFromFile("/sdcard/Pictures/1.jpg");
// 创建掩模,类型、大小与原图大小一样。并填充一些颜色
var mat_mask = OpenCV.zeros(mat.cols(), mat.rows(), mat.type());
OpenCV.rectangle(mat_mask, 0, 0, mat_mask.cols(), mat_mask.rows(), [255, 255, 0, 0], 1000);
OpenCV.toFile(mat_mask, "/sdcard/Pictures/tem1.jpg");
// 进行or位运算
var mat_xor = OpenCV.xor(mat, mat_mask);
OpenCV.toFile(mat_xor, "/sdcard/Pictures/tem2.jpg");
// mat xor mat_mask 的结果,再次 xor mat_mask
var mat_xor_2 = OpenCV.xor(mat_xor, mat_mask);
OpenCV.toFile(mat_xor_2, "/sdcard/Pictures/tem3.jpg");
OpenCV.release(mat);// 释放
OpenCV.release(mat_mask);// 释放
OpenCV.release(mat_xor);// 释放
OpenCV.release(mat_xor_2);// 释放
add 加运算
加运算。可增加图像亮度。
参数
字段 | 类型 | 必须 | 说明 |
---|---|---|---|
mat1 | mat |
是 | 参与计算的mat对象 |
mat2 | mat |
是 | 参与计算的mat对象 |
返回值
mat | null
调用示例
// add增加图像亮度
var mat = OpenCV.loadFromFile("/sdcard/Pictures/1.jpg");
// 创建掩模,类型、大小与原图大小一样。并填充一些颜色
var mat_mask = OpenCV.zeros(mat.cols(), mat.rows(), mat.type());
OpenCV.rectangle(mat_mask, 0, 0, mat_mask.cols(), mat_mask.rows(), [100, 100, 100, 0], 1000);
OpenCV.toFile(mat_mask, "/sdcard/Pictures/tem1.jpg");
// 进行add运算
var mat_result = OpenCV.add(mat, mat_mask);
OpenCV.toFile(mat_result, "/sdcard/Pictures/tem2.jpg");
OpenCV.release(mat);//释放
OpenCV.release(mat_mask);//释放
OpenCV.release(mat_result);//释放
sub 减运算
减运算。可降低图像亮度。可使用它做“帧差法”计算。
参数
字段 | 类型 | 必须 | 说明 |
---|---|---|---|
mat1 | mat |
是 | 参与计算的mat对象。 mat1-mat2 |
mat2 | mat |
是 | 参与计算的mat对象 |
返回值
mat | null
调用示例
// 帧差法,提取图片彩色边缘(由于保留了领域差,所以是无锯齿的)
var mat = OpenCV.loadFromFile("/sdcard/Pictures/1.jpg");
var w = OpenCV.getWidth(mat);
var h = OpenCV.getHeight(mat);
var type = OpenCV.getType(mat);
// 帧差法模拟X轴梯度
var mat_n = OpenCV.zeros(w, h, type, [0, 0, 0, 0]);//创建模板
// 留左边
OpenCV.bitBlt(
mat_n,
1, 0, -1, -1,
mat,
0, 0, w - 1, h,
1, 0
);
var mat_sub_x1 = OpenCV.sub(mat, mat_n);
OpenCV.toFile(mat_n, "/sdcard/Pictures/mat_n.png");
OpenCV.toFile(mat_sub_x1, "/sdcard/Pictures/mat_sub_x1.png");
// 留顶边
OpenCV.rectangle(mat_n, 0, 0, w, h, [0, 0, 0, 0, 0], -1);
OpenCV.bitBlt(
mat_n,
0, 1, -1, -1,
mat,
0, 0, w, h - 1,
1, 0
);
var mat_sub_y1 = OpenCV.sub(mat, mat_n);
OpenCV.toFile(mat_n, "/sdcard/Pictures/mat_n.png");
OpenCV.toFile(mat_sub_y1, "/sdcard/Pictures/mat_sub_y1.png");
// 留右边
OpenCV.rectangle(mat_n, 0, 0, w, h, [0, 0, 0, 0, 0], -1);
OpenCV.bitBlt(
mat_n,
0, 0, -1, -1,
mat,
1, 0, w - 1, h,
1, 0
);
var mat_sub_x2 = OpenCV.sub(mat, mat_n);
OpenCV.toFile(mat_n, "/sdcard/Pictures/mat_n.png");
OpenCV.toFile(mat_sub_x2, "/sdcard/Pictures/mat_sub_x2.png");
// 留底边
OpenCV.rectangle(mat_n, 0, 0, w, h, [0, 0, 0, 0, 0], -1);
OpenCV.bitBlt(
mat_n,
0, 0, -1, -1,
mat,
0, 1, w, h - 1,
1, 0
);
var mat_sub_y2 = OpenCV.sub(mat, mat_n);
OpenCV.toFile(mat_n, "/sdcard/Pictures/mat_n.png");
OpenCV.toFile(mat_sub_y2, "/sdcard/Pictures/mat_sub_y2.png");
// 合成编译
var mat_add = OpenCV.or(mat_sub_x1, mat_sub_x2);
mat_add = OpenCV.or(mat_add, mat_sub_y1);
mat_add = OpenCV.or(mat_add, mat_sub_y2);
OpenCV.toFile(mat_add, "/sdcard/Pictures/mat_add.png")
OpenCV.toFile(OpenCV.and(mat, mat_add), "/sdcard/Pictures/mat_xor.png")
// sub减少图像亮度
var mat = OpenCV.loadFromFile("/sdcard/Pictures/1.jpg");
// 创建掩模,类型、大小与动漫大小一样。并填充一些颜色
var mat_mask = OpenCV.zeros(mat.cols(), mat.rows(), mat.type());
OpenCV.rectangle(mat_mask, 0, 0, mat_mask.cols(), mat_mask.rows(), [100, 100, 100, 0], 1000);
OpenCV.toFile(mat_mask, "/sdcard/Pictures/tem1.jpg");
// 进行sub运算
var mat_result = OpenCV.sub(mat, mat_mask);
OpenCV.toFile(mat_result, "/sdcard/Pictures/tem2.jpg");
OpenCV.release(mat);// 释放
OpenCV.release(mat_mask);// 释放
OpenCV.release(mat_result);// 释放
mul 乘运算
乘运算。可增加图像对比度。
参数
字段 | 类型 | 必须 | 说明 |
---|---|---|---|
mat1 | mat |
是 | 参与计算的mat对象。 mat1-mat2 |
mat2 | mat |
是 | 参与计算的mat对象 |
返回值
mat | null
调用示例
// mul增加图像对比度
var mat = OpenCV.loadFromFile("/sdcard/Pictures/1.jpg");
//创建掩模,类型、大小与动漫大小一样。并填充一些颜色
var mat_mask = OpenCV.zeros(mat.cols(), mat.rows(), mat.type());
OpenCV.rectangle(mat_mask, 0, 0, mat_mask.cols(), mat_mask.rows(), [2, 2, 2, 0], 1000);
OpenCV.toFile(mat_mask, "/sdcard/Pictures/tem1.jpg");
//进行mul运算
var mat_result = OpenCV.mul(mat, mat_mask);
OpenCV.toFile(mat_result, "/sdcard/Pictures/tem2.jpg");
OpenCV.release(mat);//释放
OpenCV.release(mat_mask);//释放
OpenCV.release(mat_result);//释放
div 除运算
除运算。可降低图像对比度。
参数
字段 | 类型 | 必须 | 说明 |
---|---|---|---|
mat1 | mat |
是 | 参与计算的mat对象。 mat1-mat2 |
mat2 | mat |
是 | 参与计算的mat对象 |
返回值
mat | null
调用示例
// div降低图像对比度
var mat = OpenCV.loadFromFile("/sdcard/Pictures/1.jpg");
// 创建掩模,类型、大小与动漫大小一样。并填充一些颜色
var mat_mask = OpenCV.zeros(mat.cols(), mat.rows(), mat.type());
OpenCV.rectangle(mat_mask, 0, 0, mat_mask.cols(), mat_mask.rows(), [2, 2, 2, 0], 1000);
OpenCV.toFile(mat_mask, "/sdcard/Pictures/tem1.jpg");
// 进行div运算
var mat_result = OpenCV.div(mat, mat_mask);
OpenCV.toFile(mat_result, "/sdcard/Pictures/tem2.jpg");
OpenCV.release(mat);// 释放
OpenCV.release(mat_mask);// 释放
OpenCV.release(mat_result);// 释放