| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2519 人关注过本帖
标题:大家来找茬图片对比问题 容错算法怎么写才合适?
只看楼主 加入收藏
minghan0313
Rank: 2
等 级:论坛游民
帖 子:15
专家分:31
注 册:2007-5-21
收藏
 问题点数:0 回复次数:12 
大家来找茬图片对比问题 容错算法怎么写才合适?
自己刚学C++没多长时间  想自己写一个大家来找茬的辅助工具   对算法也不清楚  对图像学也不是很明白

先写了一个验证自己算法的小程序FindDifferences   我把QQ大家来找茬全屏后截了几张图片  FindDifferences所作的工作就是读取截屏bmp文件  对比截屏中两张找茬图片   找出不一样的地方   思路很简单  用GetPixel得到两个图片位置中相对位置的点的COLORREF值   如果不一样,就将两张中的一张图片中的这个点用纯色覆盖    有了想法就去写了    写出来之后运行  结果惨不忍睹   两张图片中没有几处地方是全相等的  

************************************************************************************************
这里有一个问题  是否找茬游戏中的两张图片不可能除了找茬的位置之外COLOOREF完全相等?
************************************************************************************************

之后有人提醒我要有一定的容错率    因为没有接触过图形学  怎么容错不清楚   就去网上找了一下资料   有一个公式 sqrt(absR*absR+absG*absG+absB*absB)>100   具体原理我不懂   我就拿来用了   结果还算可以   但是容错的范围是随时要改的   

***************************************************************************************************************
这里是第二个问题   两张图片对比是不是不能用GetPixel得到COLORREF来对比是否相等  必须要有容错率?
***************************************************************************************************************
 
对算法一筹莫展的时候去网上找了一个已经做好的QQ大家来找茬的辅助工具,不管窗口是否最小化,分辨率如何,找得都很精准,唉,信心倍受打击啊  

***************************************************************************************************************
这里是第三个问题    是不是这种辅助程序不能用简单的对比颜色  还要涉及内存问题?
***************************************************************************************************************

下面是程序效果图:
图片附件: 游客没有浏览图片的权限,请 登录注册

图片附件: 游客没有浏览图片的权限,请 登录注册



[ 本帖最后由 minghan0313 于 2010-9-4 16:31 编辑 ]
搜索更多相关主题的帖子: 容错 算法 
2010-09-04 16:23
minghan0313
Rank: 2
等 级:论坛游民
帖 子:15
专家分:31
注 册:2007-5-21
收藏
得分:0 
二楼贴上源代码

