C++中typedef,其作用是给某种数据类型定义一个新的名字。
1.在C语言编程中,可以使用typedef关键字来重新命名一个数据类型,这里指的数据类型包括基本数据类型如int ,char,double等和结构数据类型struct等。
2.使用typedef的目的主要有两个,其一是为了让自己在后续编程时方便记住变量的名字,其二是为了简化一些变量名称较长的名字。
3.常见的用法如下:
(1)用typedef只是对已经存在的类型增加一个类型名,而没有创造一个新的类型。只是增加了一个新名字,可以用该名字定义变量,比如使用上文中的Status定义变量i;则i变量的类型为int型。
(2)可以用typedef声明新类型名。但是不能用来定义变量。
typedef是C语言32个关键字之一,意思是重新定义一个数据类型,严格来说,是将现有的数据类型起个新的别名。
这样做的最大好处是:简化复杂类型,提高程序的可读性。
C++中的class
#include <iostream>
using namespace std;
class Dog
{
private:
int age;
char name[10];
public:
Dog();
void setAge(int age);
int Age();
};
Dog::Dog()
{
}
void Dog::setAge(int age)
{
this->age=age;
}
int Dog::Age()
{
return age;
}
int main()
{
Dog dog;
dog.setAge(2);
cout<<"Age="<<dog.Age()<<endl;
Dog *dog1=new Dog();
dog1->setAge(3);
cout<<"Age="<<dog1->Age()<<endl;
return 0;
}
类是模板:Dog
实例化一个类:Dog dog;或者Dog *dog1=new Dog();
调用类中的方法:dog.setAge(2);或者dog1->setAge(3);
或者调用类中的属性:age,name等(此例因为,这二者定义为私有,所以不直接调用,而是通过成员函数调用)
class <类名>
{
public:
<公有成员函数或成员变量的说明>
private:
<私有成员函数或成员变量的说明>
protected:
<保护成员函数或成员变量的说明>
};
cv::Mat
//Mat:基本图像容器
//在以前的老式opencv中使用的是C结构,需要注意内存的申请和销毁,
//后来转为C++接口,使用Mat对象,自动申请和销毁内存,很方便。
Mat由基本的两部分组成:矩阵头(包含图片信息,例如矩阵大小,存储方法等)和一个指向包含像素点信息的指针。矩阵头部大小是常数,但是矩阵的大小却各不相同。
Mat中重要的几个成员:
size_t elemSize() const;
int type() const;
int depth() const;
int channels() const;
size_t step1(int i=0) const
int dims
int rows, cols
**channels:**我们熟悉的是彩色图像三通道RGB,也就是矩阵中每一个元素值的个数,就像一个彩色像素点它由R、G、B三个混合而成。处于某行某列的像素点有三个值分别为RGB。
**depth:**深度是用来度量每一个像素的精度,每个像素的位数(bit)也就是深度越深,精度越高。在opencv的Mat.depth()中得到的是一个 0 – 6 的数字,分别代表不同的位数:enum { CV_8U=0, CV_8S=1, CV_16U=2, CV_16S=3,CV_32S=4, CV_32F=5, CV_64F=6 }; 其中U表示unsigned的意思,S表示signed,也就是有无符号。我们可以看作以8U为基本单位
**dim:**矩阵维度
**rows/cols(size)😗*行列数。
**type :表示了矩阵中元素的类型以及矩阵的通道个数,它是一系列的预定义的常量,其命名规则为CV_ + (位数)+(数据类型)+(通道数)。
data: uchar型的指针。Mat类分为了两个部分:矩阵头和指向矩阵数据部分的指针,data就是指向矩阵数据的指针。
Mat对象构造函数:(常用)
Mat();
Mat(int rows, int cols, int type);
Mat(Size size, int type);
Mat(int rows, int cols, int type, const Scalar& s);
Mat(Size size, int type, const Scalar& s);
Mat(int ndims, const int sizes, int type);
Mat(int ndims, const int sizes, int type, const Scalar& s);
常用方法:
void copyTo(Mat mat) //完全复制一份
void convertTo(Mat dst, int type) //转换,比如8位的转换为float
Mat clone() //完全复制一份
int channels() //通道数
int depth() //深度
bool empty(); //是否空
at(int i0,int i1) //访问矩阵元素
Mat对象使用-四个要点:
输出图像的内存是自动分配的
使用OpenCV的C++接口,不需要考虑内存分配问题
赋值操作和拷贝构造函数只会复制头部分
使用clone与copyTo两个函数实现数据完全复制
#include <opencv2/opencv.hpp>
#include <opencv2/xfeatures2d.hpp>
#include<opencv2/face.hpp>
#include<iostream>
#include<math.h>
#include <string>
#include<fstream>
using namespace cv::face;
using namespace cv;
using namespace std;
using namespace cv::xfeatures2d;
int main()
{
Mat src;
double time, timeconsume;
src = imread("C:/Users/Administrator/Desktop/pic/5.jpg");
imshow("input", src);
Mat dst = Mat(src.size(), src.type());
dst = Scalar(127, 0, 255);//给矩阵所有的像素点设置颜色数据,绯红,这里的 = 号运算符重载了 Scalar参数顺序是 B G R
//Mat dst = src.clone();//完全拷贝
/*Mat dst;
src.copyTo(dst);//完全拷贝*/
//Mat dst = imread("...");//只是复制部分,Mat对象头部与数据的指针,不会复制数据
//Mat dst(src);//只是复制部分,Mat对象头部与数据的指针,不会复制数据
imshow("output image", dst);
cvtColor(src, dst, CV_BGR2GRAY);//dst对象输出图像的内存是自动分配的
printf("rgb.channels=%d, gray.channels=%d,%d,%d\n", src.channels(), dst.channels(), src.type(), dst.type());//rgb通道数为3,gray通道数为1,16,0
const uchar* firstRow = dst.ptr<uchar>(0);//图像第一行颜色数据
printf("first pixel value : %d\n", *firstRow);
printf("dst.cols=%d, dst.rows=%d\n", dst.cols, dst.rows);
// CV_8UC1 8表示8位,UC表示unsigned char,1表示1个通道, Scalar表示向量长度,要与通道数目一致
Mat m(3, 3, CV_8UC3, Scalar(0, 0, 255));//3*3个像素点,CV_8UC3表示像素点为三个通道颜色数据,CV_8UC1表示像素点为单通道,对应的传 Scalar(255)
cout << "m = " << endl << m << endl;//打印每个通道颜色数据
imshow("scalar", m);
Mat m1;
m1.create(src.size(), src.type());//以create方式创建Mat
m1 = Scalar(0, 0, 255);//Scalar参数顺序是 B G R
imshow("create", m1);
//Mat kernel = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0); //定义小数组,以 << 运算符重载 创建Mat
Mat zeros = Mat::zeros(2, 2, CV_8UC1);//初始值0
cout << "zeros = " << endl << zeros << endl;
Mat eye = Mat::eye(3, 2, CV_8UC1);//沿着主对角线的像素点(不是通道)的第一个通道的数据设置为1,其他都为0,对于CV_8UC1的方阵可以生成单一矩阵
cout << "eye = " << endl << eye << endl;
waitKey(0);
}