【问题标题】:how can i change mat channel?我怎样才能改变垫子频道?
【发布时间】:2019-01-30 05:47:45
【问题描述】:
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

我认为不同的 (CV_8UC4 with ScreenMat) 和 (CV_8UC3 with FindMat) 发生异常

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

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

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

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

如果您想查看完整源代码,请点击下方

Fullsource

http://colorscripter.com/s/z8EhVR5

感谢您阅读我的问题,如果可以的话,请指出我错误的英语

【问题讨论】:

  • 要更改通道数,您可以使用拆分和合并功能或 cvtColor(例如,如果您想从 3 个通道更改为 4 个通道,则使用 BGR2BGRA)。
  • 我找到了解决方案,问题是位图像素格式不同,所以我插入 Bitmap clone = new Bitmap(find_img.Width, find_img.Height,System.Drawing.Imaging.PixelFormat.Format32bppArgb);并解决了!
  • 坦克你这么多

标签: c# opencv mat


【解决方案1】:

我找到了解决方案!!

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

位图克隆 = new Bitmap(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);
            }
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-01
    • 1970-01-01
    • 2022-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多