c++ - 检测特定像素上的某种颜色并在检测到后发送点击的最快方法是什么?

标签 c++ c c++11 visual-c++

不确定此代码是否已上传,因为我找不到代码。我阅读代码的经验比编写代码的经验丰富,因此我们将不胜感激。

最佳答案

首先你必须了解颜色理论以及如何检测两种颜色是否“相同”或“相似”(不同的滤镜也会有不同的结果)..然后你必须知道你想要什么图像格式解析为原始 RGB 像素。

最后,您将图像中的颜色与您想要查找的颜色进行比较。

首先..颜色相似度是用欧几里德距离或“毕达哥拉斯距离”来测量的,如下所示:

距离 = squareRoot(of: abs(r1^2 - r2^2) + abs(g1^2 - g2^2) + abs(b1^2 - b2^2))

其中 r1g1b1 是 RGB 空间中的第一个颜色,r2g2b2 是第二个颜色。 然后,您将该距离与某个容差进行比较。即,您可以接受的某个阈值作为误差角度。

例如白色.. 16777215 作为 UInt 与 RGB 中的 255, 255, 255 相同..

然后是 16777214,因为 UInt 与 255, 255, 254 相同..

这两种颜色对于眼睛来说是白色的,与人眼极其相似,但对于计算机来说它们是不同的!因此,您使用该公式并将距离与某个公差进行比较,例如“10”..为什么?因为如果距离为 0,则颜色完全匹配。如果不是,那么您知道它们并不完美,但它们可能相似,具体取决于您愿意接受多少阈值。这就是距离所代表的。否则通过比较字节来比较精确匹配。

https://en.wikipedia.org/wiki/Color_difference

现在,您不必在 RGB 空间中执行此操作。您可以使用 HSL、XYZ 和 CIELAB 等。最终,结果将非常相似。

我编写的代码正是这样做的:https://github.com/Brandon-T/CMML/blob/master/src/finder.c#L252

https://github.com/Brandon-T/CMML/blob/master/src/finder.c#L30

#include <stdio.h>
#include <stdlib.h>
#include "bitmap.h"
#include "finder.h"

void TestOne(CTSInfo* info)
{
    rgb32 colour = {144, 240, 255, 0};
    PointArray pts;
    initPointArray(&pts);

    if (findColours(info, &pts, &colour, 0, 0, info->targetImage->width, info->targetImage->height))
    {
        Point *p = pts.p;
        int I = 0;
        for (; I < pts.size; ++I, ++p)
            printf("Colour found at: (%d, %d)\n", p->x, p->y);
    }

    freePointArray(&pts);
}

void TestTwo(CTSInfo* info, bitmap* bmp_to_find)
{
    int x, y;

    if (findImageToleranceIn(info, bmp_to_find, &x, &y, 0, 0, info->targetImage->width, info->targetImage->height, 0))
    {
        printf("Image found at: (%d, %d)\n", x, y);
    }
}

int main()
{
    CTSInfo info = {0};
    bitmap bmp_to_find = {0};
    bitmap bmp_target = {0};

    defaultCTS(&info);
    bitmap_from_file(&bmp_to_find, "C:/Users/Brandon/Desktop/find.bmp");
    bitmap_from_file(&bmp_target, "C:/Users/Brandon/Desktop/target.bmp");
    info.targetImage = &bmp_target;



    TestOne(&info);
    printf("\n");

    TestTwo(&info, &bmp_to_find);
    printf("\n");


    freebmp(&bmp_to_find);
    freebmp(&bmp_target);
    return 0;
}

如果您打算用纯 C++ 执行此操作,您可能会遇到困难,因为您必须学习 X11 或 WinAPI 才能从 Windows/游戏获取屏幕截图以检测其中的颜色。我知道的最好的程序是这样的它位于:https://villavu.com/forum它的名字叫“辛巴”。它是用 Pascal 编写的,用于为 Runescape 提供颜色。非常成功,我自己也用过。

有人写了一篇关于CTS(色彩容差空间)的教程:https://villavu.com/forum/showthread.php?t=74908

关于c++ - 检测特定像素上的某种颜色并在检测到后发送点击的最快方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55622688/

相关文章:

C++11 预定义宏

iphone - 断言失败 : (fixture->m_body == this)

C++ - 使用 atoi 时出错

c - 使用 clang 从命令行链接 .dylib 库

c - 我的程序有几个错误,我不知道如何修复它们

c++ - 如何继承成员函数以便它始终返回对派生实例的引用?

c++ - 将 boost 多精度与三角函数结合使用

c++ - 如何调试 QXmlSchema 的加载方法?

c - C中的定时器模拟?

visual-studio-2010 - 使用 C++0x decltype 返回值时返回局部变量或临时变量的地址