滑塊驗證位移識別


舉個栗子——> 

大致思路就是解析圖片每個像素點信息,然后通過相鄰像素色差比對,識別出滑塊左側這條邊的位置,然后就可以知道要移動滑塊的距離了。

1. 圖片解析

我用的是 get-pixels 這個包,也可以用原生;

let pixels = await new Promise(function(resolve, reject) {
            getPixels(url, function(err, pixel) {
                if(err) {
                    console.log("Bad image path");
                    reject(err)
                } else{
                    resolve(pixel)
                }
            })
        })

具體pixels內容如下

data 是所有像素信息,為了分析方便,格式整理,每個像素放一個數組,並且每行像素放一個數組,最后有點像矩陣

舉個栗子:

newPixelsArr = [
[ [147, 123, 121, 255],  [147, 123, 121, 255],  [147, 123, 121, 255] ] ,
[ [147, 123, 121, 255],  [147, 123, 121, 255],  [147, 123, 121, 255] ] , 
[ [147, 123, 121, 255],  [147, 123, 121, 255],  [147, 123, 121, 255] ] , 
[ [147, 123, 121, 255],  [147, 123, 121, 255],  [147, 123, 121, 255] ]
]

每個小數組就是一個像素(RGBA),把像素按圖片中的位置進行排序分組,如上例子就是一張寬3px,高4px的圖片。

然后就可以對比像素了。像素差是要自己調整的,看多少識別效果最好,我這邊是40;

現在來識別滑塊左側的這條邊,對,就是有個缺口的。

那么識別條件就是:每列的像素和它相鄰左側的那列做對比,如果有連續 X 個像素和左側的像素差大於40,接着相隔Y 這像素后,有連續 Z 個像素和左側的像素差大於40;那么就判斷這列為滑塊的左側邊,即滑塊滑動的距離。

X,Z 我取范圍10-14

循環部分代碼:

const pixelDifference = 40;

// 我是從圖片右至左匹配的
data1 = newPixelsArr[s].pop(); data2 = newPixelsArr[s][newPixelsArr[s].length-1]; const res1=Math.abs(data1[0]-data2[0]); const res2=Math.abs(data1[1]-data2[1]); const res3=Math.abs(data1[2]-data2[2]);
// 判斷色差
if(!(res1 < pixelDifference && res2 < pixelDifference && res3 < pixelDifference)) { } else if(continuous === true) { }

這里只判斷了一條邊,可以定位四側來提高准確率。

然后就是滑動滑塊,平均速度的滑動方式很容易被識別機器人。

效果圖


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM