计算机视觉

Macaca 提供计算机视觉解决方案,用来处理 View 体系之外的问题。如识别测试过程中的截图、测试游戏类产品等,本文档会介绍 OpenCV, Sikuli 和其它被广泛使用的库是如何与 Macaca 结合使用的。另外也会介绍 NodeCV 服务部署,然后便可随时随地使用此图形服务。

OpenCV

安装

MacOS 可使用 brew 来安装:

  1. $ brew install opencv

请使用稳定的v2(2.4.13.2)版本,源码包下载地址,windows 平台的安装请参考 OpenCV 官网

如果不想本机安装使用的请直接使用后面提到的 NodeCV 服务,避免环境的诸多问题。

各语言使用方法

Node.js:

只需要引入 nodecv 模块即可完成图像相似度,特征匹配,特征识别等功能,如下示例。

  1. const nodecv = require('nodecv');
  2. nodecv.imread(image1Path, (err, image1) => {
  3. if (err) {
  4. throw err;
  5. }
  6. nodecv.imread(image2Path, (err, image2) => {
  7. if (err) {
  8. throw err;
  9. }
  10. nodecv.imageDissimilarity(image1, image2, (err, dissimilarity) => {
  11. if (err) {
  12. throw err;
  13. }
  14. console.log(`Dissimilarity: ${dissimilarity}`);
  15. });
  16. });
  17. });

匹配方式枚举:

  1. CV_TM_SQDIFF =0 平方差匹配法
  2. CV_TM_SQDIFF_NORMED =1 归一化平方差匹配法
  3. CV_TM_CCORR =2 相关匹配法
  4. CV_TM_CCORR_NORMED =3 归一化相关匹配法
  5. CV_TM_CCOEFF =4 相关系数匹配法
  6. CV_TM_CCOEFF_NORMED =5 归一化相关系数匹配法

更多 Node.js 示例请访问 macaca-sample/cv-sample-node

Python:

  1. import cv2
  2. import numpy as np
  3. class opencvSample:
  4. def __init__(self, sourceimage):
  5. self.sourceimage = sourceimage
  6. def match(self, templateimage, threshold=0.8):
  7. image = cv2.imread(self.sourceimage)
  8. template = cv2.imread(templateimage)
  9. result = cv2.matchTemplate(image, template, cv2.TM_CCOEFF_NORMED)
  10. similarity = cv2.minMaxLoc(result)[1]
  11. if similarity < threshold:
  12. return similarity
  13. else:
  14. 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 环境便可一键部署。

  1. $ git clone https://github.com/macacajs/nodecv-server.git --depth=1
  2. $ cd nodecv-server
  3. $ docker build . -t="node-server"

然后便可在任意服务器环境,甚至树莓派启动 OpenCV 的 HTTP 服务,macaca-sample 也提供各语言针对服务端通信的示例。

服务启动成功后可访问 demo 页面: http://localhost:9900/opencv/demo

计算机视觉 - 图1

API

  1. POST /opencv/dissimilarity
  1. POST /opencv/matchtemplate
  1. POST /opencv/cascadedetect

请求 HTTP 服务示例:

  1. request.post({
  2. url: `${remoteHost}/opencv/dissimilarity`,
  3. formData: formData
  4. }, function(err, httpResponse, body) {
  5. if (err) {
  6. return console.error('upload failed:', err);
  7. }
  8. console.log('Server responded with:', body);
  9. try {
  10. const data = JSON.parse(body);
  11. console.log(`Dissimilarity is: ${data.dissimilarity}`);
  12. } catch (e) {
  13. }
  14. });

更多请见 nodecv-server

其它方案

Sikuli

Sikuli 是一种图形脚本语言,与 Macaca 配合使用可适应特定的测试场景,更多请见官网sikuli

Tesseract

tesseract 在文字识别等方面非常专业,可与 OpenCV 配合使用。

Image Diff

基于像素点对比的图像 Diff,可以使用:

计算机视觉 - 图2

游戏框架 Hilo 也是基于像素点对比的,与 Macaca 结合使用示例见 hiloteam/Hilo 官网

原文: https://macacajs.github.io/zh/computer-vision