开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 20646|回复: 3
收起左侧

[C#图文教程] OpenCvSharp的学习之旅 lesson02----WhatIsMat

[复制链接]
发表于 2019-8-30 13:46:08 | 显示全部楼层 |阅读模式   重庆市重庆市
本帖最后由 qingshanlushui 于 2019-8-30 17:01 编辑

一/mat对象概述


1.mat 对象继承了 IDisposable 接口,可以直接用using 语句。//在lesson01中我们并没有使用using或Dispose是不严谨的....
      2.mat 对象的构造函数有16个。//注意需要指针载入图像的时候要加unsafe
      3.mat 在C++ 中是一个矩阵变量,但是在 C#中是一个对象,只能 new
      4.mat 对象的使用过程中可能有一些函数的命名习惯更像c++,但实际的操作还是要遵循c#...
      本套学习心得,虽不是什么高瞻远瞩,但依旧禁止任何形式的转载or复制(含非商业),如需任何形式的转载or复制,还请论坛留言通知我一下下....



二/加载图片的方式之一

                using (Mat zx61 = new Mat("./data/test.jpg", ImreadModes.AnyColor)) {
                //上一行代码可以用 Mat zx61 =Cv2.ImRead("./data/test.jpg", ImreadModes.AnyColor); 代替
                using (new Window("zx61", WindowMode.AutoSize, zx61)) //新建一个窗口显示图片
                {
                    Cv2.WaitKey(); //等待用户按键
                }
            }

加载模式,常用的有:全色彩和灰阶图..框框所示


201.png

三/自定义一张图片

            Scalar s = new Scalar(0, 0, 255);//创建一个颜色对象
            using (Mat zx6161 = new Mat(100, 100, MatType.CV_32FC3, s))//行,列,矩阵数据类型(深度和通道数),图像颜色
            {
                using (new Window("zx6161", WindowMode.AutoSize, zx6161))
                {
                    Cv2.WaitKey();//等待用户按键
                }
            }

运行结果:

202.png

四/创建一个已知图像一样大小和类型的纯黑色图片

            using (var zx61 = new Mat("./data/test.jpg", ImreadModes.AnyColor ))
            using (var zx6161 = new Mat(zx61.Size(), zx61.Type(), Scalar.All(0)))//大小,类型,颜色
            {
                //zx6161.Create();//此处伏笔,可以用来复制/合成图像等操作
                //using (new Window("zx61", WindowMode.AutoSize, zx61))
                Cv2.ImShow("zx61", zx61);//和上一行代码一个意思
                using (new Window("zx6161", WindowMode.AutoSize, zx6161))
                {
                    Cv2.WaitKey();
                }
            }


五/输出一个Mat对象的所有像素值

        /// <summary>
        /// 输出一个Mat对象的所有像素值
        /// tip:执行过程非常快但是 WriteLine 比较耗时....所以你感觉得慢是假象...
        /// </summary>
        /// <param name="path"></param>
        public static void getpixel1(string path)
        {
            Mat zx61 = new Mat(path, ImreadModes.AnyColor | ImreadModes.AnyDepth);

            for (int i = 0; i < zx61.Height; i++)
            {
                for (int j = 0; j < zx61.Width; j++)
                {
                    Vec3b color = zx61.Get<Vec3b>(i, j); //new Vec3b(); 颜色通道类型(字节的三元组) ,直接视同Get泛型方法返回指定类型

                    //单独获取指定通道像素
                    //color.Item0= zx61.Get<Vec3b>(i, j).Item0;  //R
                    //color.Item1 = zx61.Get<Vec3b>(i, j).Item1; //G
                    //color.Item2 = zx61.Get<Vec3b>(i, j).Item2; //B
                    Console.WriteLine(color.Item0 + "," + color.Item1 + "," + color.Item2);
                }

            }
            Console.WriteLine($"图像高度:{zx61.Height}");
            Console.WriteLine($"图像宽度:{zx61.Width}");
            using (new Window("zx61", WindowMode.AutoSize, zx61))
            {
                Cv2.WaitKey();
            }

        }


运行结果:
203.png

六/使用指针获取一个像素值和图像的行列值

        unsafe static void Main(string[] args)
        {
             getpixel2("./data/test.jpg");
        }

        /// <summary>
        /// 使用指针获取一个像素值和图像的行列值
        /// 操作指针要加 unsafe
        /// 调用他的所有函数,包括Main函数都要加 unsafe
        /// </summary>
        unsafe public static void getpixel2(string path)
        {
            Mat zx61 = new Mat(path, ImreadModes.AnyColor);
            Mat zx6161 = new Mat();
            zx61.CopyTo(zx6161);  //拷贝

            Console.WriteLine($"拷贝前后颜色通道比较:{ zx61.Channels()== zx6161.Channels()}"); //拷贝前后颜色通道比较

            int row = zx6161.Rows; //行
            int clo = zx6161.Cols; //列
            Console.WriteLine($"Rows :{row} ;Cols :{clo}");

            //像素总数行*列
            //指针获取值(根据下标),第一个像素值
            IntPtr c = zx6161.Ptr(0); //Mat对象的 Ptr方法:返回指向指定矩阵行的指针。
            byte* c1 = (byte*)c; //像素值在C#中是byte类型 ,在C++中是 uchar类型
            byte* c100 = (byte*)zx6161.Ptr(99);
            Console.WriteLine($"第1个像素值:{*c1}");
            Console.WriteLine($"第100个像素值:{*c100}");

            using (new Window("Create", WindowMode.AutoSize, zx6161))
            using (new Window("InputImage", WindowMode.AutoSize, zx6161))
            {
                Cv2.WaitKey();
            }
        }


运行结果:
205.png

其中unsafe可能会提示不能编译...需要进行以下操作:
选中项目右键----属性---生成----允许不安全代码---如图所示:


204.png

有缘lesson03见


本套学习心得,虽不是什么高瞻远瞩,但依旧禁止任何形式的转载or复制(含非商业),如需任何形式的转载or复制,还请论坛留言通知我一下下....

评分

参与人数 1好评 +1 精币 +33 收起 理由
老郭 + 1 + 33 感谢发布原创作品,精易因你更精彩!

查看全部评分

发表于 2019-10-14 10:25:36 | 显示全部楼层   香港特别行政区九龙城区
楼主,可以加个QQ交流下么?我的1622364183,谢谢啦~
回复 支持 反对

使用道具 举报

结帖率:60% (12/20)
发表于 2019-8-31 10:35:34 | 显示全部楼层   湖南省长沙市

有缘lesson03再见.......
回复 支持 反对

使用道具 举报

发表于 2019-8-30 15:20:15 | 显示全部楼层   广东省深圳市
谢谢分享,来看看
回复 支持 反对

使用道具 举报

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

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 诚聘英才| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 800073686,邮箱:800073686@b.qq.com
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

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