代码环境:Visual studio2017和Anaconda;
参考书籍:张平《OpenCV算法精解》;
编程语言:Python和C++;
Python3基础学习:Python3基础
C++基础学习:C++基础



1.构造多通道Mat对象

// 6.构造多通道Mat对象
// 构造一个由n个rows×cols二维浮点型矩阵组成的三维矩阵;
// 语法:Mat(int rows,int cols,CV_32FC(n))
#include <opencv2/core/core.hpp>
#include <iostream>
using namespace std;
using namespace cv;int main(int argc,char *argv[]) {// 6.构造多通道Mat对象Mat array1 = (Mat_<Vec3f>(2, 2) << Vec3f(1, 2, 3), Vec3f(4, 5, 6), Vec3f(1, 3, 5), Vec3f(2, 4, 6));cout << "多通道Mat对象:\n" << array1 << endl;return 0;
}

2.访问多通道Mat对象中的值

// 7.访问多通道Mat对象中的值
// 7.1 利用成员函数at
// 利用成员函数at访问多通道Mat的元素值,可以将多通道Mat看作一个特殊的二维数组,每一个位置上不是一个数值,而是一个向量;
#include <opencv2/core/core.hpp>
#include <iostream>
using namespace std;
using namespace cv;int main(int argc,char *argv[]) {// 7.1 利用成员函数at访问多通道MatMat array1 = (Mat_<Vec3f>(2, 2) << Vec3f(1, 2, 3), Vec3f(4, 5, 6), Vec3f(1, 3, 5), Vec3f(2, 4, 6));for (int r = 0; r < array1.rows; r++) {for (int c = 0; c < array1.cols; c++) {cout << array1.at<Vec3f>(r, c) << ","; // 打印第r行第c列的元素值;}cout << endl;}return 0;
}
// 7.2 利用成员函数ptr
// 成员函数ptr可以返回指向指定行的第一个元素的指针(不是第一个数值)
#include <opencv2/core/core.hpp>
#include <iostream>
using namespace std;
using namespace cv;int main(int argc,char *argv[]) {// 7.2 利用成员函数ptr访问多通道MatMat array1 = (Mat_<Vec3f>(2, 2) << Vec3f(1, 2, 3), Vec3f(4, 5, 6), Vec3f(1, 3, 5), Vec3f(2, 4, 6));for (int r = 0; r < array1.rows; r++) {Vec3f* ptr = array1.ptr<Vec3f>(r);          // 每行首元素的地址;for (int c = 0; c < array1.cols; c++) {cout << ptr[c] << ",";}cout << endl;}return 0;
}
// 7.3 利用成员函数isContinous和ptr访问多通道的值
#include <opencv2/core/core.hpp>
#include <iostream>
using namespace std;
using namespace cv;int main(int argc,char *argv[]) {// 7.3 利用成员函数isContinous和ptr访问多通道MatMat array1 = (Mat_<Vec3f>(2, 2) << Vec3f(1, 2, 3), Vec3f(4, 5, 6), Vec3f(1, 3, 5), Vec3f(2, 4, 6));if (array1.isContinuous()){Vec3f *ptr = array1.ptr<Vec3f>(0);        // 指向多通道矩阵的第一个元素的指针;for (int n = 0; n < array1.rows*array1.cols; n++) {cout << ptr[n] << endl;}}return 0;
}
// 7.4 利用成员变量和step访问
#include <opencv2/core/core.hpp>
#include <iostream>
using namespace std;
using namespace cv;int main(int argc,char *argv[]) {// 7.4 利用成员函数data和step访问多通道MatMat array1 = (Mat_<Vec3f>(2, 2) << Vec3f(1, 2, 3), Vec3f(4, 5, 6), Vec3f(1, 3, 5), Vec3f(2, 4, 6));for (int r = 0; r < array1.rows; r++) {for (int c = 0; c < array1.cols; c++) {Vec3f *ptr = (Vec3f*)(array1.data + r * array1.step[0] + c * array1.step[1]);        // 得到指向每个元素的指针;cout << *ptr << ",";        // 打印元素}}return 0;
}
// 7.5 分离通道
// 分离通道:将所有向量的第一个值组成的单通道矩阵作为第一通道,将所有向量的第二元素组成的单通道矩阵作为第二通道,依此类推;
#include <opencv2/core/core.hpp>
#include <iostream>
using namespace std;
using namespace cv;int main(int argc,char *argv[]) {// 7.5 分离通道Mat array1 = (Mat_<Vec3f>(2, 2) << Vec3f(1, 2, 3), Vec3f(4, 5, 6), Vec3f(1, 3, 5), Vec3f(2, 4, 6));vector<Mat> planes;split(array1, planes);cout << "原来的矩阵:\n" << array1 << endl;cout << "第一通道:\n" << planes[0] << endl;cout << "第二通道:\n" << planes[1] << endl;cout << "第三通道:\n" << planes[2] << endl;return 0;
}
// 7.6 合并通道
#include <opencv2/core/core.hpp>
#include <iostream>
using namespace std;
using namespace cv;int main(int argc,char *argv[]) {// 7.6 合并通道// Mat array1 = (Mat_<Vec3f>(2, 2) << Vec3f(1, 2, 3), Vec3f(4, 5, 6), Vec3f(1, 3, 5), Vec3f(2, 4, 6));// 单通道数据Mat plane0 = (Mat_<int>(2, 2) << 1, 2, 3, 4);Mat plane1 = (Mat_<int>(2, 2) << 5, 6, 7, 8);Mat plane2 = (Mat_<int>(2, 2) << 1, 3, 5, 7);Mat plane[] = { plane0,plane1,plane2 };        // 初始化一个数组;Mat mat1;merge(plane, 3, mat1);cout << "plane0:\n" << plane0 << endl;cout << "plane1:\n" << plane1 << endl;cout << "plane2:\n" << plane2 << endl;cout << "合并通道后:\n" << mat1 << endl;// 将单通道矩阵依次放入vector容器中vector<Mat> planeTank;planeTank.push_back(plane0);planeTank.push_back(plane1);planeTank.push_back(plane2);Mat mat2;merge(planeTank, mat2);cout << "把单通道矩阵放入vector容器中:\n" << mat2 << endl;return 0;
}

3.获得Mat中某一区域的值

// 8.获得Mat中某一区域的值
// 8.1 使用成员函数row(i)或col(j)得到矩阵的第i行或第j列;
#include <opencv2/core/core.hpp>
#include <iostream>
using namespace std;
using namespace cv;int main(int argc,char *argv[]) {// 8.1 使用成员函数row(i)或col(j)获得矩阵的第i行或第j列Mat array1 = (Mat_<Vec3f>(2, 2) << Vec3f(1, 2, 3), Vec3f(4, 5, 6), Vec3f(1, 3, 5), Vec3f(2, 4, 6));int r = 1;int c = 1;Mat arrayRow = array1.row(r);  // 矩阵第r行;Mat arrayCol = array1.col(c);  // 矩阵第c列;cout << "矩阵内容:\n" << array1 << endl;cout << "矩阵第1行:\n" << arrayRow << endl;cout << "矩阵第1列:\n" << arrayCol << endl;return 0;
}
// 8.2 使用成员函数rowRange或colRange得到矩阵的连续行或连续列
// 成员函数row、col、rowRange、colRange返回的矩阵指向原矩阵,如果改变原矩阵的值,会跟着改变;
#include <opencv2/core/core.hpp>
#include <iostream>
using namespace std;
using namespace cv;int main(int argc,char *argv[]) {/*构造一个5×5的矩阵:1   2  3  4  56   7  8  9 1011 12 13 14 15 16 17 18 19 2021 22 23 24 25*/Mat matrix = (Mat_<int>(5, 5) << 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25);cout << "matrix矩阵内容:\n" << matrix << endl;cout << "-----------------------------" << endl;Mat r_range = matrix.rowRange(Range(2, 4));       // 访问matrix第2、3行,Range:左闭右开;for (int r = 0; r < r_range.rows; r++) {for (int c = 0; c < r_range.cols; c++) {cout << r_range.at<int>(r, c) << ",";}cout << endl;}return 0;
}
// 8.3 成员函数clone和copyTo
// clone和copyTo用于将矩阵克隆或复制一份;
#include <opencv2/core/core.hpp>
#include <iostream>
using namespace std;
using namespace cv;int main(int argc,char *argv[]) {/*构造一个5×5的矩阵:1   2  3  4  56   7  8  9 1011 12 13 14 15 16 17 18 19 2021 22 23 24 25*/Mat matrix = (Mat_<int>(5, 5) << 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25);cout << "原矩阵的内容:\n" << matrix << endl;cout << "---------------------------" << endl;// 使用clone成员函数和copyTo成员函数Mat r_range1 = matrix.rowRange(2, 4).clone();Mat r_range2;matrix.rowRange(2, 4).copyTo(r_range2);cout << "r_range1的内容:\n" << r_range1 << endl;cout << "r_range2的内容:\n" << r_range2 << endl;cout << "---------------------------" << endl;// 改变r_range1和r_range2某个值;r_range1.at<int>(0, 0) = 584;r_range2.at<int>(0, 0) = 584;cout << "r_range1的内容:\n" << r_range1 << endl;cout << "r_range2的内容:\n" << r_range2 << endl;cout << "---------------------------" << endl;cout << "matrix内容:\n" << matrix << endl;return 0;
}
// 8.4 使用Rect类
/*
构造函数:Rect(int_x,int_y,int_width,int_height);
int_x:左上角x坐标;
int_y:左上角y坐标;
int_width:宽度;
int_height:高度;
*/
#include <opencv2/core/core.hpp>
#include <iostream>
using namespace std;
using namespace cv;int main(int argc,char *argv[]) {/*构造一个5×5的矩阵:1   2  3  4  56   7  8  9 1011 12 13 14 15 16 17 18 19 2021 22 23 24 25*/Mat matrix = (Mat_<int>(5, 5) << 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25);cout << "原矩阵的内容:\n" << matrix << endl;cout << "---------------------------" << endl;// 使用Rect类Mat roi1 = matrix(Rect(Point(2, 1), Point(4, 3)));    // 左上角坐标,右下角坐标;Mat roi2 = matrix(Rect(2, 1, 2, 2));  // x,y,宽度,高度;Mat roi3 = matrix(Rect(Point(2, 1), Size(2, 2)));  // 左上角坐标,尺寸;cout << "roi1:\n" << roi1 << endl;cout << "roi2:\n" << roi2 << endl;cout << "roi3:\n" << roi3 << endl;return 0;
}

OpenCV算法精解2--OpenCV中C++基本操作2相关推荐

  1. JVM内存管理------GC算法精解(五分钟教你终极算法---分代搜集算法)

    转载自   JVM内存管理------GC算法精解(五分钟教你终极算法---分代搜集算法) 引言 何为终极算法? 其实就是现在的JVM采用的算法,并非真正的终极.说不定若干年以后,还会有新的终极算法, ...

  2. JVM内存管理------GC算法精解(五分钟让你彻底明白标记/清除算法)

    转载自  JVM内存管理------GC算法精解(五分钟让你彻底明白标记/清除算法) 相信不少猿友看到标题就认为LZ是标题党了,不过既然您已经被LZ忽悠进来了,那就好好的享受一顿算法大餐吧.不过LZ丑 ...

  3. JVM内存管理------GC算法精解(复制算法与标记/整理算法)

    转载自  JVM内存管理------GC算法精解(复制算法与标记/整理算法) 本次LZ和各位分享GC最后两种算法,复制算法以及标记/整理算法.上一章在讲解标记/清除算法时已经提到过,这两种算法都是在此 ...

  4. 资料 | O‘Reilly精品图书系列:算法精解 C 语言描述 (简体中文)

    下载地址:资料 | O'Reilly精品图书系列:算法精解 C 语言描述 (简体中文) 内容简介 · · · · · · 本书是数据结构和算法领域的经典之作,十余年来,畅销不衰! 全书共分为三部分:第 ...

  5. opencv python书籍_OpenCV算法精解:基于Python与C++

    目录 1 OpenCV入门 1.1 初识OpenCV 1.1.1 OpenCV的模块简介 1.1.2 OpenCV 2.4.13与3.2版本的区别 1.2 部署OpenCV 1.2.1 在Visual ...

  6. 算法精解 c语言描述 豆瓣,斯坦福大学教授亲授,这本美亚4.7星的算法书,新手程序员都看得懂!...

    原标题:斯坦福大学教授亲授,这本美亚4.7星的算法书,新手程序员都看得懂! "算法会扩展并提高大家的编程技巧,而学习基本的算法设计范式,可以和许多不同领域的不同问题密切相关,还能作为预测算法 ...

  7. 算法精解一(C语言版)

    最近无事  抽出点时间来整理一下算法  希望对自己有进一步的帮助和对学习算法的同行有一些帮助吧! 讲到算法  这个词是很重一个解决问题的途径 无论在什么行业 算法都是很重要的. 不管你是否承认,无论哪 ...

  8. 算法精解:DAG有向无环图

    DAG是公认的下一代区块链的标志.本文从算法基础去研究分析DAG算法,以及它是如何运用到区块链中,解决了当前区块链的哪些问题. 关键字:DAG,有向无环图,算法,背包,深度优先搜索,栈,BlockCh ...

  9. java标志清理_JVM内存管理之GC算法精解(五分钟让你彻底明白标记/清除算法)...

    相信不少猿友看到标题就认为LZ是标题党了,不过既然您已经被LZ忽悠进来了,那就好好的享受一顿算法大餐吧.不过LZ丑话说前面哦,这篇文章应该能让各位彻底理解标记/清除算法,不过倘若各位猿友不能在五分钟内 ...

  10. JVM内存管理–GC算法精解(五分钟让你彻底明白标记/清除算法)

    相信不少猿友看到标题就认为LZ是标题党了,不过既然您已经被LZ忽悠进来了,那就好好的享受一顿算法大餐吧.不过LZ丑话说前面哦,这篇文章应该能让各位彻底理解标记/清除算法,不过倘若各位猿友不能在五分钟内 ...

最新文章

  1. eclipse中提交git总是要求输入用户名、密码
  2. php 桥接 微信80端口,解决MAC系统在做微信开发时候tomcat无法使用80端口问题
  3. PostgreSQL 10.1 手册_部分 III. 服务器管理_第 16 章 从源代码安装_16.5. 安装后设置...
  4. 一篇来自前端同学对后端接口的吐槽
  5. iphone闪退修复工具_升级 iOS 14.2 微信闪退?iPhone 12 维修贵
  6. android能用svg格式,Android加载html中svg格式图片进行显示
  7. 软件测试面试题小结(一)
  8. python中if brthon环境安装包_python-debian/test.deb.uu at master · romlok/python-debian · GitHub...
  9. 关于cesm中寻找浮力频率N的记录
  10. 解决方案:集团型施工企业安全生产数字化管理系统
  11. Spring MVC 地址请求映射
  12. 数据结构与算法--散列表
  13. 这又是一则招聘贴——招聘区块链系统开发的同学
  14. python爬取资料怎么样_手把手教你Python爬取新房数据
  15. MySql存储IP地址(兼容ipv4和ipv6)
  16. Linux安装Elasticsearch详细教程
  17. SaaS、CRM、OA、ERP、HR、进销存究竟是什么?
  18. 【Unity3D基础2-13】Unity3D UI系统之UGUI
  19. word文章中参考文献编号统一更新方法
  20. 12306订票助手,春运抢票之必备良品,圆你回家梦

热门文章

  1. Xmind 2022中文高效学习思维导图
  2. 普林斯顿微积分读本 大纲与重点 (by zzd)
  3. PreferenceActivity使用简介
  4. 图解:如何修改CSDN账号昵称?
  5. 计算机窗体视频教程,计算机二级Access2010视频教程
  6. 模拟CMOS集成电路设计学习笔记(一)
  7. java parser .java_JDK的Parser来解析Java源代码详解
  8. oracle数据库例题答案下载,Oracle数据库试题及答案[教学知识]
  9. 《网管员世界》记者走基层采访实录
  10. 犀牛6.0grasshopper翻译插件_Rhino 6.0犀牛三维建模 软件下载安装包教程(附下载方法)...