如何更改垫子通道?

时间:2018-08-23 19:07:07

标签: c# opencv mat

public void searchIMG(Bitmap screen_img, Bitmap find_img)
    {
        //스크린 이미지 선언
        //using (Mat ScreenMat = OpenCvSharp.Extensions.BitmapConverter.ToMat(screen_img))
        Mat ScreenMat = OpenCvSharp.Extensions.BitmapConverter.ToMat(screen_img);

        //찾을 이미지 선언
        Mat FindMat = OpenCvSharp.Extensions.BitmapConverter.ToMat(find_img);
        FindMat.ConvertTo(FindMat, MatType.CV_8UC4);

        //스크린 이미지에서 FindMat 이미지를 찾아라
        using (Mat res = ScreenMat.MatchTemplate(FindMat, TemplateMatchModes.CCoeffNormed))
        {
            //찾은 이미지의 유사도를 담을 더블형 최대 최소 값을 선언합니다.
            double minval, maxval = 0;
            //찾은 이미지의 위치를 담을 포인트형을 선업합니다.
            OpenCvSharp.Point minloc, maxloc;
            //찾은 이미지의 유사도 및 위치 값을 받습니다. 
            Cv2.MinMaxLoc(res, out minval, out maxval, out minloc, out maxloc);
            Debug.WriteLine("찾은 이미지의 유사도 : " + maxval);


            //이미지를 찾았을 경우 클릭이벤트를 발생!!
            int offsetY = 35;
            if (maxval >= 0.8)
            {
                InClick(maxloc.X + FindMat.Width / 2, maxloc.Y + FindMat.Height / 2 - offsetY);
            }
        }
    }

首先,很抱歉我的英语不好

当我执行此程序时,会像这样发生异常 exception

所以我会进行调试并像这样检查其他频道 defferent channel

我认为(带有ScreenMat的CV_8UC3)和(带有FindMat的CV_8UC3)会出现异常

所以我想将FindMat的频道更改为CV_8UC4

我尝试使用谷歌搜索并应用FindMat.ConvertTo,但不应用

所以...我找不到更改频道方法

所以请帮助我,如何更改FindMat频道

如果您想查看完整来源,请点击下面

Fullsource

http://colorscripter.com/s/z8EhVR5

感谢您阅读我的问题,并请指出我的英文错误

1 个答案:

答案 0 :(得分:1)

我找到了解决方案!!

问题是位图像素格式不同 所以我插入

位图克隆=新位图(find_img.Width,find_img.Height,System.Drawing.Imaging.PixelFormat.Format32bppArgb);

解决了!

public void searchIMG(Bitmap screen_img, Bitmap find_img)
    {
        Bitmap clone = new Bitmap(find_img.Width, find_img.Height,System.Drawing.Imaging.PixelFormat.Format32bppArgb);


        //스크린 이미지 선언
        //using (Mat ScreenMat = OpenCvSharp.Extensions.BitmapConverter.ToMat(screen_img))
        Mat ScreenMat = OpenCvSharp.Extensions.BitmapConverter.ToMat(screen_img);

        //찾을 이미지 선언
        Mat FindMat = OpenCvSharp.Extensions.BitmapConverter.ToMat(clone);
        FindMat.ConvertTo(FindMat, MatType.CV_8UC4);
        FindMat.ExtractChannel(1);
        Debug.WriteLine(FindMat.GetType());
        //스크린 이미지에서 FindMat 이미지를 찾아라
        using (Mat res = ScreenMat.MatchTemplate(FindMat, TemplateMatchModes.CCoeffNormed))
        {
            //찾은 이미지의 유사도를 담을 더블형 최대 최소 값을 선언합니다.
            double minval, maxval = 0;
            //찾은 이미지의 위치를 담을 포인트형을 선업합니다.
            OpenCvSharp.Point minloc, maxloc;
            //찾은 이미지의 유사도 및 위치 값을 받습니다. 
            Cv2.MinMaxLoc(res, out minval, out maxval, out minloc, out maxloc);
            Debug.WriteLine("찾은 이미지의 유사도 : " + maxval);


            //이미지를 찾았을 경우 클릭이벤트를 발생!!
            int offsetY = 35;
            if (maxval >= 0.8)
            {
                InClick(maxloc.X + FindMat.Width / 2, maxloc.Y + FindMat.Height / 2 - offsetY);
            }
        }
    }