鱼C论坛

 找回密码
 立即注册
查看: 3540|回复: 4

[技术交流] [C++] 跳一跳图像识别

[复制链接]
发表于 2018-1-30 17:33:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
先说一下原理:1.盒子的位置;
背景颜色相似,用色差把背景全部去除,那剩下的就是盒子、阴影、角色;
通过观察发现,盒子都在阴影上面,而且盒子的边缘颜色差不多;
然后取出顶部最高点,左边的最高点;
对角线;
01.png
然后确定盒子中心点;
2.角色的位置;
角色最下面是一条直线;
取这条直线的中心点;
确定角色的位置;

然后通过勾股定理确定角色到盒子中心点的距离;
02.jpg

然后这个距离乘以系数;
就是按下屏幕的时间;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-1-30 17:34:16 | 显示全部楼层
本帖最后由 Avatar_Cc 于 2018-1-30 17:35 编辑

写的乱, 看不懂可以问我
代码:
Data Jump(Bitmap * _Bitmap)
{
        BYTE Jump_R = 0;
        BYTE Jump_G = 0;
        BYTE Jump_B = 0;

        BYTE Next_R = 0;
        BYTE Next_G = 0;
        BYTE Next_B = 0;
        POINT Next_One = { 0 };
        int Next_One_Num = 0;
        POINT Next_Two = { 0 };
        int Next_Two_Num = 0;

        POINT Jump_Point = { 0 };
        int Jump_Num = 0;



        for (int y = 400; y < _Bitmap->GetHeight() - 400; y++)
        {
                int i = 0;
                for (int x = 0; x < _Bitmap->GetWidth(); x++)
                {
                        Color m_Color;
                        _Bitmap->GetPixel(x, y, &m_Color);
                        if (y == 400 && x == 0)
                        {
                                Jump_R = m_Color.GetRed();
                                Jump_G = m_Color.GetGreen();
                                Jump_B = m_Color.GetBlue();
                        }

                        if (abs(m_Color.GetRed() - Jump_R) > 20 || abs(m_Color.GetGreen() - Jump_G) > 20 || abs(m_Color.GetBlue() - Jump_B) > 20)
                        {
                                if (y < _Bitmap->GetHeight() / 2)
                                {

                                        if (abs(m_Color.GetRed() - 60) < 20 && abs(m_Color.GetGreen() - 60) < 20 && abs(m_Color.GetBlue() - 70) < 25 && i == 0)
                                        {
                                                i = x + 61;
                                        }

                                        if (x < i)
                                        {
                                                continue;
                                        }

                                                if (Next_One.y == 0)
                                                {

                                                        Next_One.y = y;
                                                        Next_One.x = x;
                                                        //Next_One_Num++;
                                                        Color Temp_Color;
                                                        _Bitmap->GetPixel(x, y + 2, &Temp_Color);
                                                        Next_R = Temp_Color.GetRed();
                                                        Next_G = Temp_Color.GetGreen();
                                                        Next_B = Temp_Color.GetBlue();

                                                        Next_Two.x = x;
                                                        Next_Two.y = y;
                                                }
                                                if (Next_One.y == y)
                                                {
                                                        Next_One_Num++;
                                                }
                                                else
                                                {
                                                        if (y > Next_One.y)
                                                        {
                                                                if (abs(m_Color.GetRed() - Next_R) < 10 && abs(m_Color.GetGreen() - Next_G) < 10 && abs(m_Color.GetBlue() - Next_B) < 10)
                                                                {
                                                                        if (x < Next_Two.x && (Next_One.x - x) * 2 < 410)
                                                                        {
                                                                                Next_Two.x = x;
                                                                                Next_Two.y = y;
                                                                                Next_Two_Num = 0;
                                                                        }
                                                                        if (x == Next_Two.x)
                                                                        {
                                                                                Next_Two_Num++;
                                                                        }
                                                                }
                                                        }
                                                }
                                        
                                }
                                else
                                {
                                        if (abs(m_Color.GetRed() - 54) < 5 && abs(m_Color.GetGreen() - 59) < 5 && abs(m_Color.GetBlue() - 101) < 5)
                                        {
                                                if (Jump_Point.y != y)
                                                {
                                                        Jump_Point.x = x;
                                                        Jump_Point.y = y;
                                                        Jump_Num = 0;
                                                }
                                                else
                                                {
                                                        Jump_Num++;
                                                }
                                        }
                                }
                        }
                }
        }

        Data m_Data;
        if (Next_One_Num)
        {
                Next_One.x += Next_One_Num / 2;
        }
        if (Next_Two_Num)
        {
                Next_Two.y += Next_Two_Num / 2;
        }
        if (Jump_Num)
        {
                Jump_Point.x += Jump_Num / 2;
        }
        m_Data.m_Next.x = Next_One.x;
        m_Data.m_Next.y = Next_Two.y;


        m_Data.m_Jump = Jump_Point;

        double Double_Temp_Distance = sqrt((abs(m_Data.m_Next.y - m_Data.m_Jump.y)) * (abs(m_Data.m_Next.y - m_Data.m_Jump.y)) + (abs(m_Data.m_Next.x - m_Data.m_Jump.x)) *  (abs(m_Data.m_Next.x - m_Data.m_Jump.x)));
        int Int_Temp_Distance = (int)Double_Temp_Distance;
        if (Double_Temp_Distance - Int_Temp_Distance > 0.5)
        {
                Int_Temp_Distance++;
        }
        m_Data.m_Distance = Int_Temp_Distance;

        return m_Data;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-30 20:07:32 | 显示全部楼层
老铁看不懂啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-30 20:09:00 | 显示全部楼层
看懂这些需要什么姿势
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-31 14:42:03 | 显示全部楼层
本帖最后由 Avatar_Cc 于 2018-1-31 15:04 编辑
一生热爱 发表于 2018-1-30 20:09
看懂这些需要什么姿势


其实就是利用色差,把背景色全部屏蔽,剩下的就是盒子和小人了,然后盒子一般在上面,因为背景色已经全被屏蔽了,所以取到的第一个像素位置就是盒子最顶点的位置;然后向下遍历寻找和这个顶点差不多颜色的像素,选一个x最小的,这个就是盒子最左边的位置;然后对角线,中心点就是盒子的位置;
小人的位置就是取一个颜色范围;因为是一行一行遍历的,所以选一个y最大的,就是小人最下一行的y坐标;x取个中心点;这个就是小人的坐标;
然后根据勾股定理求出小人到盒子中心的距离;然后乘以一个系数,就算出了按下屏幕的时间;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-23 21:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表