Skip to content
This repository has been archived by the owner on Aug 15, 2024. It is now read-only.

征集声骸图片 #171

Open
lazydog28 opened this issue Jun 30, 2024 · 9 comments
Open

征集声骸图片 #171

lazydog28 opened this issue Jun 30, 2024 · 9 comments

Comments

@lazydog28
Copy link
Owner

lazydog28 commented Jun 30, 2024

由于数据集不足,导致模型训练效果不是很好,所以征集声骸图片。

在打完BOSS以后,执行下面的代码将每隔1秒截一张图保存到images目录

请操作人物左右移动,获取不同角度的声骸图片。

截图完成后请打包为压缩包上传到网盘后将链接发送至邮箱: mc@caiyun.fun

或直接发送压缩包至邮箱

import time
from ctypes import windll
import numpy as np
from PIL import Image
import win32gui
import win32ui
import os


def screenshot() -> np.ndarray | None:
    """
    截取当前窗口的屏幕图像。

    通过调用Windows图形设备接口(GDI)和Python的win32gui、win32ui模块,
    本函数截取指定窗口的图像,并将其存储为numpy数组。

    返回值:
        - np.ndarray: 截图的numpy数组,格式为RGB(不包含alpha通道)。
        - None: 如果截取屏幕失败,则返回None。
    """
    hwndDC = win32gui.GetWindowDC(hwnd)  # 获取窗口设备上下文(DC)
    mfcDC = win32ui.CreateDCFromHandle(hwndDC)  # 创建MFC DC从hwndDC
    saveDC = mfcDC.CreateCompatibleDC()  # 创建与mfcDC兼容的DC
    saveBitMap = win32ui.CreateBitmap()  # 创建一个位图对象
    saveBitMap.CreateCompatibleBitmap(mfcDC, int(real_w), int(real_h))  # 创建与mfcDC兼容的位图
    saveDC.SelectObject(saveBitMap)  # 选择saveDC的位图对象,准备绘图

    # 尝试使用PrintWindow函数截取窗口图像
    result = windll.user32.PrintWindow(hwnd, saveDC.GetSafeHdc(), 3)
    if result != 1:
        return None  # 如果截取失败,则返回None

    # 从位图中获取图像数据
    bmp_info = saveBitMap.GetInfo()  # 获取位图信息
    bmp_str = saveBitMap.GetBitmapBits(True)  # 获取位图数据
    im = np.frombuffer(bmp_str, dtype="uint8")  # 将位图数据转换为numpy数组
    im.shape = (bmp_info["bmHeight"], bmp_info["bmWidth"], 4)  # 设置数组形状
    im = im[:, :, [2, 1, 0, 3]][:, :, :3]  # 调整颜色通道顺序为RGB 并去掉alpha通道

    # 清理资源
    win32gui.DeleteObject(saveBitMap.GetHandle())
    saveDC.DeleteDC()
    mfcDC.DeleteDC()
    win32gui.ReleaseDC(hwnd, hwndDC)

    return im  # 返回截取到的图像waA


def get_scale_factor():
    try:
        windll.shcore.SetProcessDpiAwareness(1)  # 设置进程的 DPI 感知
        scale_factor = windll.shcore.GetScaleFactorForDevice(
            0
        )  # 获取主显示器的缩放因子
        return scale_factor / 100  # 返回百分比形式的缩放因子
    except Exception as e:
        print("Error:", e)
        return None


if __name__ == "__main__":
    try:
        hwnd = win32gui.FindWindow("UnrealWindow", "鸣潮  ")
        left, top, right, bot = win32gui.GetClientRect(hwnd)
        w = right - left
        h = bot - top
        scale_factor = get_scale_factor()
        real_w = int(w * scale_factor)
        real_h = int(h * scale_factor)
        if not os.path.exists(r"images"):
            os.mkdir(r"images")
        for i in range(40):
            img = screenshot()
            img = Image.fromarray(img)
            img.save(rf"images\{int(time.time())}.png")
            time.sleep(1)
            print(i, time.time())
    except Exception as e:
        print(e)
    finally:
        input("Press any key to exit...")

上述截图代码打包后的exe文件

screenshot.zip

@lazydog28 lazydog28 pinned this issue Jun 30, 2024
@ArcS17
Copy link
Contributor

ArcS17 commented Jun 30, 2024

screenshot.exe需要以管理员身份运行否则
image

@3055909481
Copy link

是否可以整合进脚本里面,如果开关打开,每次识别声骸时(转动方向时)截图保存本地

@3055909481
Copy link

是否可以整合进脚本里面,如果开关打开,每次识别声骸时(转动方向时)截图保存本地

最后在成功拾取声骸就删除截图,没拾取就保留,大家可以查看截图,选择漏掉的截图上传

@beckgreen
Copy link

打完后自己手动操作找角度截图吗

@testpaper007
Copy link

是否可以整合进脚本里面,如果开关打开,每次识别声骸时(转动方向时)截图保存本地

最后在成功拾取声骸就删除截图,没拾取就保留,大家可以查看截图,选择漏掉的截图上传

不可以,需要你判定又声骸以后再各个方向截图,查看截图自己挑选反而费时间,有一个声骸掉率,你开exe跑一圈就行了。

@testpaper007
Copy link

打完后自己手动操作找角度截图吗

应该是你打一个有声骸的,然后不捡,然后开exe,然后多角度移动,会自动截图的

@NepPure
Copy link
Contributor

NepPure commented Jul 2, 2024

建议整合进刷图,给个配置启用是否截图,我们定期来提供素材

@wakening
Copy link
Contributor

wakening commented Jul 2, 2024

没有适配缩放

@lazydog28
Copy link
Owner Author

没有适配缩放

更新了上方代码

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

7 participants