opencv数据结构与基本绘图
#include <opencv2\core\core.hpp>//核心组件
#include <opencv2\opencv.hpp>//GUI,包含媒体输入输出,视频捕捉、图形交互界面的接口等
#include <opencv2\highgui\highgui.hpp>//图像上处理
using namespace std;
using namespace cv;
图像容器Mat
不必再手动开辟空间;
不必再不需要时立即将空间释放。
Mat是一个类,有两个数据部分组成:矩阵头(矩阵尺寸,存储方法、存储地址等)和一个指向存储所有像素值得矩阵的指针。
opencv使用了引用计数机制,每个Mat对象有自己的信息头,共享一个矩阵。这通过让矩阵指向同一地址而实现。
拷贝构造函数值复制信息头和矩阵指针,不复制矩阵。
#include <opencv2\core\core.hpp>//核心组件
#include <opencv2\opencv.hpp>//GUI,包含媒体输入输出,视频捕捉、图形交互界面的接口等
#include <opencv2\highgui\highgui.hpp>//图像上处理
using namespace std;
using namespace cv; int main(int argc, char** argv){//int argc, char* argv[]
Mat A, C;//仅创建信息头部分
A = imread("test.jpg");//为矩阵开辟内存空间
Mat B(A);//使用拷贝构造函数
C = A;//赋值运算符
}
创建ROI,只需要创建包含边界信息的信息头:
Mat D(A, Rect(, , , ));//使用矩形界定
Mat E = A(Range::all(), Range(, ));//使用行和列界定
复制矩阵本身,使用clone()函数或copyTo函数:
Mat F = A.clone();
Mat G;
A.copyTo(G);
创建Mat对象
Mat运算符<<只对二维矩阵有效。
方法一:Mat()构造函数
Mat M(, , CV_8UC3, Scalar(, , ));
cout << "M=" << endl << M << endl;
(1)2行2列;
(2)存储元素的数据类型及每个矩阵点的通道数;CV_8UC3表示使用8位的unsigned char型,每个像素由三个元素组成三通道。预先定义的通道数可以多达四个。
CV_[位数][带符号与否][类型前缀]C[通道数],大部分设备都是用无符号8位整数CV_8U表示像素亮度。
如果需要更多通道数,可以把通道数放在小括号内,如:Mat M(3,2,CV_8UC(5)),通道数为5
(3)Scalar是个short型向量,指定值初始化矩阵,还可以用于表示颜色。
BGR:(0,0,255)表示全红
输出:

方法二:在C\C++中通过构造函数进行初始化
int main(int argc, char** argv){//int argc, char* argv[]
int sz[] = { , , };//每个维度的尺寸
Mat L(, sz, CV_8UC, Scalar::all());
system("PAUSE");
return EXIT_SUCCESS;
}
方法三:为已存在的IPlIMAGE指针创建信息头
IPlImage* img = cvLoadImage("1.jpg",);
Mat mtx(img);//转换IPlImage* -> Mat
方法四:Create()函数
M.create(,,CV_8UC());
若create函数指定的参数与之前的参数相同,则不进行实质的内存申请,否则就申请。
方法五:Matlab形式
Mat E = Mat::eye(,,CV_64F);//单位阵
Mat O = Mat::ones(,,CV_32F);//全1矩阵
Mat Z = Mat::zeros(,3CV_8UC1);//0矩阵
方法六:对小矩阵使用逗号分隔式初始化函数
Mat C = (Mat_<double>(,) << ,-,,-,,-,,-,);
cout << C << endl;

