C# 将颜色空间存储为EmguCV的变量

C# 将颜色空间存储为EmguCV的变量,c#,emgucv,C#,Emgucv,我试图为我的用户提供一个选项来切换检测是使用Bgr还是灰色空间进行优化 我看到这些选项的类型被称为“struct”,其名称空间为: Emgu.CV.Structure.Gray or Emgu.CV.Structure.Gray 这是我目前的检测代码,你可以看到它目前只是使用灰色选项 while (!found) { timeTaken = Stopwatch.StartNew(); window = new Image<Gray, byte>(WindowO

我试图为我的用户提供一个选项来切换检测是使用Bgr还是灰色空间进行优化

我看到这些选项的类型被称为“struct”,其名称空间为:

Emgu.CV.Structure.Gray

or

Emgu.CV.Structure.Gray
这是我目前的检测代码,你可以看到它目前只是使用灰色选项

while (!found)
{
    timeTaken = Stopwatch.StartNew();

    window = new Image<Gray, byte>(WindowOperations.TakeScreenshot(focusWindow));

    using (var result = window.MatchTemplate(detect, TemplateMatchingType.CcoeffNormed))
    {
        result.MinMax(out var minValues, out var maxValues, out var minLocations, out var maxLocations);

        if (!(maxValues[0] > watchmanData.Profile.SettingsProfile.AccuracyDecimal)) continue;

        found = true;
        timeTaken.Stop();
    }
}
while(!found)
{
所用时间=秒表.StartNew();
窗口=新图像(WindowOperations.TakeScreenshot(focusWindow));
使用(var result=window.MatchTemplate(detect,TemplateMatchingType.CcoeffNormed))
{
结果.MinMax(out-var-minValues、out-var-maxValues、out-var-minLocations、out-var-maxLocations);
如果(!(maxValues[0]>watchmanData.Profile.SettingsProfile.AccuracyCIMAL))继续;
发现=真;
耗时。停止();
}
}
理想情况下,我想要这样的东西(如果可能):

while(!found)
{
所用时间=秒表.StartNew();
色彩空间=用户选择;
窗口=新图像(WindowOperations.TakeScreenshot(focusWindow));
使用(var result=window.MatchTemplate(detect,TemplateMatchingType.CcoeffNormed))
{
结果.MinMax(out-var-minValues、out-var-maxValues、out-var-minLocations、out-var-maxLocations);
如果(!(maxValues[0]>watchmanData.Profile.SettingsProfile.AccuracyCIMAL))继续;
发现=真;
耗时。停止();
}
}
任何帮助都将不胜感激。

问题是c#不允许您以您想要的方式使用变量类型参数。但是,您可以将代码分成如下类型的方法:

        public void Process(bool useGray)
        {
            if (useGray)
            {
                DoStuff<Gray>(new Image<Gray, byte>(100, 100), new Image<Gray, byte>(10, 10));
            }
            else
            {
                DoStuff<Bgr>(new Image<Bgr, byte>(100, 100), new Image<Bgr, byte>(10, 10));
            }
        }

        public void DoStuff<TColor>(Image<TColor, byte> window, Image<TColor, byte> pattern)
            where TColor : struct, IColor
        {

            using (var result = window.MatchTemplate(pattern, TemplateMatchingType.CcoeffNormed))
            {
                result.MinMax(out var minValues, out var maxValues, out var minLocations, out var maxLocations);

                //... evaluate matching
            }
        }
公共作废流程(bool-useGray)
{
如果(使用灰色)
{
DoStuff(新图像(100100),新图像(10,10));
}
其他的
{
DoStuff(新图像(100100),新图像(10,10));
}
}
公共无效DoStuff(图像窗口、图像图案)
其中TColor:struct,IColor
{
使用(var result=window.MatchTemplate(pattern,TemplateMatchingType.ccoeffNormad))
{
结果.MinMax(out-var-minValues、out-var-maxValues、out-var-minLocations、out-var-maxLocations);
//…评估匹配
}
}
        public void Process(bool useGray)
        {
            if (useGray)
            {
                DoStuff<Gray>(new Image<Gray, byte>(100, 100), new Image<Gray, byte>(10, 10));
            }
            else
            {
                DoStuff<Bgr>(new Image<Bgr, byte>(100, 100), new Image<Bgr, byte>(10, 10));
            }
        }

        public void DoStuff<TColor>(Image<TColor, byte> window, Image<TColor, byte> pattern)
            where TColor : struct, IColor
        {

            using (var result = window.MatchTemplate(pattern, TemplateMatchingType.CcoeffNormed))
            {
                result.MinMax(out var minValues, out var maxValues, out var minLocations, out var maxLocations);

                //... evaluate matching
            }
        }