 | |  |  | 这段代码是使用OpenCV库进行图像匹配的JavaScript代码示例。它的主要功能是在一个较大的图像中查找一个小图像的位置。以下是代码的详细说明:
- importClass(org.opencv.imgproc.Imgproc):导入图像处理类Imgproc,该类包含了图像模板匹配的方法。
- importClass(org.opencv.imgcodecs.Imgcodecs):导入图像编码解码类Imgcodecs,该类用于读取和写入图像文件,以及将字节数组转换为Mat对象。
- importPackage(org.opencv.core):导入OpenCV的核心包,包含了图像表示类Mat,以及其他诸如矩形Rect、尺寸Size等类。
- base64ToMat(base64):这个函数接收一个Base64编码的字符串作为参数,将其解码为字节数组,然后使用Imgcodecs.imdecode方法将字节数组转换为Mat对象,并返回这个Mat对象。
- android.util.Base64.decode(base64, android.util.Base64.DEFAULT):解码Base64编码的图像字符串。
- Imgcodecs.imdecode(new MatOfByte(decodedBytes), Imgcodecs.IMREAD_COLOR):将解码得到的字节数组转换为Mat对象,其中IMREAD_COLOR表示以彩色模式读取图像。
- small 和 big:这两个变量分别存储了小图像和大图像的Base64编码字符串。你需要将实际的Base64编码字符串替换此处的占位符文本。
- sourceMat 和 templateMat:通过base64ToMat函数将小图像和大图像的Base64编码字符串转换为Mat对象,分别存储在这两个变量中。
- for (var i = 0; i < 200; i++) {...}:循环200次进行图像匹配操作。
- Imgproc.matchTemplate(sourceMat, templateMat, result, Imgproc.TM_CCOEFF_NORMED):在大图像(sourceMat)中查找小图像(templateMat),并将匹配结果存储在result Mat对象中。TM_CCOEFF_NORMED是一种匹配方法。
- Core.minMaxLoc(result):计算匹配结果矩阵中最小值和最大值的位置和值。
- if (mmr.maxVal > 0.9) {...}:如果匹配的最大值大于0.9(即匹配度超过90%),则认为找到了匹配的小图像。
- var rect = new Rect(mmr.maxLoc, new Size(templateMat.cols(), templateMat.rows())):根据匹配结果的最大值位置创建一个矩形对象,该矩形的大小与小图像相同。
- printl("匹配结果",i, "找到模板在位置: " + rect):打印匹配结果,包括匹配次数和找到的小图像的位置。
- result.release():每次循环后释放结果Mat对象占用的内存。
- printl(i, '耗时', (new Date().getTime() - t)):循环结束后打印总的匹配次数和整个过程耗时。
- sourceMat.release();templateMat.release();:最后释放大图像和小图像的Mat对象占用的内存。
这段代码适用于在安卓平台上使用JavaScript调用OpenCV库进行图像匹配,例如在自动化测试 脚本中查找某个按钮或图标在屏幕上的位置。注意,实际运行时需要确保OpenCV已正确集成到你的项目中。
- importClass(org.opencv.imgproc.Imgproc)
- importClass(org.opencv.imgcodecs.Imgcodecs);
- importPackage(org.opencv.core);
- function base64ToMat(base64) {
- // 解码Base64字符串为字节数组
- var decodedBytes = android.util.Base64.decode(base64, android.util.Base64.DEFAULT);
- // 使用Imgcodecs将字节数组转换为Mat对象
- var mat = Imgcodecs.imdecode(new MatOfByte(decodedBytes), Imgcodecs.IMREAD_COLOR);
- return mat;
- }
- var small = "这里是你的小图像Base64编码字符串";
- var big = "这里是你的大图像Base64编码字符串";
- var sourceMat = base64ToMat(small)
- var templateMat = base64ToMat(big)
- // var sourceMat = screen.screenShot(432, 768, 100).getMat()
- // var sourceMat = Imgcodecs.imread('/sdcard/Pictures/2.jpg');
- // var templateMat = Imgcodecs.imread('/sdcard/Pictures/1.jpg');
- var t = new Date().getTime()
- for (var i = 0; i < 200; i++) {
- var result = new org.opencv.core.Mat();
- Imgproc.matchTemplate(sourceMat, templateMat, result, Imgproc.TM_CCOEFF_NORMED);
- var mmr = Core.minMaxLoc(result);
- if (mmr.maxVal > 0.9) {
- var rect = new Rect(mmr.maxLoc, new Size(templateMat.cols(), templateMat.rows()));
- printl("匹配结果",i, "找到模板在位置: " + rect);
- }
- result.release();
- }
- printl(i, '耗时', (new Date().getTime() - t))
- sourceMat.release();
- templateMat.release();
复制代码
| |  | |  |
|