• OpenCVSharp 利用指针实现高速访问像素RGB值


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

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

    下面进入正题:

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

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

     1 private void SearchAviColorYIQ(IplImage img)
     2 {
     3     using (IplImage src = img.Clone())
     4     using (IplImage dst = new IplImage(src.Size, BitDepth.U8, 3))
     5     using (IplImage r = new IplImage(src.Size, BitDepth.U8, 1))
     6     using (IplImage g = new IplImage(src.Size, BitDepth.U8, 1))
     7     using (IplImage b = new IplImage(src.Size, BitDepth.U8, 1))
     8     {
     9         src.CvtColor(dst, ColorConversion.BgrToRgb);
    10         dst.Split(r, g, b, null);  //将图像分割成单独的R,G,B图形
    11  
    12         int dr, dg, db;//RGB
    13         double y, i, q;
    14         int h, w;
    15         for (h = 0; h < dst.Height; ++h)   //用for循环进行遍历
    16         {//270
    17             for (w = 0; w < dst.Width; ++w)
    18             {//360
    19                 dr = (int)r[h, w].Val0;
    20                 dg = (int)g[h, w].Val0;
    21                 db = (int)b[h, w].Val0;
    22                 //将RGB模式转换为YIQ模型,并只识别黄色
    23                 y = (0.299 * dr) + (0.587 * dg) + (0.114 * db);
    24                 i = (0.596 * dr) + ((-0.274) * dg) + ((-0.322) * db);
    25                 q = (0.211 * dr) + ((-0.523) * dg) + (0.312 * db);
    26  
    27                 if ((i >= 1) && (q < -4.0))
    28                 {
    29                     dst[h, w] = CvColor.White;
    30                 }
    31                 else
    32                 {
    33                     dst[h, w] = CvColor.Black;
    34                 }
    35             }
    36         }
    37         pictureBoxIpl2.ImageIpl = dst;
    38     }
    39 }

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

     1 private void SearchBlockforYIQ(IplImage img)
     2 {
     3     using (IplImage src = img.Clone())
     4     using (IplImage dst = new IplImage(src.Size, BitDepth.U8, 3))
     5     {
     6         src.CvtColor(dst, ColorConversion.BgrToRgb);//将bgr转为rgb
     7  
     8         int h, w;
     9         int index;
    10         double y, i, q;
    11  
    12         unsafe
    13         {
    14             byte* ptr = (byte*)dst.ImageData;
    15             byte r, g, b;
    16             for (h = 0; h < dst.Height; ++h)
    17             {//270
    18                 for (w = 0; w < dst.Width; ++w)
    19                 {//360
    20                     index = (dst.WidthStep * h) + (w * 3);
    21                     r = ptr[index];
    22                     g = ptr[index + 1];
    23                     b = ptr[index + 2];
    24  
    25                     y = (0.299 * r) + (0.587 * g) + (0.114 * b);
    26                     i = (0.596 * r) + ((-0.274) * g) + ((-0.322) * b);
    27                     q = (0.211 * r) + ((-0.523) * g) + (0.312 * b);
    28  
    29                     if ((i >= 1) && (q < -4.0))//检测黄色
    30                     {//变更为白色(白色的rgb值都是255)
    31                         ptr[index] = 255;
    32                         ptr[index + 1] = 255;
    33                         ptr[index + 2] = 255;
    34                     }
    35                     else
    36                     {//变更为黑色(黑色的RGB值都是0)
    37                         ptr[index] = 0;
    38                         ptr[index + 1] = 0;
    39                         ptr[index + 2] = 0;
    40                     }
    41                 }
    42             }
    43         }
    44         pictureBoxIpl2.ImageIpl = dst;
    45     }
    46 }

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

    PS: unsafe的使用方法

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

    1. 右击项目选择属性

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

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

  • 相关阅读:
    virturalbox安装CentOS桥接网卡
    解决:Error:java: 无效的源发行版: 12
    maven下载失败,镜像配置,idea的maven下载配置
    linux压缩和解压缩命令
    Unable to allocate 130176KB bitmaps for parallel garbage collection for the requested 4165632KB heap.
    Docker,Linux,Kubernetes,postgres常用的命令行(持续更新)
    dropwizard问题记录1:如何进行mvn package打包,如何在项目目录下运行
    线程的并发工具类
    学信网改绑手机号码,但是忘记了老号码怎么办?利用node.js + puppeteer 跑脚本实现改绑手机号
    javascript事件循环与js执行机制
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/15936080.html
Copyright © 2020-2023  润新知