鱼C论坛

 找回密码
 立即注册
查看: 3179|回复: 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 编辑

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

  6.         BYTE Next_R = 0;
  7.         BYTE Next_G = 0;
  8.         BYTE Next_B = 0;
  9.         POINT Next_One = { 0 };
  10.         int Next_One_Num = 0;
  11.         POINT Next_Two = { 0 };
  12.         int Next_Two_Num = 0;

  13.         POINT Jump_Point = { 0 };
  14.         int Jump_Num = 0;



  15.         for (int y = 400; y < _Bitmap->GetHeight() - 400; y++)
  16.         {
  17.                 int i = 0;
  18.                 for (int x = 0; x < _Bitmap->GetWidth(); x++)
  19.                 {
  20.                         Color m_Color;
  21.                         _Bitmap->GetPixel(x, y, &m_Color);
  22.                         if (y == 400 && x == 0)
  23.                         {
  24.                                 Jump_R = m_Color.GetRed();
  25.                                 Jump_G = m_Color.GetGreen();
  26.                                 Jump_B = m_Color.GetBlue();
  27.                         }

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

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

  36.                                         if (x < i)
  37.                                         {
  38.                                                 continue;
  39.                                         }

  40.                                                 if (Next_One.y == 0)
  41.                                                 {

  42.                                                         Next_One.y = y;
  43.                                                         Next_One.x = x;
  44.                                                         //Next_One_Num++;
  45.                                                         Color Temp_Color;
  46.                                                         _Bitmap->GetPixel(x, y + 2, &Temp_Color);
  47.                                                         Next_R = Temp_Color.GetRed();
  48.                                                         Next_G = Temp_Color.GetGreen();
  49.                                                         Next_B = Temp_Color.GetBlue();

  50.                                                         Next_Two.x = x;
  51.                                                         Next_Two.y = y;
  52.                                                 }
  53.                                                 if (Next_One.y == y)
  54.                                                 {
  55.                                                         Next_One_Num++;
  56.                                                 }
  57.                                                 else
  58.                                                 {
  59.                                                         if (y > Next_One.y)
  60.                                                         {
  61.                                                                 if (abs(m_Color.GetRed() - Next_R) < 10 && abs(m_Color.GetGreen() - Next_G) < 10 && abs(m_Color.GetBlue() - Next_B) < 10)
  62.                                                                 {
  63.                                                                         if (x < Next_Two.x && (Next_One.x - x) * 2 < 410)
  64.                                                                         {
  65.                                                                                 Next_Two.x = x;
  66.                                                                                 Next_Two.y = y;
  67.                                                                                 Next_Two_Num = 0;
  68.                                                                         }
  69.                                                                         if (x == Next_Two.x)
  70.                                                                         {
  71.                                                                                 Next_Two_Num++;
  72.                                                                         }
  73.                                                                 }
  74.                                                         }
  75.                                                 }
  76.                                        
  77.                                 }
  78.                                 else
  79.                                 {
  80.                                         if (abs(m_Color.GetRed() - 54) < 5 && abs(m_Color.GetGreen() - 59) < 5 && abs(m_Color.GetBlue() - 101) < 5)
  81.                                         {
  82.                                                 if (Jump_Point.y != y)
  83.                                                 {
  84.                                                         Jump_Point.x = x;
  85.                                                         Jump_Point.y = y;
  86.                                                         Jump_Num = 0;
  87.                                                 }
  88.                                                 else
  89.                                                 {
  90.                                                         Jump_Num++;
  91.                                                 }
  92.                                         }
  93.                                 }
  94.                         }
  95.                 }
  96.         }

  97.         Data m_Data;
  98.         if (Next_One_Num)
  99.         {
  100.                 Next_One.x += Next_One_Num / 2;
  101.         }
  102.         if (Next_Two_Num)
  103.         {
  104.                 Next_Two.y += Next_Two_Num / 2;
  105.         }
  106.         if (Jump_Num)
  107.         {
  108.                 Jump_Point.x += Jump_Num / 2;
  109.         }
  110.         m_Data.m_Next.x = Next_One.x;
  111.         m_Data.m_Next.y = Next_Two.y;


  112.         m_Data.m_Jump = Jump_Point;

  113.         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)));
  114.         int Int_Temp_Distance = (int)Double_Temp_Distance;
  115.         if (Double_Temp_Distance - Int_Temp_Distance > 0.5)
  116.         {
  117.                 Int_Temp_Distance++;
  118.         }
  119.         m_Data.m_Distance = Int_Temp_Distance;

  120.         return m_Data;
  121. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> 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-3-29 12:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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