1

画面上の画像を認識し、それをリソース ライブラリと比較し、画像ソースの結果に基づいて計算するプログラムを作成しようとしています。

最初に行ったのは、次のような画面キャプチャ機能を作成することでした。

    private Bitmap Screenshot()
    {
        System.Drawing.Bitmap Table = new System.Drawing.Bitmap(88, 40, PixelFormat.Format32bppArgb);
        System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(RouletteTable);
        g.CopyFromScreen(1047, 44, 0, 0, Screen.PrimaryScreen.Bounds.Size);
        return Table;
    }

次に、この写真を分析します。最初に使用した方法は、2 つの for ループを作成し、両方のビットマップをピクセルごとに分析することでした。この方法の問題点は時間で、37回完了するのに長い時間がかかりました。私は周りを見回して、バイトへの変換とハッシュへの変換方法を見つけました。結果は次のとおりです。

public enum CompareResult
        {
            ciCompareOk,
            ciPixelMismatch,
            ciSizeMismatch
        };

    public CompareResult Compare(Bitmap bmp1, Bitmap bmp2)
    {
        CompareResult cr = CompareResult.ciCompareOk;
        //Test to see if we have the same size of image
        if (bmp1.Size != bmp2.Size)
        {
            cr = CompareResult.ciSizeMismatch;
        }
        else
        {
            //Convert each image to a byte array
            System.Drawing.ImageConverter ic = new System.Drawing.ImageConverter();
            byte[] btImage1 = new byte[1];
            btImage1 = (byte[])ic.ConvertTo(bmp1, btImage1.GetType());
            byte[] btImage2 = new byte[1];
            btImage2 = (byte[])ic.ConvertTo(bmp2, btImage2.GetType());

            //Compute a hash for each image
            SHA256Managed shaM = new SHA256Managed();
            byte[] hash1 = shaM.ComputeHash(btImage1);
            byte[] hash2 = shaM.ComputeHash(btImage2);


            for (int i = 0; i < hash1.Length && i < hash2.Length&& cr == CompareResult.ciCompareOk; i++)
            {
                if (hash1[i] != hash2[i])
                    cr = CompareResult.ciPixelMismatch;
            }
        }
        return cr;
    }    

この関数で 2 つのビットマップを分析した後、メイン フォームで次のように呼び出します。

Bitmap Table = Screenshot();
CompareResult success0 = Compare(Properties.Resources.Result0, Table);           
if (success0 == CompareResult.ciCompareOk)
                { double result = 0; Num.Text = result.ToString(); goto end; }

私が得ている問題は、これがすべて達成されると、常に ciPixelMismatch の cr 値を取得していることです。画像が同一であっても、画像を一致させることができません。

2 つのビットマップの背景をもう少し詳しく説明すると、これらは約 88 x 40 ピクセルで、画面上の 1047, 44 の位置にあります。その領域の写真を自動的に撮るプログラムの一部を作成したので、間違った場所やサイズがキャプチャされることを心配する必要はありませんでした。

Table.Save("table.bmp");

写真を撮って保存した後、プロジェクトの bin フォルダーからリソース フォルダーに直接移動し、プログラムを再度実行しました。これらすべてにもかかわらず、結果は依然として ciPixelMismatch です。問題は、写真が保存されている形式にあると思います。それらは同じ画像であるにもかかわらず、異なる形式で分析されていると思います。おそらく、画像の1つに他の画像よりも少し多くの情報が含まれているため、不一致が発生しています. 誰かがこの問題を解決するのを手伝ってくれませんか? 私はC#プログラミングを始めたばかりで、学習プロセスを開始して5日目ですが、これには本当に途方に暮れています。

敬具、サミュエル

4

0 に答える 0