前言

     我们在以往的UI自动化测试中,可以通过获取页面元素进行封装组合成一系列模拟真人的操作,来完成UI方面的自动化测试,但是在地图业务测试中,这种方式是无法完成的,地图是无法通过普通元素定位手段是无法获取元素的,比如完成对比新老版本路径规划的准确性、与竞品比较路线的成熟度,但通过图像识别也是一个不错的思路,今天我们介绍一下利用图像识别的方式,在地图测试做一些应用。下面我们介绍今天的主角——OpenCV

opencv 检测内部污点 opencv测试_opencv 图像识别

OpenCV(Open Source Computer Vision Library)是一个使用 C/C++ 开发的开源的跨平台的计算机视觉库,它提供了很多函数,这些函数非常高效地实现了计算机视觉算法,同时也提供了 Python、Java、MATLAB 等其他语言的接口。OpenCV 的应用领域非常广泛,包括图像拼接、图像降噪、产品质检、人机交互、人脸识别、动作识别、动作跟踪、无人驾驶等。OpenCV 还提供了机器学习模块,你可以使用正态贝叶斯、K最近邻、支持向量机、决策树、随机森林、人工神经网络等机器学习算法。

opencv 检测内部污点 opencv测试_opencv 图像识别_02

一、安装和工程搭建不多介绍,注意安装以下模块和工具

GTK+ 2.x 或者更高的版本;

GCC 编译器;

cmake 构建工具;

libtbb(英特尔线程构建模块)

Python3

二、图像写入和读取

图像处理依赖于得到一幅图像、视频,并通过应用信号处理技术的“播放”来得到预期的结果,我们写入两张路线规划图片。

OpenCV 支持的主要图像格式有:

Windowsbitmaps(*.bmp、*dib);

Portableimage formats(*.pbm、*.pgm、*.ppm);

Sunrasters(*.sr、*.ras);

需要辅助库的格式有:

JPEG(*.jpeg、*.jpg、*.jpe);

JPEG 2000(*.jp2);

Portable Network Graphics(*.png);

TIFF(*.tiff、*.tif);

WebP(*.webp);

三、相似度对比方法

OpenCV相似度对比有几种方法:

1.直方图对比法

2. 图像模板匹配

3. PSNR峰值信噪比

4.SSIM(structural similarity)结构相似性

5、感知哈希算法

四、实现步骤:

         1)两个版本的地图做起止点路线规划,截图保存,从本地读取两张图像

bool compareLineByHist(Mat img,Mat orgImg){ Mat tmpImg; resize(img, tmpImg, Size(orgImg.cols, orgImg.rows)); imshow("Img1", img); imshow("tmpImg", tmpImg); imshow("orgImg", orgImg);

         2)将两张图像进行H色调、S饱和度、V亮度格式转换

cvtColor(tmpImg, tmpImg, COLOR_BGR2HSV); cvtColor(orgImg, orgImg, COLOR_BGR2HSV);

         3)构建图像的直方图模型,并进行直方图归一化

int hBins = 256, sBins = 256; int histSize[] = { hBins,sBins };

float hRanges[] = { 0,180 };

         4)比较两张图片的直方图模型,计算图片的直方图相似度

float hRanges[] = { 0,180 };

float sRanges[] = { 0,255 };

const float* ranges[] = { hRanges,sRanges };

int channels[] = { 0,1 };//二维直方图

MatND hist1, hist2;

calcHist(&tmpImg, 1, channels, Mat(), hist1,2,histSize, ranges, true, false); normalize(hist1, hist1, 0, 1, NORM_MINMAX, -1, Mat()); calcHist(&orgImg, 1, channels, Mat(), hist2, 2, histSize, ranges, true, false); normalize(hist2, hist2, 0, 1, NORM_MINMAX, -1, Mat()); double similarityValue = compareHist(hist1, hist2, CV_COMP_CORREL); cout << "相似度:" << similarityValue << endl; if (similarityValue >= 0.85)  0.85为阈值

opencv 检测内部污点 opencv测试_c++ opencv mat_03