クリックした果物を当てる

お盆に並べられた果物をクリックして「りんご, みかん, バナナ」を当てます。

前田稔(Maeda Minoru)の超初心者のプログラム入門

クリックした果物を当てる

  1. マスク画像を使うので ImageAI Class Version-3 を使って下さい。
    Version-3 Class は エッジ検出 を参照して下さい。
    BMP 画像の横幅(Width)は【8の倍数】に合わせて下さい。
  2. Main.cpp の AppInit() から LoadBmp() で、お盆に乗せた果物の画像ファイルを入力します。
    InitDib() で DibStruct を初期化して下さい。
    Show(ImageAI->Dib.hBmpDC, 0, 0) で入力した画像を Dib.hBmpDC に転送します。
    char        ImgFile[]= "c:\\data\\test\\fruit.bmp";
    WORD        xp,yp;
    
    // 画像をロードして、24bit DIB を作成
    LRESULT  AppInit(HWND hwnd)
    {
        ImageAI= new IMAGEAI(hwnd);
        if (ImageAI->LoadBmp(ImgFile)==false)   return false;
        ImageAI->Adjust(true);
        ImageAI->InitDib();
        ImageAI->Show(ImageAI->Dib.hBmpDC,0,0);
        return true;
    }
    
  3. WM_PAINT では、ShowDib() で Dib.hBmpDC の画像を描画します。
    Dib.hBmpDC の画像は「入力された元の画像、または果物をマスクを使って抽出した画像」です。
            case WM_PAINT:          // Dib.hBmpDC の画像を描画
                hdc = BeginPaint(hWnd,&ps);
                if (ImageAI)
                {   ImageAI->ShowDib(hdc, 0, 0);  }
                EndPaint(hWnd, &ps);
                break;
    
  4. WM_RBUTTONDOWN: では、元の画像(お盆に並べられた果物の画像)に戻します。
            case WM_RBUTTONDOWN:    // 右ボタンをクリック
                ImageAI->Show(ImageAI->Dib.hBmpDC, 0, 0);
                InvalidateRect(hWnd, NULL, FALSE);
                break;
    
  5. WM_LBUTTONDOWN: で、クリックされた果物を当てます。
    クリックされた座標を xp, yp に取得します。
    Set_Mask(xp,yp,110) でマスクを作成します。
    閾値は 110 ぐらいが適しているようです。
    Show() と AndMask() でマスクされた画像を Dib の hBmpDC に作成します。
    ここからが果物の解析です。
    Sum_Color() と Get_Size() で画像の色調と幅と高さを調べます。
    「りんご」は緑と青が近い値です。
    「りんご」を除くと、丸いのは「みかん」です。
    詳細は りんご, みかん, バナナ を参照して下さい。
            case WM_LBUTTONDOWN:    // 左ボタンをクリック
                xp= LOWORD(lp);
                yp= HIWORD(lp);
                ImageAI->Set_Mask(xp,yp,110);
                ImageAI->Show(ImageAI->Dib.hBmpDC, 0, 0);
                ImageAI->AndMask(ImageAI->Dib.hBmpDC, 0, 0);
                ImageAI->Sum_Color();
                ImageAI->Get_Size();
                // りんごを認識
                wk= (ImageAI->rgb[1]*100)/ImageAI->rgb[0];
                if (wk>80 && wk<120)    MessageBox(NULL,"「りんご」です","Message Box",MB_OK);
                else
                {   wk = (ImageAI->height * 100) / ImageAI->width;
                    if (wk > 80)  MessageBox(NULL, "「みかん」です", "Message Box", MB_OK);
                    else    MessageBox(NULL, "「ばなな」です", "Message Box", MB_OK);
                }
                InvalidateRect(hWnd,NULL,FALSE);
                break;
    
  6. お盆に並べられた果物の画像から、果物を左クリックして下さい。
    クリックした果物の名前が表示されます。
    右クリックすると、元のお盆に並べられた果物の画像に戻ります。
    お盆や背景部分をクリックすると「りんご」の条件「wk>80 && wk<120」に合っているらしく「りんご」が表示されます。

[Next Chapter ↓] Face Image
[Previous Chapter ↑] フルーツを色で覚える

超初心者のプログラム入門(Win32API C++)