C# 在c语言中查找图像中的颜色#

C# 在c语言中查找图像中的颜色#,c#,image,image-processing,aforge,C#,Image,Image Processing,Aforge,我在这里偶然发现了这个youtube视频,它演示了某人使用AForge.NET框架进行颜色检测。我想复制作者所做的,但我不知道如何做一些图像处理 似乎AForge.NET框架允许您从视频源中提取位图格式的图像。我的问题是,是否有人能为我指明方向或提供一些指导,指导我如何查询位图对象以找到其中的特定颜色?(例如,如果图像中有“红色”或“紫色”持续X秒,我想引发一个事件“ColorDetected”左右…) 有人对从哪里开始有什么建议吗 谢谢 -R 编辑:我需要遍历整个位图对象并查询每个像素的颜色吗

我在这里偶然发现了这个youtube视频,它演示了某人使用AForge.NET框架进行颜色检测。我想复制作者所做的,但我不知道如何做一些图像处理

似乎AForge.NET框架允许您从视频源中提取位图格式的图像。我的问题是,是否有人能为我指明方向或提供一些指导,指导我如何查询位图对象以找到其中的特定颜色?(例如,如果图像中有“红色”或“紫色”持续X秒,我想引发一个事件“ColorDetected”左右…)

有人对从哪里开始有什么建议吗

谢谢

-R


编辑:我需要遍历整个位图对象并查询每个像素的颜色吗?就像这样:

好吧,您可以始终使用GDI+方法

Bitmap b = new Bitmap( "some path" );
Color x = b.GetPixel( x, y );
然而,GetPixel实际上相当慢。首先试试这种方法,但是如果你需要扫描很多相对较大的图像,它可能不适合你。在这种情况下,使用LockBits获取指向连续内存块的指针。然后,您可以快速遍历图像,但您必须知道如何操作指针,尽管这并不十分复杂

编辑:使用锁定位查看每个像素:

Bitmap b = new Bitmap( "some path" );
BitmapData data = b.LockBits( new Rectangle( 0, 0, b.Width, b.Height ),
ImageLockMode.ReadOnly, b.PixelFormat );  // make sure you check the pixel format as you will be looking directly at memory

unsafe
{         
    // example assumes 24bpp image.  You need to verify your pixel depth
    // loop by row for better data locality
    for( int y = 0; y < data.Height; ++y )
    {
        byte* pRow = (byte*)data.Scan0 + y * data.Stride;
        for( int x = 0; x < data.Width; ++x )
        {
            // windows stores images in BGR pixel order
            byte r = pRow[2];
            byte g = pRow[1];
            byte b = pRow[0];

            // next pixel in the row
            pRow += 3;
        }
    }
}

b.UnlockBits(data);
Bitmap b=新位图(“某些路径”);
BitmapData data=b.LockBits(新矩形(0,0,b.宽度,b.高度),
ImageLockMode.ReadOnly,b.PixelFormat);//确保检查像素格式,因为您将直接查看内存
不安全的
{         
//示例假设图像为24bpp。您需要验证像素深度
//逐行循环以获得更好的数据局部性
对于(int y=0;y

如果您的图像在末尾填充,您可以使用BitmapData.Stride属性到达每一行的开头(否则您将读取一些垃圾,并且偏移量将非常混乱)。

除了Ed Swangren使用
锁位的回答之外,您还可以避免所有指针。如果您正在使用WPF(或有权访问),可以执行以下操作:

var bitmap = new BitmapImage(uri);

//Pixel array
byte[] pixels = new byte[width * height * 4]; //account for stride if necessary

bitmap.CopyPixels(..size, pixels, fullStride, 0); 

现在,您可以使用
像素进行常规数组扫描,而无需使用指针。这段代码已经有几年的历史了,它来自一个项目,我在该项目中开发了自己的环境光解决方案,所以它可以非常快。同样,这已经有几年的历史了,因此像
WriteableBitmap
等新类可能会更好,并避免数组复制。在我最初的解决方案中,我使用指针,但当我发现不需要指针时,我就切换了。

谢谢你的提示;看来锁位法是最好的选择。你还有其他有用的指针吗?我使用的网络摄像头能够提供每秒30帧的速度;很明显,我要处理图像检测。有没有其他建议,你可能必须提高速度?当然,我可以提供一个例子。然而,从你的帖子中还不清楚你将如何使用它。您是要查看每张图像中的每个像素,还是一个小区域等?谢谢您的示例!我肯定会研究这个问题。您需要将它包装在
unsafe{}
中,或者在方法/类定义中添加
unsafe
关键字,然后在项目的属性中启用不安全代码。@nyrguds:Yep,will doYeah,我同意。从最简单的方法开始,做一些计时测试。如果可行,很好,如果不行,就换一种方法。我同意我应该先测量一下,看看哪种方法最有效。谢谢你们两位的提示。不客气:)我只是简化了一点代码,
BitmapImage
还有
.CopyPixels()
…嗨,我们能为EPS图像格式处理这个方法吗?@Nachiapanr这个答案已经过时了。我相信现在有更好的办法。