方法七:为已存在的对象创新信息头
clone函数和copyTo函数。
int main(int argc, char** argv){//int argc, char* argv[]
Mat C = (Mat_<double>(, ) << , -, , -, , -, , -, );
Mat rowclone = C.row().clone();//把C的第一行赋值给了rowclone这个新的
system("PAUSE");
return EXIT_SUCCESS;
}
格式化输出方法
Mat r = Mat(,,CV_8UC3);
randu(r,Scalar::all(), Scalar::all());//randu产生随机值填充矩阵,给定上下限 cout << r << endl;//opencv默认风格 cout << foramt(r,Formatter::FMT_PYTHON) << endl;//python cout << format(r,Formatter::FMT_CSV) << endl;//逗号分隔风格 cout << format(r,Formatter::FMT_NUMPY) << endl;//numpy风格 cout << format(r,Formatter::FMT_FMT_C) << endl;//c风格
常用数据结构
点:Point类
Point point;
point.x = ;
point.y = ; //方法二
Point point = Point(,);
Point_<int> == Point2i == Point
Point_<float> == Point2f
颜色表示:Scalar类
Scalar表示具有4个元素的数组,BGR,如果用不到第四个参数,就不需要写出来。
Scalar(a,b,c)
尺寸:Size类
Size(width, height);
矩形:Rect类
Rect rect = Rect(x,y,width,height);//左上角点坐标,宽,高 rect.Size();//返回size
rect.area();//返回矩形面积
rect.contains(Point);//判断点是否在矩形内
rect.inside(Rect);//判断矩形是否在该矩形内 Rect newrect1 = rect1 & rect2;//交集
Rect newrect2 = rect1 | rect2;//并集 Rect newrect3 = rect + point;//平移操作
Rect newrect4 = rect + size;//放缩操作
颜色空间转换:cvtColor函数
void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=);
(1)输入图像;
(2)输出图像
(3)颜色空间转换标识符;
(4)目标图像通道数,默认值0,0表示目标图像取源图像的通道数;
opencv3中的COLOR_式的宏命名前缀取代了opencv2的CV_。
opencv数据结构与基本绘图的更多相关文章
- opencv 2 Opencv数据结构与基本绘图
基础图像容器Mat Mat 是一个类,又两个数据部分组成:矩阵头(包含矩阵尺寸,存储方法,存储地址等信息)和一个指向存储所有像素值的矩阵(根据所选存储方法不同,矩阵可以是不同的维数)的指针.矩阵头的尺 ...
- Opencv实现的简易绘图工具
第一次写博,还是个菜鸟.最近开始学习Opencv,试着写了个简易的绘图工具(目前只写了画线和橡皮擦部分,画其它图形还有待往里添加),也算是记录自己的学习之路. #include "stdaf ...
- opencv数据结构总结
OpenCV里面用到了很多图像相关的数据结构,熟练掌握它们是学习图像的基础. 1.IplImage IplImage IplImage IPL 图像头 typedef struct _IplImage ...
- opencv数据结构-MAT结构详解
1.定义 OpenCV中的C结构体有 CvMat 和 CvMatND,但后续的应用中指出 CvMat 和 CvMatND 弃用了,在C++封装中用 Mat 代替,另外旧版还有一个 IplImage,同 ...
- OpenCV学习笔记(四十)——再谈OpenCV数据结构Mat详解
原文:http://blog.csdn.net/yang_xian521/article/details/7107786 我记得开始接触OpenCV就是因为一个算法里面需要2维动态数组,那时候看cor ...
- Opencv step by step - 绘图
有时候我们需要在图像上写一些字或者画一些简单的几何图案. 祭上代码: #include <cv.h> #include <highgui.h> int main(int arg ...
- OpenCV数据结构:CvMat,IplImage,CvArr的应用
最近看HS算法时,发现在新的OpenCV3.0已经移除了该算法,于是不得不看老版的.这其中涉及到了CvMat,CvArr,IplImage的使用.关于这三个结构与Mat的转换关系,总结如下: (1)派 ...
- OpenCV编程入门目录
第一部分 快速上手OpenCV 第1 章 邂逅OpenCV 图像处理.计算机视觉与OpenCV OpenCV 概述 起源及发展 应用概述 .2OpenCV 基本架构分析 .3OpenCV3 带来了什么 ...
- 小强学Python+OpenCV之-1.3绘图
目标 今天的课程比较轻松,我们来学习一下OpenCV中几个绘图函数: cv2.line cv2.rectangle cv2.circle 画直线 直接经过前面两节的内容.我想直接上代码应该是可以接受的 ...
随机推荐
- 如何用Android studio生成正式签名的APK文件
必须签名之后才可以发布到app商店中. 平时的调试的app都有默认的签名. 下面是生成带签名的APK的步骤: 1. Build 选择 Generate Signed APK 2. 弹出框,第一次选择C ...
- ThinkPHP新建控制器
ThinkPHP新建控制器 一.效果图 二.步骤 1.新建控制器文件 2.编写控制器文件 3.访问控制器 三.注意事项
- 日常问题记录-- java.lang.IllegalArgumentException: taglib definition not consistent with specification version
转自:https://www.cnblogs.com/carterzhang/p/4288650.html 背景: tomcat8.0中使用taglib 错误表现: java.lang.Illegal ...
- 滚动监听 after选择器
一.如何实现滚动到一定位置将内容固定在页面顶部 window.onscroll=function(){ //滚动的距离,距离顶部的距离 var topScroll =document.body.scr ...
- 转:IE 无法使用 js trim() 的解决方法
http://hi.baidu.com/yuiezt/item/756d0f4ec4d2640ec11613f9 var aa = $("#id").val().trim() ...
- NEC芯片特别说明
NEC芯片注意点: 1.堆栈和RAM共用,而且是程序中自定义堆栈的空间,堆栈是向下递减堆栈. 2.中断中标志位的清除可以不用手动清除,在中断服务程序中运行任何一条指令后自动清除. 3.中断服务程序有且 ...
- Windows7下Thingworx 7安装
1.环境准备 Windows7 64位+JDK8+Tomcat8+PostgreSQL9 2.安装JDK8和Tomcat8 这里没有什么太多值得叙述的,基本都是一路下一步. 需要注意的是,一个是Tom ...
- 快速沃尔什变换(FWT)笔记
开头Orz hy,Orz yrx 部分转载自hy的博客 快速沃尔什变换,可以快速计算两个多项式的位运算卷积(即and,or和xor) 问题模型如下: 给出两个多项式$A(x)$,$B(x)$,求$C( ...
- vue.js的<slot>
使用插槽分发内容在封装vue组件的时候,很多时候就不得不使用到vue的一个内置组件<slot>.slot是插槽的意思,顾名思义,这个<slot>组件的意义是预留一个区域,让其中 ...
- 【转】 C#学习笔记14——Trace、Debug和TraceSource的使用以及日志设计
[转] C#学习笔记14——Trace.Debug和TraceSource的使用以及日志设计 Trace.Debug和TraceSource的使用以及日志设计 .NET Framework 命名空 ...