Skip to content

Repository files navigation

随机抽选

桌面上的一个小圆钮,按一下抽一个人。

怎么用

  • 左键点一下 —— 抽一个人
  • 左键按住拖 —— 挪动悬浮窗(拖不出屏幕,但可以压在任务栏上)
  • 右键 —— 设置菜单

抽中之后:屏幕中央弹出大字,同时 ClassIsland 主界面发一条提醒。两个都能在菜单里单独关掉。

名单

纯文本,一行一个名字,没有引号、没有 JSON,记事本就能改:

张三
李四
王五
  • 空行和以 # 开头的行会被忽略
  • 重复的名字只算一个
  • 保存后立刻生效,不用重启

文件位置:右键菜单 → 打开名单文件。首次运行会自动生成一份带说明的示例。

三种模式

模式 行为
随机抽选 每次都从全部名单里抽,只回避「和上一次是同一个人」
本轮内不重复 抽到的人本轮不再出现;抽完一轮自动开新一轮
拍照抽人 用摄像头拍一张,从检测到的人脸里随机挑一个,裁出人像

菜单顶部会显示当前模式和本轮剩余人数。想提前重来,点「开始新一轮」。

随机数直接取自操作系统的熵源(RandomNumberGenerator), 不存在「拿时间戳当种子、同一毫秒内连抽拿到同一个人」这种问题。

拍照抽人

应用设置 → 随机抽选 里有完整设置和「试拍一次」。

只能检测正对镜头的人脸。 没有可离线使用的模型能认出后脑勺,背对镜头的人抽不到。 用「试拍一次」对着真实场景量一遍再决定用不用——它会打出分辨率、检出人数、各步耗时, 并把画了检测框的照片显示出来。

用的是 OpenCV Zoo 的 YuNet(232 KB ONNX),靠 ONNX Runtime 跑,两样都随插件打包, 全程离线。所以这个插件包是 4.6 MB,其余几个都只有几十 KB。

在一张几十人的合影上实测,单次推理检出 97 张脸、耗时 63 ms; 作为对照,Windows 自带的人脸检测整帧只检出 4 张,分块放大到 58 张要 736 ms。

几个可调项:

  • 摄像头保持时间(默认 120 秒):打开摄像头要 0.2~1.5 秒,首帧还得再等一会儿; 开着的时候每帧只要几十毫秒。所以抽完先不关,连着抽几乎是瞬时的。 代价是这期间摄像头指示灯亮着,到点自动关掉。设成 0 就是用完立刻关,页面上也有「立刻关闭」。
  • 人脸分数阈值(默认 0.50):0.50 检出 97 人,0.70 只剩 60 人, 而 OpenCV 默认的 0.90 只有 1 人——那个默认值在人多的场景下完全不能用。
  • 分块检测(默认关):把画面切块各检一遍再合并,能从 97 提到 132,代价是每块一次推理。
  • 保存原图(默认关):合影是在场者的影像,不开的时候整帧只在内存里待到裁完就丢。

回避最近抽过的人

独立随机的意思是上一次抽了谁对这一次毫无影响——30 个人里连着两次撞上的概率是 1/30, 抽十几次几乎一定会遇到,看着就很像「坏了」。

所以拍照模式会回避最近抽过的几个人(默认 6 个)。人不会乱动, 所以用人脸在画面里的位置当身份:位置落在最近抽过的那几个附近的,这一轮先不抽。 避开之后一个都不剩时退回全体重挑——宁可重复也不能抽不出人。设成「不回避」就是纯独立随机。

回避记录只在内存里:摄像头一挪、人一换座位,那些坐标就没意义了, 存进配置反而会把过时的回避带到下一次开机。

混入文字抽选

拍照模式下可以设一个概率,按这个概率改成按名单抽名字。一直是照片会腻, 偶尔蹦一个名字更有意思,也照顾到没被拍进画面的人。

文字抽选可以用单独一份名单名单-文字.txt),和拍照那套完全隔离: 想让文字抽选只覆盖某几个人时不必动主名单。 两份名单共用同一套「本轮已抽」状态——名单隔离是为了圈定范围,不是各记各的进度。

其他设置

  • 悬浮窗大小:小 / 中 / 大
  • 抽中之后:中央大字开关、ClassIsland 提醒开关、大字停留时长(1.5 / 2.5 / 4 秒)
  • 隐藏悬浮窗:藏起来;想叫回来重启 ClassIsland

位置、模式、各项开关都会自动记住。

置顶

悬浮窗和中央大字都会被持续按在最顶层:除了设 Topmost,还会加上 WS_EX_TOOLWINDOW(不进 Alt+Tab)和 WS_EX_NOACTIVATE(不抢焦点), 并由定时器反复调用 SetWindowPos(HWND_TOPMOST) 顶回去。 全是文档化的公开 API,不改系统设置,也不碰别的进程。

开源信息

  • 仓库:https://github.com/Gordonynh/RandomPicker · MIT 协议
  • 针对 ClassIsland 2.1(Avalonia)构建;随 release 提供打包好的 .cipx
  • 从源码编译:克隆到 ClassIsland 源码树的 plugins/ 目录下,dotnet build -c Release

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages