Auto.pro 找圖適配分辨率(循環(huán)找圖優(yōu)化版)

上個版本的適配雖然可以解決問題脐雪,但是細節(jié)操作過多付翁,大量scale操作也會在循環(huán)時增加耗時,這里給出另一種解決方案贮缅。

上版本的思路是榨咐,分辨率大于設(shè)定值1280x720時,將截圖縮星垂块茁;分辨率小于設(shè)定值時,將待查圖片縮小数焊;最后再將匹配坐標縮放成屏幕分辨率尺寸永淌,思路比較繞。

這個版本的思路為佩耳,在循環(huán)找圖前將待查圖片縮放仰禀,截圖不做改變。即1280x720下整理出的圖片蚕愤,在1920x1080設(shè)備上放大成1080/720倍答恶,在小于1280x720設(shè)備上則縮小。

這樣匹配得到的坐標直接就是設(shè)備分辨率下的萍诱,不需要再做一次坐標適配悬嗓。壞處是放大待查圖片導致了無中生有,匹配度會有略微下降裕坊,而且因為沒有做設(shè)備的截圖縮放包竹,在高分辨率下匹配圖片會更耗時,因此務(wù)必做好region緩存籍凝。

這個版本的細節(jié)不多周瞎,根據(jù)思路應(yīng)該很容易實現(xiàn)。不過還是放上我的代碼饵蒂,基于RxJS實現(xiàn)声诸,忽略了width、scale等參數(shù)的設(shè)置過程退盯。

// 緩存region
const cache = {}

// 獲取截圖彼乌,多個找圖函數(shù)共享該cap$數(shù)據(jù)
const cap$ = interval(100).pipe(
    exhaustMap(_ => {
        sleep(30)
        let t1 = new Date().getTime()
        let cap = action.cap()
        let t2 = new Date().getTime()
        log('cap cost', t2 - t1)
        return of(cap)
        // return of(images.captureScreen())
    }),
    share()
)

/**
 * 循環(huán)找圖,找到后返回坐標
 */
function findImg (param={
    path: '',
    option: {},
    useCache: false,
    forEver: false,
    eachTime: 100,
    nextTime: null
}) {
    // 待查圖片路徑
    let path = param.path || ''
    // 查詢參數(shù)
    let option = param.option || {}
    // 設(shè)置是否使用緩存
    const useCache = param.useCache || false
    const cachePath = param.path + useCache
    // 查1次或一直重復(fù)查詢
    const takeNum = param.forEver ? 99999 : 1
    // 每次查詢間隔
    const eachTime = param.eachTime || 100
    // 查到一次后渊迁,離下次查詢的間隔
    const nextTime = param.nextTime
    // 待查圖片
    let template = images.read(path)
    if (!template) {
        return throwError('template path is null')
    }

    template = images.scale(template, r.scale, r.scale)

    let queryOption = {...option}
    queryOption.threshold = queryOption.threshold || 0.8

    // 如果確認使用緩存慰照,且緩存里已經(jīng)設(shè)置有region的話,直接賦值
    if (useCache && cache[cachePath]) {
        queryOption.region = cache[cachePath]
    } else if (queryOption.region) {
        let region = queryOption.region
        if (region[0] < 0) {
            region[0] = 0
        }
        if (region[1] < 0) {
            region[1] = 0
        }
        if (region.length == 4) {
            let x = region[0] + region[2]
            let y = region[1] + region[3]
            if (x > width) {
                region[2] = width - region[0]
            }
            if (y > height) {
                region[3] = height - region[1]
            }
        }
        queryOption.region = region
    }

    let pass$ = new BehaviorSubject(true).pipe(
        switchMap(v => {
            if (v) {
                return of(v)
            } else {
                return timer(nextTime || 500).pipe(
                    mapTo(true),
                    startWith(false)
                )
            }
        })
    )

    return cap$.pipe(
        throttleTime(eachTime),
        withLatestFrom(pass$),
        filter(([img, pass]) => pass),
        exhaustMap(([img, pass]) => {
            return of(images.matchTemplate(img, template, queryOption).matches)
        }),
        filter(v => v && v.length > 0),
        take(takeNum),
        map(res => {
            return res.map(p => {
                    return [
                        parseInt(p.point['x']),
                        parseInt(p.point['y'])
                    ]
                }).sort((a, b) => {
                    let absY = Math.abs(a[1] - b[1])
                    let absX = Math.abs(a[0] - b[0])
                    if (absY > 4 && a[1] > b[1]) {
                        return true
                    }
                    else if (absY < 4) {
                        return absX > 4 && a[0] > b[0]
                    } else {
                        return false
                    }
                })
        }),
        tap(res => {
            // 如果設(shè)置了使用緩存琉朽,但緩存內(nèi)還不含有該路徑
            if (useCache && !cache[cachePath]) {
                let scaleWidth = r.width
                let scaleHeight = r.height

                let x = Math.max(0, res[0][0] - 10)
                let y = Math.max(0, res[0][1] - 10)
                let w = template.width + 20
                let h = template.height + 20
                w = x + w >= scaleWidth ? scaleWidth - x : w
                h = y + h >= scaleHeight ? scaleHeight - y : h

                cache[cachePath] = [x, y, w, h]
                queryOption.region = cache[cachePath]
            }
            // 如果設(shè)置了下次間隔
            if (nextTime) {
                pass$.next(false)
            }
        }),
        finalize(() => {
            // 循環(huán)找圖結(jié)束后毒租,釋放待查圖片資源
            template.recycle()
            pass$.complete()
        })
    )
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市箱叁,隨后出現(xiàn)的幾起案子墅垮,更是在濱河造成了極大的恐慌,老刑警劉巖蝌蹂,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件噩斟,死亡現(xiàn)場離奇詭異曹锨,居然都是意外死亡孤个,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門沛简,熙熙樓的掌柜王于貴愁眉苦臉地迎上來齐鲤,“玉大人斥废,你說我怎么就攤上這事「迹” “怎么了牡肉?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長淆九。 經(jīng)常有香客問我统锤,道長,這世上最難降的妖魔是什么炭庙? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任饲窿,我火速辦了婚禮,結(jié)果婚禮上焕蹄,老公的妹妹穿的比我還像新娘逾雄。我一直安慰自己,他們只是感情好腻脏,可當我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布鸦泳。 她就那樣靜靜地躺著,像睡著了一般永品。 火紅的嫁衣襯著肌膚如雪做鹰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天鼎姐,我揣著相機與錄音誊垢,去河邊找鬼。 笑死症见,一個胖子當著我的面吹牛喂走,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播谋作,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼芋肠,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了遵蚜?” 一聲冷哼從身側(cè)響起帖池,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎吭净,沒想到半個月后睡汹,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡寂殉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年囚巴,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡彤叉,死狀恐怖庶柿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情秽浇,我是刑警寧澤浮庐,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站柬焕,受9級特大地震影響审残,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜斑举,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一维苔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧懂昂,春花似錦介时、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至铲敛,卻和暖如春褐澎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背伐蒋。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工工三, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人先鱼。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓俭正,卻偏偏與公主長得像,于是被迫代替她去往敵國和親焙畔。 傳聞我的和親對象是個殘疾皇子掸读,可洞房花燭夜當晚...
    茶點故事閱讀 44,779評論 2 354