OpenCV学习(一)基础篇 - ++C+C++

zhanghang-BadCoder 2021-11-14 原文


OpenCV学习(一)基础篇


OpenCV 2 计算机视觉编程手册读书笔记1

矩阵创建

  Mat类是OpenCV中非常有用类,用来创建和操作多维矩阵。可以有很多方法构造它。

 1 // 构造函数
 2 //! constructs 2D matrix of the specified size and type
 3 // (_type is CV_8UC1, CV_64FC3, CV_32SC(12) etc.)
 4 Mat(int rows, int cols, int type);
 5 Mat(Size size, int type);
 6 //! constucts 2D matrix and fills it with the specified value _s.
 7 Mat(int rows, int cols, int type, const Scalar& s);
 8 Mat(Size size, int type, const Scalar& s);
 9 
10 // 感兴趣区域,部分区域,子区块,新的矩阵和m共同使用内存
11 //! creates a matrix header for a part of the bigger matrix
12 Mat(const Mat& m, const Range& rowRange, const Range& colRange=Range::all());
13 Mat(const Mat& m, const Rect& roi);
14 Mat(const Mat& m, const Range* ranges);
15 
16 // create()函数
17 Mat mat(2, 2, CV_8UC3); //构造函数创建矩阵
18 M.create(3, 2, CV_8UC2); //释放内存重新创建
19 
20 // Matlab风格的创建方法
21 Mat zero = Mat::zeros(2, 3, CV_8UC1);
22 Mat one = Mat::ones(2, 3, CV32F);
23 Mat eye = Mat::eye(2, 3, CV_64F);

  其中 type参数的值CV_8UC3,表示的是CV_8U类型,3通道,CV_8U即无符号8为数据。3通道相当于BGR通道。

图像读取

cv::imread( const string& filename, int flags);

读取指定的图片,flags可以有以下的值:

enum
{
/* 8bit, color or not */
    CV_LOAD_IMAGE_UNCHANGED  =-1,
/* 8bit, gray */
    CV_LOAD_IMAGE_GRAYSCALE  =0,
/* ?, color */
    CV_LOAD_IMAGE_COLOR      =1,
/* any depth, ? */
    CV_LOAD_IMAGE_ANYDEPTH   =2,
/* ?, any color */
    CV_LOAD_IMAGE_ANYCOLOR   =4
};

图像显示

1 // 先命名一个窗口,再使用
2 namedWindow( "output", CV_WINDOW_AUTOSIZE );
3 imshow("input", img);

  窗口可以有以下Type:  

 1 enum
 2 {
 3     //These 3 flags are used by cvSet/GetWindowProperty
 4     CV_WND_PROP_FULLSCREEN = 0, //to change/get window\'s fullscreen property
 5     CV_WND_PROP_AUTOSIZE   = 1, //to change/get window\'s autosize property
 6     CV_WND_PROP_ASPECTRATIO= 2, //to change/get window\'s aspectratio property
 7     CV_WND_PROP_OPENGL     = 3, //to change/get window\'s opengl support
 8 
 9     //These 2 flags are used by cvNamedWindow and cvSet/GetWindowProperty
10     CV_WINDOW_NORMAL       = 0x00000000, //the user can resize the window (no constraint)  / also use to switch a fullscreen window to a normal size
11     CV_WINDOW_AUTOSIZE     = 0x00000001, //the user cannot resize the window, the size is constrainted by the image displayed
12     CV_WINDOW_OPENGL       = 0x00001000, //window with opengl support
13 
14     //Those flags are only for Qt
15     CV_GUI_EXPANDED         = 0x00000000, //status bar and tool bar
16     CV_GUI_NORMAL           = 0x00000010, //old fashious way
17 
18     //These 3 flags are used by cvNamedWindow and cvSet/GetWindowProperty
19     CV_WINDOW_FULLSCREEN   = 1,//change the window to fullscreen
20     CV_WINDOW_FREERATIO    = 0x00000100,//the image expends as much as it can (no ratio constraint)
21     CV_WINDOW_KEEPRATIO    = 0x00000000//the ration image is respected.
22 };

图像存储

1 cv::imrwite("output.jpg", imgOut);

 

图像像素操作

  at函数

 1 void salt(cv::Mat &image, int n)
 2 {
 3     for(int k =0; k<n; ++k)
 4     {
 5         int i=rand()%image.cols;
 6         int j=rand()%image.rows;
 7         if(image.channels() == 1) // gray image
 8         {
 9             image.at<uchar>(j, i) = 255;
10         }
11         else if(image.channels() == 3) // color image
12         {
13             image.at<cv::Vec3b>(j, i)[0] = 255;
14             image.at<cv::Vec3b>(j, i)[1] = 255;
15             image.at<cv::Vec3b>(j, i)[2] = 255;
16         }
17     }
18 }

  其中Vec3b的定义为:typedef Vec<uchar, 3> Vec3b。上述代码是在一个图片上随机产生盐点。

  迭代器

 1 cv::Mat Iterator_<cv::Vec3b> it;
 2 // 定义在Mat_内部的迭代器
 3 cv::Mat_<cv::Vec3b>::iterator it;
 4 
 5 // 迭代器使用
 6 void colorReduce(cv::Mat &image, int div=64)
 7 {
 8     // 得到初始位置的迭代器
 9     cv::Mat_<cv::Vec3b>::iterator it = image.begin<cv::Vec3b>();
10     // 得到种植位置的迭代器
11     cv::Mat_<cv::Vec3b>::iterator itend = image.edn<cv::Vec3b>();
12     // 遍历所有像素
13     for(; it!=itend; ++it)
14     {
15         // 处理每个像素
16         (*it)[0] = (*it)[0]/div*div+div/2;
17         (*it)[1] = (*it)[0]/div*div+div/2;
18         (*it)[2] = (*it)[0]/div*div+div/2;
19     }
20 }

  指针操作

// 得到image图像的第index行的首地址
image.ptr<uchar>(index);

 

图像算术运算

  图像的算术运算可以有加减乘除,可以对图片有亮度有影响,具体的后续再了解。

图像感兴趣区域

  图像感兴趣区域指的是,对一个图片的部分区域感兴趣,则可以只操作感兴趣的部分区域,也即子区域。

发表于
2017-09-25 18:31 
++C+C++ 
阅读(1021
评论(0
编辑 
收藏 
举报

 

版权声明:本文为zhanghang-BadCoder原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/zhanghang-BadCoder/p/7593273.html

OpenCV学习(一)基础篇 - ++C+C++的更多相关文章

  1. XE7 & IOS开发之开发账号(1):开发证书、AppID、设备、开发授权profile的申请使用,附Debug真机调试演示(XCode所有版本通用,有图有真相) – weii

    网上能找到的关于Delphi XE系列的移动开发的相关文章甚少,本文尽量以详细的图文内容、傻瓜式的表达来告诉你 […]...

  2. 快速删除XMind指定层级的方法 – camash

    快速删除XMind指定层级的方法 在使用xmind梳理知识点的时候,因为长期积累,单个文件的节点数可能超过10 […]...

  3. PC端体验效果最佳epub阅读器——iRead爱读书 – imsoft

    PC端体验效果最佳epub阅读器——iRead爱读书     官网:http://www.ireadhome. […]...

  4. 2018教程之mvc+ef + identity之七:角色权限系统菜单2菜单的全选择和写入

    一、在前台实现读出来并能全选。 1.后台httget方法 /// <summary> /// 菜单 […]...

  5. 1500多套微信小程序带后端源码-史上最全的不同行业的源码集合 – Java5206868

    1500多套微信小程序带后端源码-史上最全的不同行业的源码集合 微信小程序源码与模板 如何下载获取在最后面! […]...

  6. my live / PC keyboard / ThinkPad TrackPoint Keyboard II / KT-1525 / KU-1255 / KC-1957 / 4x30k12182 / FRU:5D50X49562 / Thinkpad Mluti Connect Bluttooth Keyboard with Trackpoint

    S ThinkPad TrackPoint Keyboard II  https://support.leno […]...

  7. centos8 常用命令 – su_hq

    centos8 常用命令 2020-09-13 15:06  su_hq  阅读(1157)  评论(0)  […]...

  8. 资源查找 – NJSEU

    资源查找 2016-08-10 12:21  NJSEU  阅读(273)  评论(0)  编辑  收藏  举 […]...

随机推荐

  1. 主成分分析入门 – 彭谨

    主成分分析入门 主成份分析: 主成份分析是最经典的基于线性分类的分类系统。这个分类系统的最大特点就是利用线性拟 […]...

  2. Spring Boot Admin简介及实践

    在若干年前的单体应用时代,我们可以相对轻松地对整个业务项目进行健康检查、指标监控、配置管理等等项目治理。如今随 […]...

  3. LAMP环境下,通过网页url获取gb2312编码中文命名的下载资源方法

    LAMP环境下,通过网页url获取gb2312编码中文命名的下载资源方法 最近有个功能, 要求获取中文命名的. […]...

  4. Mybatis用SQL做自连表查询

    1 需求 现在有一个菜单表,菜单里同时保存有一级菜单和二级菜单,一级菜单的父菜单id字段是null,二级菜单的 […]...

  5. jQuery练习总结(二)

    ———————— […]...

  6. 大厂程序员的一天是如何度过的?

    阅读本文大概需要 5 分钟。 小李是一位大公司里的程序员,虽然已经在公司上班一年了,但也只能算是个新人,毕竟 […]...

  7. RabbitMQ全网资料收集

    RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现 […]...

  8. 树形dp

      一.算法思想   树形dp就是在树上做dp   通常,我们采用dfs的方式遍历一个树   而这与dp的记忆 […]...

展开目录

目录导航