[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. 右击项目选择属性

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

这样设置后就可以正常使用unsafe了。
转载请注明原处: http://www.harleygwak.com/?p=467
[OpenCVsharp]利用指针实现高速访问像素RGB值的更多相关文章
- opencv学习笔记(九)Mat 访问图像像素的值
对图像的像素进行访问,可以实现空间增强,反色,大部分图像特效系列都是基于像素操作的.图像容器Mat是一个矩阵的形式,一般情况下是二维的.单通道灰度图一般存放的是<uchar>类型,其数据存 ...
- GDI+ 读取jpg图片每个像素的值
// 读取jpg图像像素rgb值.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #in ...
- C++利用指针突破私有成员访问限制
C++ 面向对象的一大特性就是封装,使用不同的访问控制符来控制外接对其的访问权限.比如: 1 class A 2 { 3 public: 4 A(): i(10){} 5 void print(){ ...
- OpenCV学习笔记(三) 访问像素
转自:OpenCV如何扫描图像.利用查找表和计时 测试代码:opencv\samples\cpp\tutorial_code\core\how_to_scan_images 测试函数耗时 cv::ge ...
- opencv2中访问像素的简单方法-自定义一个宏CV_MAT_ELEM2
利用Mat的step[0],step[1]访问像素的行列,自定义一个宏CV_MAT_ELEM2(src,dtype,y,x),src是待访问的Mat,dtype是src的数据类型(int,float, ...
- 利用指针突破C++编译器的防线
C++ 面向对象的一大特性就是封装,使用不同的访问控制符来控制外接对其的访问权限.比如: class A { public: A(): i(){} void print(){ cout << ...
- OpenCV——颜色缩减、计时函数、访问像素
//颜色空间缩减 //src:源图片 //dst:目标图片 //divideWith:缩减宽度 void ColorSpaceReduction(Mat src,int divideWith,Mat& ...
- OpenCV探索之路(十七):Mat和IplImage访问像素的方法总结
在opencv的编程中,遍历访问图像元素是经常遇到的操作,掌握其方法非常重要,无论是Mat类的像素访问,还是IplImage结构体的访问的方法,都必须扎实掌握,毕竟,图像处理本质上就是对像素的各种操作 ...
- OpenCV(图像处理)—访问像素的三种方法
方法一:用指针访问像素 #include <opencv2/opencv.hpp> #include <opencv2/core/core.hpp> #include < ...
随机推荐
- 7 个顶级的 HTML5 Canvas 动画赏析
HTML5确实是一项改革浏览器乃至整个软件行业的新技术,它可以帮助我们Web开发者很方便地在网页上实现动画特效,而无需臃肿的Flash作为支撑.本文分享7个顶级的HTML5 Canvas 动画,都有非 ...
- PHP 取前一天或后一天、一个月时间
//获得当前时间 //date()格式化时间返回String类型. date("Y-m-d H:i:s") $current_date = date(’Y-m-d’ ...
- 使用C/C++,赋值运算时发生的转换
使用C/C++,赋值运算时发生的转换主要有以下四种情况 一: 两边类型不同: 结果: 自动完成类型转换! 二: 长数赋给短数: 结果: 截取长数的低位送给短数! 三: 短数赋给长数: 结果: 原来是什 ...
- 烂泥:apache虚拟主机的学习与应用
本文由秀依林枫提供友情赞助,首发于烂泥行天下. 要配置apache的虚拟主机,我们需要分以下几步进行: 1. 检查apache虚拟主机模块 2. 开启apache虚拟主机功能 3. httpd-vho ...
- Google Cloud Platform
一个离我们很遥远,很遥远的公司.作为全球三大公有云厂商之一,在国内根本听不到他的声音.其实吧,听到了也没用,因为在国内没法用!AWS还在纠结的落地过程中挣扎,GCP基本上就当不存在吧. 抛开这些乌烟瘴 ...
- linux tar命令简介
一.使用介绍 1.名词区分 打包:将一大堆文件或目录变成一个总的文件[tar命令] 压缩:将一个大的文件通过一些压缩算法变成一个小文件[gzip,bzip2等] Linux中很多压缩程序只能针对一个文 ...
- 微信公众平台C# SDK:Senparc.Weixin.MP.dll
https://github.com/Senparc/WeiXinMPSDK [转] http://www.cnblogs.com/szw/archive/2013/01/13/senparc-wei ...
- 150923-碎觉要-PHP,Linux
今天懒懒的,还是每天都懒懒的. 早上下午都没有更.还好还有晚上更的想法和行动. 总结如下 1.PHP --wamp的一点配置问题,把根文件改为自己所要的文件夹.改动Apache的配置文件以及更改wam ...
- [Copy]Bird's booklist
Copy from Bird Thanks! Here is his website: Bird's book list 0x01 编程语言 Python基础教程(第2版) Effective Jav ...
- CF 676B Pyramid of Glasses[模拟]
B. Pyramid of Glasses time limit per test 1 second memory limit per test 256 megabytes input standar ...