《OpenCV3编程入门》学习笔记四:初探core组件
2016-09-26 16:57
260 查看
一:内容介绍
本节主要介绍OpenCV的core模块基础部分:1. Mat类的用法,及OpenCV中其他常用的数据类型
2. 基本绘图操作
二:学习笔记
1.core模块
本章节开始介绍OpenCV的core模块http://docs.opencv.org/3.1.0/d0/de1/group__core.html ,重点讲了些Basic structures中的一小部分内容http://docs.opencv.org/3.1.0/dc/d84/group__core__basic.html。可以多看看,例如cv::Algorithm, cv::Point以后都很有用。2.关于Mat
mat数据内存中的存储方式,一张PPT解释。关于其读写,下面会给出一个例程。常用构造函数:
个人比较喜欢的用法:
Mat A(1000, 800, CV_8UC3,Scalar(0, 0, 255)); Mat F=A.clone(); Mat G; A.copyTo(G); Mat imageROI;//创建一个感兴趣区域(ROI),只需要创建包含边界信息的信息头 imageROI = A(Rect(800, 350, 100, 100)); Mat imageROI(A, Rect(800, 350, 100, 100)); Mat E=Mat::zeros(100, 100, CV_8UC1); M.create(4, 4, CV_8UC2);
Mat类深拷贝、浅拷贝。例如:clone()和copyTo()为深拷贝,而“=”和copy()即为浅拷贝(只创建信息头)
3. 其他数据类
OpenCV 中还有一些其他常见的数据类:Point, Scalar, Size, Rect。书中讲的都很好。本P100页“其他常用的知识点”,很实用。4. 本节函数清单
三:相关源码及解析
1. 基础图像容器Mat类的使用
源码:#include<opencv2/opencv.hpp> #include<iostream> #include<vector> using namespace cv; using namespace std; int main() { Mat I = Mat::eye(4, 4, CV_64F); I.at<double>(1, 1) = CV_PI; cout << "\nI = " << I << ";\n" << endl; Mat r = Mat(10, 3, CV_8UC3); randu(r, Scalar::all(0), Scalar::all(255)); cout << "r (OpenCV默认风格) = " << r << ";" << endl << endl; cout << "r (Python风格) = " << format(r, Formatter::FMT_PYTHON) << ";" << endl << endl; cout << "r (Numpy风格) = " << format(r, Formatter::FMT_NUMPY) << ";" << endl << endl; cout << "r (逗号分隔风格) = " << format(r, Formatter::FMT_CSV) << ";" << endl << endl; cout << "r (C语言风格) = " << format(r, Formatter::FMT_C) << ";" << endl << endl; Point2f p(6, 2); cout << " 【2维点】p = " << p << ";" << endl; Point3f p3f(8, 2, 0); cout << " 【3维点】p3f = " << p3f << ";" << endl; vector<float> v; v.push_back(3); v.push_back(5); v.push_back(7); cout << "【基于Mat的vector】shortvec = " << Mat(v) << ";" << endl; vector<Point2f> points(20); for (size_t i = 0; i < points.size(); i++) points[i] = Point2f((float)(i*5), (float)(i%7)); cout << "【二维点向量】points = " << points << ";"; waitKey(0); return 0; }
素材:
无
效果图:
无
提示:
无
2. Mat数据逐像素的读写
源码:#include <opencv2/opencv.hpp> using namespace cv; int writeGrayimByAt(Mat m); int writeGrayimByIt(Mat m); int writeColorimByAt(Mat m); int writeColorimByIt(Mat m); int main() { Mat grayim(128, 160, CV_8UC1, Scalar(0, 0, 255)); writeGrayimByAt(grayim); writeGrayimByIt(grayim); Mat colorim(128, 160, CV_8UC3, Scalar(0, 0, 255)); writeColorimByAt(colorim); writeColorimByIt(colorim); return 0; } int writeGrayimByAt(Mat m) { for (int i = 0; i < m.rows; i++) for (int j = 0; j < m.cols; j++) m.at<uchar>(i, j) = i; return 0; } int writeGrayimByIt(Mat m) { MatIterator_<uchar> grayit, grayend; int i = 0; for (grayit = m.begin<uchar>(), grayend = m.end<uchar>(); grayit != grayend; ++grayit, ++i) *grayit = i / m.cols; return 0; } int writeColorimByAt(Mat m) { for (int i = 0; i < m.rows; i++) for (int j = 0; j < m.cols; j++) { Vec3b pixel; pixel[0] = i; pixel[1] = j; pixel[2] = 255; m.at<Vec3b>(i, j) = pixel; } return 0; } int writeColorimByIt(Mat m) { MatIterator_<Vec3b> colorit, colorend; int i = 0; for (colorit = m.begin<Vec3b>(), colorend = m.end<Vec3b>(); colorit != colorend; ++colorit, ++i) { (*colorit)[0] = i / m.cols; (*colorit)[1] = i % m.cols; (*colorit)[2] = 255; } return 0; }
素材:
无
效果图:
无
提示:
无
3. 基本图像的绘制
源码:#include<opencv2/opencv.hpp> #include<vector> using namespace cv; using namespace std; #define WINDOW_NAME1 "【原子示例图】" #define WINDOW_NAME2 "【组合图】" #define WINDOW_WIDTH 600 //定义窗口大小的宏 vector<Point> rookPoints = { Point(1 * WINDOW_WIDTH / 4, 7 * WINDOW_WIDTH / 8), Point(3 * WINDOW_WIDTH / 4, 7 * WINDOW_WIDTH / 8), Point(3 * WINDOW_WIDTH / 4, 13 * WINDOW_WIDTH / 16), Point(11 * WINDOW_WIDTH / 16, 13 * WINDOW_WIDTH / 16), Point(19 * WINDOW_WIDTH / 32, 3 * WINDOW_WIDTH / 8), Point(3 * WINDOW_WIDTH / 4, 3 * WINDOW_WIDTH / 8), Point(3 * WINDOW_WIDTH / 4, 1 * WINDOW_WIDTH / 8), Point(26 * WINDOW_WIDTH / 40, 1 * WINDOW_WIDTH / 8), Point(26 * WINDOW_WIDTH / 40, 1 * WINDOW_WIDTH / 4), Point(22 * WINDOW_WIDTH / 40, 1 * WINDOW_WIDTH / 4), Point(22 * WINDOW_WIDTH / 40, 1 * WINDOW_WIDTH / 8), Point(18 * WINDOW_WIDTH / 40, 1 * WINDOW_WIDTH / 8), Point(18 * WINDOW_WIDTH / 40, 1 * WINDOW_WIDTH / 4), Point(14 * WINDOW_WIDTH / 40, 1 * WINDOW_WIDTH / 4), Point(14 * WINDOW_WIDTH / 40, 1 * WINDOW_WIDTH / 8), Point(1 * WINDOW_WIDTH / 4, 1 * WINDOW_WIDTH / 8), Point(1 * WINDOW_WIDTH / 4, 3 * WINDOW_WIDTH / 8), Point(13 * WINDOW_WIDTH / 32, 3 * WINDOW_WIDTH / 8), Point(5 * WINDOW_WIDTH / 16, 13 * WINDOW_WIDTH / 16), Point(1 * WINDOW_WIDTH / 4, 13 * WINDOW_WIDTH / 16), }; int main() { Mat atomImage = Mat::zeros(WINDOW_WIDTH, WINDOW_WIDTH, CV_8UC3); Mat rookImage = Mat::zeros(WINDOW_WIDTH, WINDOW_WIDTH, CV_8UC3); ellipse(atomImage,Point(WINDOW_WIDTH/2, WINDOW_WIDTH/2), Size(WINDOW_WIDTH/4, WINDOW_WIDTH/16), 90, 0, 360, Scalar(255, 129, 0), 2); ellipse(atomImage, Point(WINDOW_WIDTH / 2, WINDOW_WIDTH / 2), Size(WINDOW_WIDTH / 4, WINDOW_WIDTH / 16), 0, 0, 360, Scalar(255, 129, 0), 2); ellipse(atomImage, Point(WINDOW_WIDTH / 2, WINDOW_WIDTH / 2), Size(WINDOW_WIDTH / 4, WINDOW_WIDTH / 16), 45, 0, 360, Scalar(255, 129, 0), 2); ellipse(atomImage, Point(WINDOW_WIDTH / 2, WINDOW_WIDTH / 2), Size(WINDOW_WIDTH / 4, WINDOW_WIDTH / 16), -45, 0, 360, Scalar(255, 129, 0), 2); circle(atomImage, Point(WINDOW_WIDTH / 2, WINDOW_WIDTH / 2), WINDOW_WIDTH / 32, Scalar(0, 0, 255), -1); vector<vector<Point> > rp = { rookPoints }; //注意,必须将其再加一层vector fillPoly(rookImage, rp, Scalar(255, 255, 255)); rectangle(rookImage, Point(0, 7*WINDOW_WIDTH/8), Point(WINDOW_WIDTH, WINDOW_WIDTH), Scalar(0, 255, 255), -1); line(rookImage, Point(0, 15*WINDOW_WIDTH/16), Point(WINDOW_WIDTH, 15*WINDOW_WIDTH/16), Scalar(0, 0, 0), 2); line(rookImage, Point(1 * WINDOW_WIDTH / 4, 7 * WINDOW_WIDTH / 8), Point(WINDOW_WIDTH/4, WINDOW_WIDTH), Scalar(0, 0, 0), 2); line(rookImage, Point(1 * WINDOW_WIDTH / 2, 7 * WINDOW_WIDTH / 8), Point(WINDOW_WIDTH/2, WINDOW_WIDTH), Scalar(0, 0, 0), 2); line(rookImage, Point(3 * WINDOW_WIDTH / 4, 7 * WINDOW_WIDTH / 8), Point(3*WINDOW_WIDTH/4, WINDOW_WIDTH), Scalar(0, 0, 0), 2); imshow(WINDOW_NAME1, atomImage); moveWindow(WINDOW_NAME1, 0, 200); imshow(WINDOW_NAME2, rookImage); moveWindow(WINDOW_NAME2, WINDOW_WIDTH, 200); waitKey(0); return 0; }
素材:
无
效果图:
略
提示:
无
相关文章推荐
- 《OpenCV3编程入门》第五章core组件进阶学习笔记part2
- 《OpenCV3编程入门》学习笔记五:core组件进阶
- OpenCV3编程入门-读书笔记2-core组件
- 《Core Java Volume I》学习笔记之命令行方式开发java程序
- 《OpenCV3编程入门》学习笔记番外篇之目标跟踪object tracking
- OpenGL2 CoreImage初探与Model封装
- [WebKit] JavaScriptCore解析--基础篇(二)解释器基础与JSC核心组件
- Asp.Net core 视图组件ViewComponent
- 五.Core组件进阶(4.ROI区域图像混合)
- Python wxPython库Core组件BoxSizer用法示例
- [转]asp.net core视图组件(ViewComponent)简单使用
- Android 桌面组件【widget】初探
- oslo.config组件初探
- 关于音频播放的那点儿事儿(一) 初探iOS音频 CoreAudio Essentials
- ASP.NET Core MVC之ViewComponents(视图组件)知多少?
- 五.Core组件进阶(1.颜色空间缩减)
- 学习笔记:Android基本组件之Activity
- ASP.NET AJAX客户端编程之旅(四)——以组件的思想开发Ajax应用:客户端组件初探
- 【C# Office】 未能找到引用的组件"Microsoft.Office.Core" 解决方案
- Android 桌面组件【widget】初探