ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-02-25 15:04:42  阅读:297  来源: 互联网

标签:index src dst 像素 RGB OpenCVSharp using IplImage ptr


先简单介绍下什么是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了。

标签:index,src,dst,像素,RGB,OpenCVSharp,using,IplImage,ptr
来源: https://www.cnblogs.com/ybqjymy/p/15936080.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有