# 计算机视觉
Macaca 提供计算机视觉解决方案,用来处理 View 体系之外的问题。如识别测试过程中的截图、测试游戏类产品等,本文档会介绍 OpenCV, Sikuli 和其它被广泛使用的库是如何与 Macaca 结合使用的。另外也会介绍 NodeCV 服务部署,然后便可随时随地使用此图形服务。
# OpenCV
# 安装
MacOS 可使用 brew 来安装:
$ brew install opencv
请使用稳定的v2(2.4.13.2)版本,源码包下载地址,windows 平台的安装请参考 OpenCV 官网。
如果不想本机安装使用的请直接使用后面提到的 NodeCV 服务,避免环境的诸多问题。
# 各语言使用方法
# Node.js:
只需要引入 nodecv (opens new window) 模块即可完成图像相似度,特征匹配,特征识别等功能,如下示例。
const nodecv = require('nodecv');
nodecv.imread(image1Path, (err, image1) => {
if (err) {
throw err;
}
nodecv.imread(image2Path, (err, image2) => {
if (err) {
throw err;
}
nodecv.imageDissimilarity(image1, image2, (err, dissimilarity) => {
if (err) {
throw err;
}
console.log(`Dissimilarity: ${dissimilarity}`);
});
});
});
匹配方式枚举:
CV_TM_SQDIFF =0 平方差匹配法
CV_TM_SQDIFF_NORMED =1 归一化平方差匹配法
CV_TM_CCORR =2 相关匹配法
CV_TM_CCORR_NORMED =3 归一化相关匹配法
CV_TM_CCOEFF =4 相关系数匹配法
CV_TM_CCOEFF_NORMED =5 归一化相关系数匹配法
更多 Node.js 示例请访问 macaca-sample/cv-sample-node。
# Python:
import cv2
import numpy as np
class opencvSample:
def __init__(self, sourceimage):
self.sourceimage = sourceimage
def match(self, templateimage, threshold=0.8):
image = cv2.imread(self.sourceimage)
template = cv2.imread(templateimage)
result = cv2.matchTemplate(image, template, cv2.TM_CCOEFF_NORMED)
similarity = cv2.minMaxLoc(result)[1]
if similarity < threshold:
return similarity
else:
return np.unravel_index(result.argmax(), result.shape)
更多 Python 示例请访问 macaca-sample/cv-sample-python。
# Java:
Java 端请直接使用 JavaCV,更多 Java 示例请访问 macaca-sample/cv-sample-java。
# 部署 NodeCV 服务
Macaca 提供便捷的 Opencv 服务部署,只需要 Docker 环境便可一键部署。
$ git clone https://github.com/macacajs/nodecv-server.git --depth=1
$ cd nodecv-server
$ docker build . -t="node-server"
然后便可在任意服务器环境,甚至树莓派启动 OpenCV 的 HTTP
服务,macaca-sample 也提供各语言针对服务端通信的示例。
服务启动成功后可访问 demo 页面: http://localhost:9900/opencv/demo
# API
POST /opencv/dissimilarity
POST /opencv/matchtemplate
POST /opencv/cascadedetect
请求 HTTP 服务示例:
request.post({
url: `${remoteHost}/opencv/dissimilarity`,
formData: formData
}, function(err, httpResponse, body) {
if (err) {
return console.error('upload failed:', err);
}
console.log('Server responded with:', body);
try {
const data = JSON.parse(body);
console.log(`Dissimilarity is: ${data.dissimilarity}`);
} catch (e) {
}
});
更多请见 nodecv-server。
# 其它方案
# Sikuli
Sikuli 是一种图形脚本语言,与 Macaca 配合使用可适应特定的测试场景,更多请见官网sikuli。
# Tesseract
tesseract 在文字识别等方面非常专业,可与 OpenCV 配合使用。
# Image Diff
基于像素点对比的图像 Diff,可以使用:
与 Macaca 结合使用的示例地址:macaca-sample/react-native-sample,效果如下:
游戏框架 Hilo 也是基于像素点对比的,与 Macaca 结合使用示例见 hiloteam/Hilo 官网。