先简单介绍下什么是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. 右击项目选择属性

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

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

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

[OpenCVsharp]利用指针实现高速访问像素RGB值的更多相关文章

  1. opencv学习笔记(九)Mat 访问图像像素的值

    对图像的像素进行访问,可以实现空间增强,反色,大部分图像特效系列都是基于像素操作的.图像容器Mat是一个矩阵的形式,一般情况下是二维的.单通道灰度图一般存放的是<uchar>类型,其数据存 ...

  2. GDI+ 读取jpg图片每个像素的值

    // 读取jpg图像像素rgb值.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #in ...

  3. C++利用指针突破私有成员访问限制

    C++ 面向对象的一大特性就是封装,使用不同的访问控制符来控制外接对其的访问权限.比如: 1 class A 2 { 3 public: 4 A(): i(10){} 5 void print(){ ...

  4. OpenCV学习笔记(三) 访问像素

    转自:OpenCV如何扫描图像.利用查找表和计时 测试代码:opencv\samples\cpp\tutorial_code\core\how_to_scan_images 测试函数耗时 cv::ge ...

  5. opencv2中访问像素的简单方法-自定义一个宏CV_MAT_ELEM2

    利用Mat的step[0],step[1]访问像素的行列,自定义一个宏CV_MAT_ELEM2(src,dtype,y,x),src是待访问的Mat,dtype是src的数据类型(int,float, ...

  6. 利用指针突破C++编译器的防线

    C++ 面向对象的一大特性就是封装,使用不同的访问控制符来控制外接对其的访问权限.比如: class A { public: A(): i(){} void print(){ cout << ...

  7. OpenCV——颜色缩减、计时函数、访问像素

    //颜色空间缩减 //src:源图片 //dst:目标图片 //divideWith:缩减宽度 void ColorSpaceReduction(Mat src,int divideWith,Mat& ...

  8. OpenCV探索之路(十七):Mat和IplImage访问像素的方法总结

    在opencv的编程中,遍历访问图像元素是经常遇到的操作,掌握其方法非常重要,无论是Mat类的像素访问,还是IplImage结构体的访问的方法,都必须扎实掌握,毕竟,图像处理本质上就是对像素的各种操作 ...

  9. OpenCV(图像处理)—访问像素的三种方法

    方法一:用指针访问像素 #include <opencv2/opencv.hpp> #include <opencv2/core/core.hpp> #include < ...

随机推荐

  1. git之一

    1.Git是什么Git是一款免费.开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. Git是一个开源的分布式版本控制系统,用以有效.高速的处理从很小到非常大的项目版本管理.Git 是 ...

  2. Java类型擦除机制

    Java泛型是JDK 5引入的一个特性,它允许我们定义类和接口的时候使用参数类型,泛型在集合框架中被广泛使用.类型擦除是泛型中最让人困惑的部分,本篇文章将阐明什么是类型擦除,以及如何使用它. 一个常见 ...

  3. 十五天精通WCF——第十三天 用WCF来玩Rest

    在我们玩wcf的时候,都会潜意识的觉得wcf就是通过soap协议交换消息的,并且可以在basic,tcp,msmq等等绑定中任意切换, 牛逼的一塌糊涂,但是呢,如果说哪一天wcf不再使用soap协议, ...

  4. 编写Java应用程序。首先,定义一个时钟类——Clock,它包括三个int型 成员变量分别表示时、分、秒,一个构造方法用于对三个成员变量(时、分、秒) 进行初始化,还有一个成员方法show()用于显示时钟对象的时间。其次,再定义 一个主类——TestClass,在主类的main方法中创建多个时钟类的对象,使用这 些对象调用方法show()来显示时钟的时间。

    package com.hanqi.test; public class Clock { int hh; int mm; int ss; String time; Clock(int h,int m, ...

  5. storm实战:基于storm,kafka,mysql的实时统计系统

    公司对客户开放多个系统,运营人员想要了解客户使用各个系统的情况,在此之前,数据平台团队已经建设好了统一的Kafka消息通道. 为了保证架构能够满足业务可能的扩张后的性能要求,选用storm来处理各个应 ...

  6. SQL Server 2008 R2——分组取前几名

    =================================版权声明================================= 版权声明:本文为博主原创文章 未经许可不得转载  请通过右 ...

  7. 烂泥:nginx同时支持asp.net与php

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. 经过两天的实验,终于让nginx同时支持asp.net与php了.下面就把具体的配置过程记录如下. 注意:本次实验OS:centos6 64bit. 尽 ...

  8. android RelativeLayout 动态设置高度

    定义: private RelativeLayout mrlay; 调高度: mrlay = (RelativeLayout) findViewById(R.id.rlay_1); android.v ...

  9. mysql禁用autocommit,以及遇到的问题

    原文地址:http://blog.51yip.com/mysql/1230.html http://blog.csdn.net/ying_593254979/article/details/12095 ...

  10. 在Eclipse里查看Java字节码

    要理解 Java 字节码,比较推荐的方法是自己尝试编写源码对照字节码学习.其中阅读 Java 字节码的工具必不可少.虽然javap可以以可读的形式展示出.class 文件中字节码,但每次改动源码都需调 ...