Emgu 学习(4) 使用指针访问图像内存
在原始图像最初的10行绘制一个颜色条

class Program
{
static void Main(String[] args)
{
Mat img = CvInvoke.Imread(@"C:\Users\dell\Pictures\mach.jpg"); CvInvoke.Imshow("draw", img);
Mat dst = img.Clone();
int row = img.Rows;
int col = img.Cols * img.NumberOfChannels;
Console.WriteLine("DepthType is " + dst.Depth+"and elementSize is"+dst.ElementSize); for (int i = ; i < ; i++)
for (int j = ; j < img.Cols;j++)
{
SetAtB(dst, i, j, );
SetAtG(dst, i, j, );
SetAtR(dst, i, j, ); } CvInvoke.Imshow("hello", dst);
CvInvoke.WaitKey(); }
private static IntPtr GetAt(Mat mat,int row,int col)
{
return mat.DataPointer + (row * mat.Cols + col) * mat.ElementSize;
}
private static void SetAtB(Mat mat, int row, int col, byte value)
{
Marshal.Copy(new byte[] { value }, , GetAt(mat, row, col), );
}
private static void SetAtG(Mat mat, int row, int col, byte value)
{
Marshal.Copy(new byte[] { value }, , GetAt(mat, row, col)+, );
}
private static void SetAtR(Mat mat, int row, int col, byte value)
{
Marshal.Copy(new byte[] { value }, , GetAt(mat, row, col)+, );
}
}
类似要求C++的两种处理方法
方法1
#include <opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std; void main(){
//动态地址访问
Mat img=imread("E://green.png");
imshow("src",img);
Mat dst=img.clone();
int rowNumber=img.rows;//获取行数
int colNumber=img.cols;//获取列数
for(int i=;i<rowNumber;i++){
for (int j = ; j <colNumber; j++)
{
dst.at<Vec3b>(i,j)[]=;//蓝色通道
dst.at<Vec3b>(i,j)[]=;//绿色通道
dst.at<Vec3b>(i,j)[]=;//红色通道
//dst.at<uchar>(i,j)=255;//灰度图像
}
}
imshow("dst",dst);
waitKey();
}
方法2:
#include <opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std; void main(){
Mat img=imread("E://green.png");
imshow("src",img);
Mat dst=img.clone();
int rowNumber=img.rows;//获取行数
int colNumber=img.cols*img.channels();//列数×通道数=每一行的元素个数
for(int i=;i<rowNumber;i++){
uchar* data=dst.ptr<uchar>(i);//获取每一行首地址,ptr函数可以得到图像任意行的首地址
for (int j = ; j <colNumber; j++)
{
//data[j]=255;//灰度图
switch (j%)
{
case ://蓝色通道
data[j]=;
break;
case ://绿色通道
data[j]=;
break;
case ://红色通道
data[j]=;
break;
}
}
}
imshow("dst",dst);
waitKey();
}
另外一种方法https://stackoverflow.com/questions/32255440/how-can-i-get-and-set-pixel-values-of-an-emgucv-mat-image
Emgu 学习(4) 使用指针访问图像内存的更多相关文章
- 【opencv学习笔记七】访问图像中的像素与图像亮度对比度调整
今天我们来看一下如何访问图像的像素,以及如何改变图像的亮度与对比度. 在之前我们先来看一下图像矩阵数据的排列方式.我们以一个简单的矩阵来说明: 对单通道图像排列如下: 对于双通道图像排列如下: 那么对 ...
- Emgu学习之(四)——图像阈值
http://www.cnblogs.com/CoverCat/p/5043833.html Visual Studio Community 2015 工程和代码:http://pan.baidu.c ...
- Emgu学习之(二)——图像读取、显示、保存
visual Studio Community 2015 工程和源代码:http://pan.baidu.com/s/1o6u5Fdw 内容 在这篇文章中将提到以下内容: 从文件中读取图像 Image ...
- Emgu学习之(三)——操作图像数据
Visual Studio Community 2015 工程和代码:http://pan.baidu.com/s/1jHmlQeE 内容 在这篇文章中将提到以下内容: 修改像素值 图像ROI 图像加 ...
- opencv学习笔记(八)IplImage* 访问图像像素的值
opencv2.1版本之前使用IplImage*数据结构来表示图像,2.1之后的版本使用图像容器Mat来存储.IplImage结构体如下所示. typedef struct _IplImage { i ...
- opencv学习之路(7)、访问图像像素
一.动态地址访问 #include <opencv2/opencv.hpp> #include<iostream> using namespace cv; using name ...
- C++学习 之 指针及动态内存分配(笔记)
1. 指针 1.1 指针的含义: 简单来说,指针是存储内存地址的变量.当我们声明了一个指针变量后,使用该指针时系统会根据指针内的地址索引内存块,读取内存内的值.指针因为是用来存地址的,所以一般固定长度 ...
- js学习之变量、作用域和内存问题
js学习之变量.作用域和内存问题 标签(空格分隔): javascript 变量 1.基本类型和引用类型: 基本类型值:Undefined, Null, Boolean, Number, String ...
- 访问图像中的像素[OpenCV 笔记16]
再更一发好久没更过的OpenCV,不过其实写到这个部分对计算机视觉算法有所了解的应该可以做到用什么查什么了,所以后面可能会更的慢一点吧,既然开了新坑,还是机器学习更有研究价值吧... 图像在内存中的存 ...
随机推荐
- 08 saltstack生产实例-apahce+php+redis
1.apache+php 前几章的LAMP:https://www.cnblogs.com/venicid/p/11276232.html#_label2 Php放在apache 1.目录结构 2.p ...
- ip 转发(调度器的路由转发)
临时开启 [root@proxy ~]# echo > /proc/sys/net/ipv4/ip_forward 永久开启 [root@proxy ~]# vim /etc/sysctl.co ...
- maven的概念-02
1.仓库 仓库分为两类: 1) 本地仓库 ->当前电脑上的maven仓库: 本地仓库的默认目录: ${user.home}/.m2/repository ...
- 微信小程序开发入门教程(一)---hello world
由于无法备案网站,前期做了个微信小程序(开发版)就搁置了,几乎忘了开发过程.现在重新梳理,做个记录. 一.最基本的小程序前端例子hello 1.下载安装 微信开发者工具 官网: https://d ...
- 交换机配置——单交换机划分VLAN配置
一.实验目的:实现单交换机划分VLAN,使PC1主机和PC2主机不能通讯 二.拓扑图 三.实验步骤 最开始两台主机都输入的端口f0/1和f0/2都属于vlan 1 可以相互通讯(如下图) 现在需要让P ...
- Unity3D面试问题
注意,是问题,不是笔试题哦.这些是我最近面试北京各公司总结的一些被问到的还算典型的问题.跟大家分享一下.答案是我自己的,不保证标准和完整. 哎,公司年底开人,又校招一群便宜的小鬼……桑死心了……好在找 ...
- 深入理解 Java 线程池
一.简介 什么是线程池 线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务. 为什么要用线程池 如果并发请求数量很多,但每个线程执行的时间很短,就会出现频繁的创建 ...
- fiddler(四)、断点(转)
前言 先给大家讲一则小故事,在我们很小的时候是没有手机的,那时候跟女神聊天都靠小纸条.某屌丝A男对隔壁小王的隔壁女神C倾慕已久,于是天天小纸条骚扰,无奈中间隔着一个小王,这样小王就负责传小纸条了.有一 ...
- 也谈Tcp/Ip协议
一. 计算机网络体系结构分层 一图看完本文 计算机网络体系结构分层 计算机网络体系结构分层 不难看出,TCP/IP 与 OSI 在分层模块上稍有区别.OSI 参考模型注重“通信协议必要的功能是什么”, ...
- 消息模板-RabbitTemplate
RabbitTemplate是我们在与SpringAMQP整合的时候进行发送消息的关键类该类提供了丰富的发送消息的方法,包括可靠性消息投递.回调监听消息接口ConfirmCallback.返回值确认接 ...