{"id":21311453,"url":"https://github.com/electricbubble/gwda-ext-opencv","last_synced_at":"2025-07-06T23:01:51.216Z","repository":{"id":114511767,"uuid":"266003761","full_name":"electricbubble/gwda-ext-opencv","owner":"electricbubble","description":"gwda 的图片匹配扩展库","archived":false,"fork":false,"pushed_at":"2021-05-18T15:51:17.000Z","size":42,"stargazers_count":15,"open_issues_count":0,"forks_count":5,"subscribers_count":3,"default_branch":"master","last_synced_at":"2024-11-02T09:08:45.946Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/electricbubble.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-05-22T02:53:06.000Z","updated_at":"2024-03-05T11:18:11.000Z","dependencies_parsed_at":"2023-05-17T14:31:06.008Z","dependency_job_id":null,"html_url":"https://github.com/electricbubble/gwda-ext-opencv","commit_stats":null,"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/electricbubble%2Fgwda-ext-opencv","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/electricbubble%2Fgwda-ext-opencv/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/electricbubble%2Fgwda-ext-opencv/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/electricbubble%2Fgwda-ext-opencv/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/electricbubble","download_url":"https://codeload.github.com/electricbubble/gwda-ext-opencv/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":225769332,"owners_count":17521264,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-21T17:18:28.883Z","updated_at":"2024-11-21T17:18:29.484Z","avatar_url":"https://github.com/electricbubble.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# gwda-ext-opencv\n\n[electricbubble/gwda](https://github.com/electricbubble/gwda) 的图片匹配扩展库。\n\n## 安装\n\n\u003e 必须先安装好 `OpenCV`，安装步骤可参考 `hybridgroup/gocv`:\n\u003e - [macOS](https://github.com/hybridgroup/gocv#macos) \n\u003e 建议直接用 `Homebrew` 安装\n\n```bash\ngo get github.com/electricbubble/gwda-ext-opencv\n```\n\n## 使用\n```go\npackage main\n\nimport (\n\t\"fmt\"\n\t. \"github.com/electricbubble/gwda\"\n\textOpenCV \"github.com/electricbubble/gwda-ext-opencv\"\n\t\"log\"\n)\n\nfunc main() {\n\tdriver, err := NewUSBDriver(nil)\n\tcheckErr(err)\n\n\tdriverExt, err := extOpenCV.Extend(driver, 0.95)\n\tcheckErr(err, \"扩展 driver ，指定匹配阀值为 95%（在不修改或者使用 `OnlyOnceThreshold` 的情况下）\")\n\n\tpathZero := \"/Users/hero/Documents/temp/2020-05/opencv/flag0.png\"\n\terr = driverExt.Tap(pathZero)\n\tcheckErr(err, \"找到图片(匹配度 \u003e= 95%)后点击（默认 x 向右👉偏移 50%， y 向下👇偏移 50%）\")\n\n\terr = driverExt.TapOffset(pathZero, 0.1, 0.1)\n\tcheckErr(err, \"找到图片(匹配度 \u003e= 95%)后点击（ x 向右👉偏移 10%， y 向下👇偏移 10%）\")\n\n\tpathSeven := \"/Users/hero/Documents/temp/2020-05/opencv/flag7.png\"\n\terr = driverExt.TapOffset(pathSeven, 0.2, 0.8)\n\tcheckErr(err, \"找到图片(匹配度 \u003e= 95%)后点击（ x 向右👉偏移 20%， y 向下👇偏移 80%）\")\n\n\terr = driverExt.DoubleTap(pathSeven)\n\tcheckErr(err, \"找到图片(匹配度 \u003e= 95%)后双击（默认 x 向右👉偏移 50%， y 向下👇偏移 50%）\")\n\n\terr = driverExt.DoubleTapOffset(pathSeven, 0.1, 0.25)\n\tcheckErr(err, \"找到图片(匹配度 \u003e= 95%)后点击（ x 向右👉偏移 10%， y 向下👇偏移 25%）\")\n\n\tpathSlash := \"/Users/hero/Documents/temp/2020-05/opencv/flag.png\"\n\terr = driverExt.SwipeDown(pathSlash, 0.5)\n\tcheckErr(err, \"向下👇滑动，滑动距离为图片高度的 50%（默认从图片的正中间顶部向底部滑动，默认滑动距离为 1个 图片高度）\")\n\n\terr = driverExt.SwipeDownOffset(pathSlash, 0.25, 1)\n\tcheckErr(err, \"向下👇滑动（ x 向右👉偏移 25%， y 向下👇偏移 100% ）\")\n\n\terr = driverExt.SwipeDownOffset(pathSlash, -0.25, -0.8)\n\tcheckErr(err, \"向下👇滑动（ x 向左👈偏移 25%， y 向上👆偏移 80% ）\")\n\n\t// WDADebug = true\n\n\t// 撤销 3次 操作\n\tundo(driverExt, 3)\n\n\terr = driverExt.SwipeUp(pathSlash, 0.5)\n\tcheckErr(err, \"向上👆滑动，滑动距离为图片高度的 50%（默认从图片的正中间底部向顶部滑动，默认滑动距离为 1个 图片高度）\")\n\n\terr = driverExt.SwipeUpOffset(pathSlash, 0.9, 0.6)\n\tcheckErr(err, \"向上👆滑动（起始滑动点 x 向右👉偏移 90%， y 向下👇偏移 60% ）\")\n\n\terr = driverExt.OnlyOnceThreshold(0.92).SwipeUpOffset(pathSlash, -0.1, -0.05, 0.3)\n\tcheckErr(err, \"向上👆滑动，临时指定匹配阀值为 92%，滑动距离为图片高度的 30%（起始滑动点 x 向左👈偏移 10%， y 向上👆偏移 5% ）\")\n\n\t// 撤销 3次 操作\n\tundo(driverExt, 3)\n\n\terr = driverExt.SwipeLeft(pathSlash, 0.5)\n\tcheckErr(err, \"向左👈滑动，滑动距离为图片宽度的 50%（默认从图片的正中间右侧向左侧滑动，默认滑动距离为 1个 图片宽度）\")\n\n\terr = driverExt.SwipeLeftOffset(pathSlash, 0.5, 0.55)\n\tcheckErr(err, \"向左👈滑动（起始滑动点 x 向右👉偏移 50%， y 向下👇偏移 55% ）\")\n\n\terr = driverExt.OnlyOnceThreshold(0.92).SwipeLeftOffset(pathSlash, -0.15, -0.25)\n\tcheckErr(err, \"向左👈滑动，临时指定匹配阀值为 92%（起始滑动点 x 向左👈偏移 15%， y 向上👆偏移 25% ）\")\n\n\t// driverExt.Debug(extOpenCV.DmNotMatch)\n\n\t// 撤销 3次 操作\n\tundo(driverExt, 3)\n\n\terr = driverExt.SwipeRight(pathSlash, 0.5)\n\tcheckErr(err, \"向右👉滑动，滑动距离为图片宽度的 50%（默认从图片的正中间左侧向右侧滑动，默认滑动距离为 1个 图片宽度）\")\n\n\terr = driverExt.SwipeRightOffset(pathSlash, 0.5, 0.6)\n\tcheckErr(err, \"向右👉滑动（起始滑动点 x 向右👉偏移 50%， y 向下👇偏移 60% ）\")\n\n\terr = driverExt.OnlyOnceThreshold(0.90).SwipeRightOffset(pathSlash, -0.25, -0.05)\n\tcheckErr(err, \"向右👉滑动（起始滑动点 x 向左👈偏移 25%， y 向上👆偏移 5% ）\")\n\n\t// 撤销 10次 操作\n\tundo(driverExt, 10)\n}\n\nfunc undo(dExt *extOpenCV.DriverExt, n int) {\n\tpathUndo := \"/Users/hero/Documents/temp/2020-05/opencv/undo.png\"\n\terr := dExt.TapWithNumber(pathUndo, n)\n\tcheckErr(err, fmt.Sprintf(\"撤销 %d次 操作\\n\", n))\n}\n\nfunc checkErr(err error, msg ...string) {\n\tif err != nil {\n\t\tlog.Fatalln(msg, err)\n\t}\n}\n\n```\n\n示例代码运行预览  \n![gwda-ext-opencv](https://raw.githubusercontent.com/electricbubble/ImageHosting/master/img/202005221801_gwda_ext_opencv.gif)\n\n\n### 手势密码\n首先是抠出一张手势密码中的触摸点小图，如下图被圈中的其中一个  \n\u003cimg src=\"https://raw.githubusercontent.com/electricbubble/ImageHosting/master/img/20200525101820.png\" alt=\"gesture-password\" style=\"zoom:25%;\" /\u003e  \n\n`GesturePassword` 函数会通过这个 触摸点小图 找到全部，并根据上图所示的进行排序。\n\n比如，这里需要一个 `M` 的手势密码，根据排序后的索引值，我们只需要传入 `[]int{6, 3, 0, 4, 2, 5, 8}`\n可参考 [gesture_test.go](./gesture_test.go)\n\u003e 这里就不放预览图了，觉得有兴趣的可以自己尝试下，这里也只是一个简单的应用方向。 ","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Felectricbubble%2Fgwda-ext-opencv","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Felectricbubble%2Fgwda-ext-opencv","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Felectricbubble%2Fgwda-ext-opencv/lists"}