Mat_类
Mat_类是对 Mat 类的一个包装,其定义如下:
template<typename _Tp> class Mat_ : public Mat
{
public:
//只定义了几个方法
//没有定义新的属性
};
这是一个非常轻量级的包装, 既然已经有 Mat 类, 为何还要定义一个 Mat_?
下面我们看这段代码:
Mat M(600, 800, CV_8UC1);
for( int i = 0; i < M.rows; ++i)
{
uchar * p = M.ptr<uchar>(i);
for( int j = 0; j < M.cols; ++j )
{
double d1 = (double) ((i+j)%255);
M.at<uchar>(i,j) = d1;
double d2 = M.at<double>(i,j);//此行有错
}
}
在读取矩阵元素时,以及获取矩阵某行的地址时,需要指定数据类型。这样首先需要不停地写“<uchar>” ,让人感觉很繁琐,在繁琐和烦躁中容易犯错,如上面代码中的错误,用 at()获取矩阵元素时错误的使用了 double 类型。这种错误不是语法错误,因此在编译时编译器不会提醒。在程序运行时,at()函数获取到的不是期望的(i,j)位置处的元素, 数据已经越界, 但是运行时也未必会报错。 这样的错误使得你的程序忽而看上去正常,忽而弹出“段错误” ,特别是在代码规模很大时,难以查错。 如果使用 Mat_类,那么就可以在变量声明时确定元素的类型,访问元素时不再需要指定元素类型,即使得代码简洁,又减少了出错的可能性。上面代码可以用 Mat_实现,实现代码如下面例程里的第二个双重 for 循环。
#include<iostream>
#include"opencv2/opencv.hpp"
#include<stdio.h>
using namespace std;
using namespace cv;
int main(int argc, char *argv[])
{
Mat M(600,800,CV_8UC1);
for (int i = 0; i < M.rows; ++i)
{
//获取指针时需要指定类型
uchar *p = M.ptr<uchar>(i);
for (int j = 0; j < M.cols; ++j)
{
double dl = (double)((i+j)%255);
//用at()读写像素时,需要指定类型
M.at<uchar>(i, j) = dl;
//下面代码错误,应该使用at<uchar>()
//但编译时不会提醒错误
// double d2 = M.at<double>(i,j);
}
}
//在变量声明时指定矩阵元素类型
Mat_<uchar> M1 = (Mat_<uchar>&)M;
for (int i = 0; i < M1.rows; ++i)
{
//不需要指定元素类型,语句简洁
uchar *p = M1.ptr(i);
for (int j = 0; j < M1.cols; ++j)
{
double d1 = (double)((i+j)%255);
//直接使用Matlab风格的矩阵元素读写,简洁
M1(i, j) = d1;
double d2 = M1(i,j);
}
}
imshow("M1",M1);
imshow("M", M);
waitKey(0);
return 0;
}
Mat_类的更多相关文章
- 图像识别与OpenCV——Mat类与Mat_类的内存管理
Mat_类是对Mat类的一个包装,其定义如下: template<typename _Tp> class Mat_ : public Mat { public: //只定义了几个方法 // ...
- Java类的继承与多态特性-入门笔记
相信对于继承和多态的概念性我就不在怎么解释啦!不管你是.Net还是Java面向对象编程都是比不缺少一堂课~~Net如此Java亦也有同样的思想成分包含其中. 继承,多态,封装是Java面向对象的3大特 ...
- opencv 61篇
(一)--安装配置.第一个程序 标签: imagebuildincludeinputpathcmd 2011-10-21 16:16 41132人阅读 评论(50) 收藏 举报 分类: OpenCV ...
- 1. opencv的初体验
http://guoming.me/opencv-config 这篇文章有讲解opencv的安装与配置 一些常用库 opencv_core249d.lib opencv_imgproc249d.li ...
- opencv的初体验
http://guoming.me/opencv-config 这篇文章有讲解opencv的安装与配置 一些常用库 opencv_core249d.lib opencv_imgproc249d.li ...
- OpenCV入门学习笔记
OpenCV入门学习笔记 参照OpenCV中文论坛相关文档(http://www.opencv.org.cn/) 一.简介 OpenCV(Open Source Computer Vision),开源 ...
- 【图像处理】openCV库教程
openCV 基础学习 with:于士琪openCV基础 env:opencv3.4.0+vc2017集成开发环境 图像的表示:矩阵 1. 灰度矩阵 <br> 2. 彩色(多通道)如RGB ...
- opencv之Mat数据类型
data:Mat对象中的一个指针,指向内存中存放矩阵数据的一块内存 (uchar* data) dims:Mat所代表的矩阵的维度,如 3 * 4 的矩阵为 2 维, 3 * 4 * 5 的为3维 c ...
- opencv Mat 像素操作
1 cv::Mat cv::Mat是一个n维矩阵类,声明在<opencv2/core/core.hpp>中. class CV_EXPORTS Mat { public: //a lo ...
随机推荐
- nyoj-451-光棍节的快乐(错排公式)
题目链接 /* Name:nyoj-451-光棍节的快乐 Copyright: Author: Date: 2018/4/25 16:44:47 Description:D(n)=(n-1)*(D( ...
- HDU1815 Building roads(二分+2-SAT)
Problem Description Farmer John's farm has N barns, and there are some cows that live in each barn. ...
- 清理svn.bat
@echo on color 2f mode con: cols=80 lines=25 @REM @echo 正在清理SVN文件,请稍候...... @rem 循环删除当前目录及子目录下 ...
- [转载]rmmod: can't change directory to '/lib/modules': No such file or directory
转载网址:http://blog.csdn.net/chengwen816/article/details/8781096 在我新移植的kernel(3.4.2)和yaffs2文件中,加载新编译的内核 ...
- UCOSII下外部中断的实现
1.外部中断初始化函数 // EXTI initialize void EXTIX_INIT(void) { EXTI_InitTypeDef EXTI_InitStructure; //定义外部中断 ...
- 【转】 Pro Android学习笔记(八一):服务(6):复杂数据Parcel
目录(?)[-] 自定义的Parcelable类 AIDL文件 服务的实现 Client的实现 同步和异步 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处 ...
- highcharts图表显示鼠标选择的Y轴提示线
tooltip: { shared: true, crosshairs: [true, false] },
- xcode修改横屏
1.修改工程属性 2.修改info.plist文件
- Git学习笔记(二)分支管理与合并及Bug分支
一.分支管理 1.什么是分支 分支就相当于我们看科幻片里的平行宇宙,如果两个平行宇宙互不干扰,那铁定是啥事儿没有.不过,在某个时间点,两个平行宇宙合并了呢?假如两个宇宙中都有你的影子, 合并之后相当于 ...
- [转]Missing MSS Settings in Security Options of Group Policy (GPO)
I'm currently working on a new Windows Server 2012 and Windows 8 project. As part of that project is ...