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