[OpenCVsharp]利用指针实现高速访问像素RGB值

先简单介绍下什么是OpenCVsharp,内容取自百度百科

OpenCvSharp是一个OpenCV的.Net wrapper,应用最新的OpenCV库开发,使用习惯比EmguCV更接近原始的OpenCV,有详细的使用样例供参考。该库采用LGPL发行,对商业应用友好。使用OpenCvSharp,可用C#,VB.NET等语言实现多种流行的图像处理(image processing)与计算机视觉(computer vision)算法。

 

下面进入正题:

 

代码实现目的: 通过获取像素值然后进行判断,最终对像素值进行更改。

先介绍个比较低速效率不高的方法

private void SearchAviColorYIQ(IplImage img)
{
    using (IplImage src = img.Clone())
    using (IplImage dst = new IplImage(src.Size, BitDepth.U8, 3))
    using (IplImage r = new IplImage(src.Size, BitDepth.U8, 1))
    using (IplImage g = new IplImage(src.Size, BitDepth.U8, 1))
    using (IplImage b = new IplImage(src.Size, BitDepth.U8, 1))
    {
        src.CvtColor(dst, ColorConversion.BgrToRgb);
        dst.Split(r, g, b, null);  //将图像分割成单独的R,G,B图形
 
        int dr, dg, db;//RGB
        double y, i, q;
        int h, w;
        for (h = 0; h < dst.Height; ++h)   //用for循环进行遍历
        {//270
            for (w = 0; w < dst.Width; ++w)
            {//360
                dr = (int)r[h, w].Val0;
                dg = (int)g[h, w].Val0;
                db = (int)b[h, w].Val0;
                //将RGB模式转换为YIQ模型,并只识别黄色
                y = (0.299 * dr) + (0.587 * dg) + (0.114 * db);
                i = (0.596 * dr) + ((-0.274) * dg) + ((-0.322) * db);
                q = (0.211 * dr) + ((-0.523) * dg) + (0.312 * db);
 
                if ((i >= 1) && (q < -4.0))
                {
                    dst[h, w] = CvColor.White;
                }
                else
                {
                    dst[h, w] = CvColor.Black;
                }
            }
        }
        pictureBoxIpl2.ImageIpl = dst;
    }
}

 

下面是用指针实现快速高效访问图片像素值

private void SearchBlockforYIQ(IplImage img)
{
    using (IplImage src = img.Clone())
    using (IplImage dst = new IplImage(src.Size, BitDepth.U8, 3))
    {
        src.CvtColor(dst, ColorConversion.BgrToRgb);//将bgr转为rgb
 
        int h, w;
        int index;
        double y, i, q;
 
        unsafe
        {
            byte* ptr = (byte*)dst.ImageData;
            byte r, g, b;
            for (h = 0; h < dst.Height; ++h)
            {//270
                for (w = 0; w < dst.Width; ++w)
                {//360
                    index = (dst.WidthStep * h) + (w * 3);
                    r = ptr[index];
                    g = ptr[index + 1];
                    b = ptr[index + 2];
 
                    y = (0.299 * r) + (0.587 * g) + (0.114 * b);
                    i = (0.596 * r) + ((-0.274) * g) + ((-0.322) * b);
                    q = (0.211 * r) + ((-0.523) * g) + (0.312 * b);
 
                    if ((i >= 1) && (q < -4.0))//检测黄色
                    {//变更为白色(白色的rgb值都是255)
                        ptr[index] = 255;
                        ptr[index + 1] = 255;
                        ptr[index + 2] = 255;
                    }
                    else
                    {//变更为黑色(黑色的RGB值都是0)
                        ptr[index] = 0;
                        ptr[index + 1] = 0;
                        ptr[index + 2] = 0;
                    }
                }
            }
        }
        pictureBoxIpl2.ImageIpl = dst;
    }
}

以上是全部代码,20~23行部分是核心部分。仅供参考!

 

PS: unsafe的使用方法

不知道的同学直接使用上述代码的话,在unsafe部分可能会提示出错,这时我们就要根据下面步骤来设置:

1. 右击项目选择属性

[OpenCVsharp]利用指针实现高速访问像素RGB值

2. 在生成的选项卡下将“允许不安全代码”前面的勾勾上。

[OpenCVsharp]利用指针实现高速访问像素RGB值

 

这样设置后就可以正常使用unsafe了。

转载请注明原处: http://www.harleygwak.com/?p=467

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: