屏幕以图找图

w9321276 2011-04-04 07:25:33
BOOL ImageFind::FindPic()
{
if (!PrintScreen()) //截图部分没问题,在另一个屏幕找色函数中正常工作
{
AfxMessageBox("截图出错");
return FALSE;
}
//屏幕图像每像素字节数
int npixelByteScr=m_nBitCountScr/8;
//被找图像每像素字节数
int npixelByteFind=m_nBitCountFind/8;
//循环变量
int i, j, m;
//屏幕颜色分量
int r1,g1,b1;
//被找图颜色分量
int r2,g2,b2;
//标志
int flag;
for(i=0;i<m_nHeightScr*m_nWidthScr;i++)
{ flag=0;
m=i;
for (j=0;j<m_nHeightFind*m_nWidthFind;j++)
{
//屏幕像素颜色分量
//m_pImageDataScreen是屏幕图像数据指针,上面的截图函数取得的DIB数据
r1=*(m_pImageDataScreen+m*npixelByteScr+2);
g1=*(m_pImageDataScreen+m*npixelByteScr+1);
b1=*(m_pImageDataScreen+m*npixelByteScr+0);
//被找图像素颜色分量
//m_pImageDataFind为被找图的DIB图像数据,跟踪调试没发现问题
r2=*(m_pImageDataFind+j*npixelByteFind+2);
g2=*(m_pImageDataFind+j*npixelByteFind+1);
b2=*(m_pImageDataFind+j*npixelByteFind+0);
if (r1==r2&&g1==g2&&b1==b2)
{
m++;
flag=1;
if(m-i>=m_nHeightFind*m_nWidthFind)
break;
}
else
{
flag=0;
break;
}
}
if(1==flag) break;
}
//找到坐标coordinateY,coordinateX
coordinateY=m_nHeightScr-i/m_nWidthScr-1;
coordinateX=i-i/m_nWidthScr*m_nWidthScr-m_nWidthFind; //返回被找图左上角坐标
return TRUE;
}



截图环节 以及被找位图 都没问题 算法上出问题了 可能
抠了半天抠出来的,但测试总是不成功
截图函数 是获取屏幕DC 然后获取位图 再转换成DIB格式
用于另一个屏幕找色函数时 截图函数没问题
现在不知道问题出在哪里了
请各位大虾位帮看看
...全文
477 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
w9321276 2011-04-05
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 hztj2005 的回复:]
int r2,g2,b2;
//标志
int flag;
for(i=0;i<m_nHeightScr*m_nWidthScr;i++)
{ flag=0;
m=i;
for (j=0;j<m_nHeightFind*m_nWidthFind;j++)
{
//屏幕像素颜色分量
//m_pImageDataScreen是屏幕图像数据指针,上面的截图函数取得的DIB数据
……
[/Quote]
非常感谢您一直关注并帮助解决我的问题!
*******************************************
r1=*(m_pImageDataScreen+m*npixelByteScr+j*npixelByteScr+2);
g1=*(m_pImageDataScreen+m*npixelByteScr+j*npixelByteScr+1);
b1=*(m_pImageDataScreen+m*npixelByteScr+j*npixelByteScr+0);

*********************************************
刚才改成这样也调试了,还是返回-1,-1 即遍历全屏没找到图
后面有相应代码: 如果像素颜色值相等,则m++ 判断下一个 您添加的代码也是同样的功能 但还是没能正确返回
我想可能是这样的,位图一行的字节数必须为4的倍数 不足的用0填充
r1=*(m_pImageDataScreen+m*npixelByteScr+j*npixelByteScr+2); 这个表达式只是按像素遍历一维数组 而图像颜色点阵 并不是这样排列 我遍历两个图都用这个思路 都错了
如果把后面 if(m-i>=m_nHeightFind*m_nWidthFind)
改为if(m-i>=m_nWidthFind) 一般就能找到 只比较第一行 能找到 而到第二行就乱了
大多数情况下这样可以,但这样得到的数据并不十分可靠
再次感谢您关注我的问题!
hztj2005 2011-04-05
  • 打赏
  • 举报
回复
int r2,g2,b2;
//标志
int flag;
for(i=0;i<m_nHeightScr*m_nWidthScr;i++)
{ flag=0;
m=i;
for (j=0;j<m_nHeightFind*m_nWidthFind;j++)
{
//屏幕像素颜色分量
//m_pImageDataScreen是屏幕图像数据指针,上面的截图函数取得的DIB数据

*******************************************
r1=*(m_pImageDataScreen+m*npixelByteScr+j*npixelByteScr+2);
g1=*(m_pImageDataScreen+m*npixelByteScr+j*npixelByteScr+1);
b1=*(m_pImageDataScreen+m*npixelByteScr+j*npixelByteScr+0);

*********************************************
//被找图像素颜色分量
//m_pImageDataFind为被找图的DIB图像数据,跟踪调试没发现问题
r2=*(m_pImageDataFind+j*npixelByteFind+2);
g2=*(m_pImageDataFind+j*npixelByteFind+1);
b2=*(m_pImageDataFind+j*npixelByteFind+0);
if (r1==r2&&g1==g2&&b1==b2)
{
m++;
flag=1;
if(m-i>=m_nHeightFind*m_nWidthFind){
break;
}
}
else
{
flag=0;
break;
}
}
if(1==flag)
{break;}
}
//找到坐标coordinateY,coordinateX
coordinateY=m_nHeightScr-i/m_nWidthScr-1;
coordinateX=i-i/m_nWidthScr*m_nWidthScr-m_nWidthFind; //返回被找图左上角坐标
return TRUE;
}

w9321276 2011-04-05
  • 打赏
  • 举报
回复
解决了,感谢你们的关注,就是我上面所说的问题,位图不能当做一维数组直接遍历,会乱的,因为每行字节数为4的整数倍,换种方式就能找到图了
w9321276 2011-04-04
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 smwhotjay 的回复:]
我是截图比较数据相似度。达到90%就认为是相同的了。。
[/Quote]