程序代码:
#include <windows.h>
#include <math.h>
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR LpcmdLine,int nCmdShow){
    static TCHAR szAppName[]=TEXT("Painter");
    static TCHAR szClassName[]=TEXT("PainterClass");
    HWND hwnd;
    MSG msg;
    WNDCLASS wndclass;
    wndclass.style=CS_HREDRAW | CS_VREDRAW;//风格
    wndclass.lpfnWndProc=WndProc;//*重要*long point to function 指向函数的的长指针 基于该窗口类创建的窗口所使用的窗口函数的入口地址
    wndclass.cbClsExtra=0;//预留额外空间
    wndclass.cbWndExtra=0;//预留额外空间
    wndclass.hInstance=hInstance;//所在程序的实例句柄
    wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);//图标
    wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);//图标
    wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);//背景色
    wndclass.lpszMenuName=NULL;//指定窗口类的菜单
    wndclass.lpszClassName=szClassName;//窗口类类名
    if (!RegisterClass(&wndclass))//注册窗口类 需要一个指向windclass的指针
    {
        MessageBox(NULL,TEXT("This program requires Windows NT!"),szAppName,MB_ICONERROR);
        return 0;
    }
    hwnd=CreateWindow(szClassName,//窗口类名称
        TEXT("Painter"),//窗口标题
        WS_OVERLAPPEDWINDOW,//窗口显示风格
        CW_USEDEFAULT,//初始x方向位置
        CW_USEDEFAULT,//初始y方向位置
        CW_USEDEFAULT,//初始x方向大小
        CW_USEDEFAULT,//初始y方向大小
        NULL,//父窗口句柄
        NULL,//菜单句柄
        hInstance,//程序实例句柄
        NULL);//创建参数 可以访问以后想要引用的程序中的数据
    nCmdShow=SW_SHOWMAXIMIZED;
    ShowWindow(hwnd,nCmdShow);
    UpdateWindow(hwnd);
    while (GetMessage(&msg,NULL,0,0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return (int)msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
    static int cxClient,cyClient,cxBitmap,cyBitmap;
    static HINSTANCE hInstance;
    static BITMAP bmp;
    static HANDLE h;//bmp图片句柄
    static HDC hdc,hdcMemImag;//hdcMemImag是与窗口DC兼容的DC
   

   

     h=LoadImage(NULL,L"C:\\3333.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
     GetObject(h,sizeof(BITMAP),&bmp);//得到图片的宽,高等信息,储存在bmp对象*/
   

    switch(message)
    {
    case WM_CREATE:
        COLORREF colleft,colright;//colleft 左边图片的像素点  colright 右边图片的像素点
        int leftR,rightR,leftG,rightG,leftB,rightB,absR,absG,absB;
        hdc=GetDC(hwnd);//得到窗口的DC(hWnd是窗口句柄)
        hdcMemImag=CreateCompatibleDC(hdc);//得到与窗口DC兼容的DC
        SelectObject(hdcMemImag,h);//把得到的DC与图片句柄关联起来
        for (int y=192;y<=639;y++) //坐标是之前已经找好的
        {   

            for (int x=8;x<=505;x++)
            {
                colleft=GetPixel(hdcMemImag,x,y);//获得左边图片的像素点
                colright=GetPixel(hdcMemImag,x+508,y);//获得右边图片的像素点
               

                leftR=GetRValue(colleft);
                leftG=GetGValue(colleft);
                leftB=GetBValue(colleft);
                rightR=GetRValue(colright);
                rightG=GetGValue(colright);
                rightB=GetBValue(colright);
                absR=leftR-rightR;
                absG=leftG-rightG;
                absB=leftB-rightB;
                if (sqrt((DOUBLE)(absR*absR+absG*absG+absB*absB))>45)
                {
                    SetPixel(hdcMemImag,x+508,y,RGB(0,255,0));
                }
            }
        }
        ReleaseDC(hwnd,hdc);//释放GetDC得到的DC
        break;
    case WM_SIZE:
        InvalidateRect(hwnd,NULL,TRUE);
        break;
    case WM_PAINT:

        hdc=GetDC(hwnd);//得到窗口的DC(hWnd是窗口句柄)
        BitBlt(hdc,0,0,bmp.bmWidth,bmp.bmHeight,hdcMemImag,0,0,SRCCOPY);//把图片画在窗体上
        ReleaseDC(hwnd,hdc);

        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    }
    return DefWindowProc(hwnd,message,wParam,lParam);
}

2010-09-04 16:25
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
收藏
得分:0 
sqrt(absR*absR+absG*absG+absB*absB)>100  这个是因为三基色的原理吧

~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2010-09-05 03:41
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
收藏
得分:0 
根据图像学原理,我感觉两个图像相减后作均值滤波,然后设置一个阀值应该能找出两者的不同点

~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2010-09-05 03:56
minghan0313
Rank: 2
等 级:论坛游民
帖 子:15
专家分:31
注 册:2007-5-21
收藏
得分:0 
以下是引用vfdff在2010-9-5 03:56:07的发言:

根据图像学原理,我感觉两个图像相减后作均值滤波,然后设置一个阀值应该能找出两者的不同点
额...听上去好复杂啊   昨天看了一本数字图像处理的书   感觉跟看高数书是的....
2010-09-05 10:36
迷失的木桶
Rank: 4
等 级:业余侠客
帖 子:52
专家分:230
注 册:2010-5-29
收藏
得分:0 
不需要很复杂,给个提示,,“位操作”
2010-09-05 18:40
minghan0313
Rank: 2
等 级:论坛游民
帖 子:15
专家分:31
注 册:2007-5-21
收藏
得分:0 
以下是引用迷失的木桶在2010-9-5 18:40:29的发言:

不需要很复杂,给个提示,,“位操作”
希望这位前辈能多多指点一下
2010-09-06 08:57
迷失的木桶
Rank: 4
等 级:业余侠客
帖 子:52
专家分:230
注 册:2010-5-29
收藏
得分:0 
1001000
0111110
--------
1110110

看出上面是什么位操作了吗?
发挥你的想象。
2010-09-06 20:10
黑白世界
该用户已被删除
收藏
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽
2010-09-14 08:37
minghan0313
Rank: 2
等 级:论坛游民
帖 子:15
专家分:31
注 册:2007-5-21
收藏
得分:0 
以下是引用黑白世界在2010-9-14 08:37:43的发言:

程序算法蛮好的
简单明了
我试验了下
找的很正确
楼上说的是我写的算法吗?

我自己用别的找茬游戏试验了一次  的确找得很准  不同的地方能标示得很精确   但是在QQ上的大家来找茬上不是很精准   颜色快的边缘也会被标示出来
2010-09-17 17:40
快速回复:大家来找茬图片对比问题 容错算法怎么写才合适?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015926 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved