图像识别与OCR
使用示例
截图
使用全局方法 captureGameRegion()
就可以获取 ImageRegion
图像。
再通过 ImageRegion
内自带的 find
、findMulti
找图、OCR等操作
captureGameRegion()
- 返回类型:
ImageRegion
- 描述: 捕获游戏区域的图像
模板匹配
举例,模板匹配:
// 定义识别对象
const paimonMenuRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/paimon_menu.png"), 0, 0, genshin.width / 3.0, genshin.width / 5.0);
/**
* 返回主界面,这里只做demo演示
* 实际场景下,推荐使用已经包装好了的 `genshin.returnMainUi()`
* @returns {Promise<void>}
*/
const returnMain = async () => {
for (let i = 0; i < 5; i++) {
// 最多 ESC 5次
let captureRegion = captureGameRegion(); // 获取一张截图
let res = captureRegion.Find(paimonMenuRo);
if (res.isEmpty()) {
keyPress("ESCAPE");
} else {
log.info("已到达主界面,主菜单位置({x},{y},{h},{w})", res.x, res.y, res.width, res.Height);
break;
}
await sleep(500);
}
}
举例,模板匹配并点击,区域和鼠标联动方法见下面文档:
// 打开背包
keyPress("B");
await sleep(1000);
click(867,56);
await sleep(1000);
// 吃个日落果
let apple = captureGameRegion().find(appleRo);
if (apple.isExist()) {
apple.click();
await sleep(500);
let confirm = captureGameRegion().find(confirmRo);
if (confirm.isExist()) {
confirm.click();
}
}
OCR
举例:
// 获取一张截图
let captureRegion = captureGameRegion();
// 对整个区域进行 OCR
let resList = captureRegion.findMulti(RecognitionObject.ocrThis);
log.info("OCR 全区域识别结果数量 {len}", resList.count);
for (let i = 0; i < resList.count; i++) { // 遍历的是 C# 的 List 对象,所以要用 count,而不是 length
let res = resList[i];
log.info("OCR结果:位置({x},{y},{h},{w}), 文本{text}", res.x, res.y, res.width, res.Height, res.text);
}
对象方法文档
所有属性和方法,在 js 内都可以通过小写开头的驼峰使用,更加符合js的代码规范。
Region 类
区域基类,用于描述一个区域,可以是一个矩形,也可以是一个点。
属性
X
- 类型:
int
- 描述: 区域的 X 坐标
Y
- 类型:
int
- 描述: 区域的 Y 坐标
Width
- 类型:
int
- 描述: 区域的宽度
Height
- 类型:
int
- 描述: 区域的高度
Top
- 类型:
int
- 描述: 区域顶部位置,等同于 Y 坐标
Bottom
- 类型:
int
- 描述: 区域底部位置,等于 Y + Height
Left
- 类型:
int
- 描述: 区域左侧位置,等同于 X 坐标
Right
- 类型:
int
- 描述: 区域右侧位置,等于 X + Width
Text
- 类型:
string
- 描述: 存放 OCR 识别的结果文本
构造函数
Region()
- 描述: 创建一个空的区域对象
Region(int x, int y, int width, int height, Region? owner, INodeConverter? converter, DrawContent? drawContent)
- 描述: 创建一个具有指定位置和大小的区域对象
- 参数:
x
(int
): X 坐标y
(int
): Y 坐标width
(int
): 宽度height
(int
): 高度owner
(Region?
): 所属区域converter
(INodeConverter?
): 坐标转换器drawContent
(DrawContent?
): 绘制内容
方法
BackgroundClick()
- 描述: 鼠标后台点击当前区域的中心位置
Click()
- 描述: 鼠标点击当前区域的中心位置
ClickTo(int x, int y)
- 描述: 鼠标点击区域内指定位置
- 参数:
x
(int
): X 坐标y
(int
): Y 坐标
Move()
- 描述: 鼠标移动到当前区域的中心位置
MoveTo(int x, int y)
- 描述: 鼠标移动到区域内指定位置
- 参数:
x
(int
): X 坐标y
(int
): Y 坐标
DrawSelf(string name, Pen? pen)
- 描述: 绘制自身区域到遮罩窗口上
- 参数:
name
(string
): 绘制名称pen
(Pen?
): 绘制笔刷
Derive(int x, int y)
- 描述: 派生一个点类型的新区域
- 参数:
x
(int
): X 坐标y
(int
): Y 坐标
- 返回: 新的
Region
对象
IsEmpty()
- 描述: 检查区域是否为空
- 返回:
bool
类型,表示区域是否为空
ImageRegion 类
继承自 Region
类,提供图像处理功能。
属性
SrcBitmap
- 类型:
Bitmap
- 描述: 获取源位图图像。如果需要会从
Mat
转换。
SrcMat
- 类型:
Mat
- 描述: 获取源 OpenCV Mat 矩阵。如果需要会从
Bitmap
转换。
SrcGreyMat
- 类型:
Mat
- 描述: 获取源图像的灰度版本 Mat 矩阵。
构造函数
ImageRegion(Mat mat, int x, int y, Region? owner, INodeConverter? converter, DrawContent? drawContent)
- 描述: 使用 Mat 矩阵创建新的图像区域
- 参数:
mat
(Mat
): OpenCV Mat 矩阵x
(int
): X 坐标y
(int
): Y 坐标owner
(Region?
): 所属区域converter
(INodeConverter?
): 节点转换器drawContent
(DrawContent?
): 绘制内容
方法
DeriveCrop(int x, int y, int w, int h)
- 描述: 创建当前区域的剪裁派生
- 参数:
x
(int
): X 坐标y
(int
): Y 坐标w
(int
): 宽度h
(int
): 高度
- 返回: 包含剪裁区域的新
ImageRegion
DeriveCrop(double dx, double dy, double dw, double dh)
- 描述: 使用双精度坐标创建剪裁派生
- 参数:
dx
(double
): X 坐标dy
(double
): Y 坐标dw
(double
): 宽度dh
(double
): 高度
- 返回: 包含剪裁区域的新
ImageRegion
Find(RecognitionObject ro)
- 描述: 在区域内查找识别对象
- 参数:
ro
(RecognitionObject
): 识别对象参数(OCR、模板匹配等),具体看下方对应对象文档
- 返回: 表示找到区域的
Region
- 支持:
- 模板匹配
RecognitionTypes.TemplateMatch
- OCR 匹配
RecognitionTypes.OcrMatch
(不推荐使用此功能) - OCR 识别
RecognitionTypes.Ocr
- 颜色范围和 OCR
RecognitionTypes.ColorMatch
- 模板匹配
FindMulti(RecognitionObject ro)
- 描述: 查找多个识别对象实例
- 参数:
ro
(RecognitionObject
): 识别对象参数(OCR、模板匹配等),具体看下方对应对象文档
- 返回: 找到的
Region
列表 - 支持:
- 模板匹配(多个返回)
RecognitionTypes.TemplateMatch
- OCR 识别(多个返回)
RecognitionTypes.Ocr
- 模板匹配(多个返回)
RecognitionObject 类
用于描述识别对象的类,支持模板匹配、颜色匹配和 OCR 文字识别等功能。
通用属性
RecognitionType
- 类型:
RecognitionTypes
- 描述: 识别类型,包括:
TemplateMatch
: 模板匹配ColorMatch
: 颜色匹配OcrMatch
: 文字识别并匹配Ocr
: 仅文字识别
RegionOfInterest
- 类型:
Rect
- 描述: 感兴趣的区域
Name
- 类型:
string?
- 描述: 识别对象名称,可以为空
模板匹配相关属性
TemplateImageMat
- 类型:
Mat?
- 描述: 模板匹配的对象(彩色)
TemplateImageGreyMat
- 类型:
Mat?
- 描述: 模板匹配的对象(灰色)
Threshold
- 类型:
double
- 描述: 模板匹配阈值,默认 0.8
Use3Channels
- 类型:
bool
- 描述: 是否使用 3 通道匹配,默认 false
TemplateMatchMode
- 类型:
TemplateMatchModes
- 描述: 模板匹配算法,默认 CCoeffNormed
颜色匹配相关属性
ColorConversionCode
- 类型:
ColorConversionCodes
- 描述: 颜色匹配方式,默认为 BGR2RGB
LowerColor
- 类型:
Scalar
- 描述: 颜色范围下限
UpperColor
- 类型:
Scalar
- 描述: 颜色范围上限
OCR 相关属性
OcrEngine
- 类型:
OcrEngineTypes
- 描述: OCR 引擎类型,目前仅支持 Paddle
AllContainMatchText
- 类型:
List<string>
- 描述: 必须全部包含的匹配文本列表
OneContainMatchText
- 类型:
List<string>
- 描述: 包含其中之一的匹配文本列表
RegexMatchText
- 类型:
List<string>
- 描述: 正则表达式匹配文本列表
方法
InitTemplate()
- 描述: 初始化模板匹配所需的灰度图和遮罩
- 返回:
RecognitionObject
当前对象
TemplateMatch(Mat mat)
- 描述: 创建模板匹配识别对象(推荐使用)
- 参数:
mat
(Mat
): 模板图像
- 返回: 新的板匹配
RecognitionObject
对象
TemplateMatch(Mat mat, double x, double y, double w, double h)
- 描述: 创建带区域的模板匹配识别对象(推荐使用)
- 参数:
mat
(Mat
): 模板图像x
(double
): X 坐标y
(double
): Y 坐标w
(double
): 宽度h
(double
): 高度
- 返回: 新的带区域的模板匹配
RecognitionObject
对象
Ocr(double x, double y, double w, double h)
- 描述: 创建 OCR 识别对象(推荐使用)
- 参数:
x
(double
): X 坐标y
(double
): Y 坐标w
(double
): 宽度h
(double
): 高度
- 返回: 新的OCR区域的
RecognitionObject
对象