谢谢你的答复!能把比较数据那段代码给看看吗 我这点不懂
smwhotjay 2011-04-04
  • 打赏
  • 举报
回复
我是截图比较数据相似度。达到90%就认为是相同的了。。
w9321276 2011-04-04
  • 打赏
  • 举报
回复
for(i=0;i<m_nHeightScr*m_nWidthScr;i++) //*****i
//为什么是i++?,应该是i=i+x(这里应该是一个颜色分量的值)


答: i自增1,代表下一个像素 i遍及所有像素 是像素的索引 下面是颜色分量的
m=i;
for (j=0;j<m_nHeightFind*m_nWidthFind;j++)
{
//屏幕像素颜色分量
//m_pImageDataScreen是屏幕图像数据指针,上面的截图函数取得的DIB数据
r1=*(m_pImageDataScreen+m*npixelByteScr+2);
g1=*(m_pImageDataScreen+m*npixelByteScr+1);
b1=*(m_pImageDataScreen+m*npixelByteScr+0);
hztj2005 2011-04-04
  • 打赏
  • 举报
回复
for(i=0;i<m_nHeightScr*m_nWidthScr;i++) //*****i

//为什么是i++?,应该是i=i+x(这里应该是一个颜色分量的值)


{ flag=0;
m=i;
for (j=0;j<m_nHeightFind*m_nWidthFind;j++)
{
//屏幕像素颜色分量
//m_pImageDataScreen是屏幕图像数据指针,上面的截图函数取得的DIB数据
r1=*(m_pImageDataScreen+m*npixelByteScr+2);
g1=*(m_pImageDataScreen+m*npixelByteScr+1);
b1=*(m_pImageDataScreen+m*npixelByteScr+0);
//被找图像素颜色分量
//m_pImageDataFind为被找图的DIB图像数据,跟踪调试没发现问题
r2=*(m_pImageDataFind+j*npixelByteFind+2);
g2=*(m_pImageDataFind+j*npixelByteFind+1);
b2=*(m_pImageDataFind+j*npixelByteFind+0);
if (r1==r2&&g1==g2&&b1==b2)
{
m++;
flag=1;
if(m-i>=m_nHeightFind*m_nWidthFind){
break;
}
}
else
{
flag=0;
break;
}
}
w9321276 2011-04-04
  • 打赏
  • 举报
回复
好杯具哦,在CSDN看了好多问题贴都有人回答,偏偏到了我的没人回答呢 - - 帮俺看看吧,当然,我自己也在不断调试,检查 先行谢谢!

19,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