OpenCV中文网站

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 安装 配置
查看: 2068|回复: 1

Emgucv 干货系列之一:如何在Emgucv使用指针快速遍历图像

[复制链接]
发表于 2017-5-18 02:09:19 | 显示全部楼层 |阅读模式
emgucv使用索引速度之慢,都是有目共睹的,使用索引的方式写自定义的方法在效率上实不可取的。
楼主学习emgucv有半年左右。当初是从opencv转来的,对 Mat的数据结构有所了解 ,尝试写出了指针遍历Mat图像的函数模板。
大家使用这个模板可以写出自定义的处理函数,非常方便哦
直接见干货

   public void PtrProcess(Mat img)
   {
      ///要使用指针遍历需要预先知道Mat矩阵元素的类型,通常使用的是Cv8U(unchar) 在C#里面对应byte,其他类型的对应关系见DepthType的枚举注释
            if (img == null || img.IsEmpty || img.Depth != DepthType.Cv8U) throw new ArgumentException("img is unvalid!");
            int rows = img.Rows, cols = img.Cols, step = img.Step;
           
            unsafe
            {
                byte* dataptr = (byte*)img.DataPointer;
                ///单通道图像遍历方式
                if (img.NumberOfChannels == 1)
                {
                    for (int i = 0; i < rows; i++)
                    {
                        for (int j = 0; j < cols; j++)
                        {
                            int index = i * step + j;
                            ///get
                            byte getvalue = dataptr[index];
                            ///set
                            byte setvalue = 127;
                            dataptr[index] = setvalue;
                        }
                    }
                }
                ///多通道图像遍历方式,以BGR图像为例
                else
                {
                    int chns = img.NumberOfChannels;
                    for (int i = 0; i < rows; i++)
                    {
                        for (int j = 0; j < cols; j++)
                        {
                            ///B,G,R 顺序 c= 0,1,2;
                            for (int c = 0; c < chns; c++)
                            {
                                int index = i * step + j * chns + c;
                                ///get
                                byte getvalue = dataptr[index];
                                ///set
                                byte setvalue = 127;
                                dataptr[index] = setvalue;
                            }
                        }
                    }
                }
            }

        }
回复

使用道具 举报

发表于 2017-5-19 12:18:39 | 显示全部楼层
来学习。。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|OpenCV中文网站  

GMT+8, 2019-9-18 19:52 , Processed in 0.036390 second(s), 16 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表