在C#中找到图像中的颜色
c#
image
image-processing
7
0

我在http://www.youtube.com/watch?v=Ha5LficiSJM上偶然发现了这个youtube视频,该视频演示了有人使用AForge.NET框架进行颜色检测。我想重复作者所做的事情,但是不确定如何进行图像处理。

看来AForge.NET框架允许您从视频源中以位图格式提取图像。我的问题是,有人能指出我的方向或提供一些关于如何查询位图对象以在其中找到特定颜色的指导吗? (例如-如果图像中X秒钟出现“红色”或“紫色”,我想引发一个事件“ ColorDetected”等等)

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

谢谢,

-R

编辑:我是否需要遍历整个Bitmap对象并询问颜色的每个像素?像这样: http : //msdn.microsoft.com/en-us/library/system.drawing.bitmap.getpixel.aspx

参考资料:
Stack Overflow
收藏
评论
共 2 个回答
高赞 时间 活跃

除了Ed Swangren对LockBits的回答LockBits您还可以避免一起使用指针。如果您正在使用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); 

现在,您可以使用没有指针的pixels进行常规的阵列扫描。该片段已有几年历史,是我开发自己的AmbiLight解决方案的一个项目而来的,因此它的速度非常快。同样,这已经有几年历史了,因此像WriteableBitmap这样的新类可能会更好,并且避免使用数组复制。在最初的解决方案中,我使用了指针,但是当我发现没有必要时,我进行了切换。

收藏
评论

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

Bitmap b = new Bitmap( "some path" );
Color x = b.GetPixel( x, y );

但是,GetPixel实际上非常慢。首先尝试这种方式,但是如果您需要扫描许多相对较大的图像,则可能不适合您。在这种情况下,请使用LockBits获取指向连续内存块的指针。然后,您可以快速遍历图像,但是尽管并不十分复杂,但是您必须知道如何操作指针。

编辑:使用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);

如果在末尾填充图像,则可以使用BitmapData.Stride属性到达每个新行的开头(否则,您将看到一些垃圾,并且偏移量很奇怪)。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号