最近在用opencv库,下面做一些自己的总结,方便将来查阅。
flags int
dims int
rows int
cols int
data unsigned char* 数据
refcount int*
datastart unsigned char*
dataend unsigned char*
datalimit unsigned char*
allocator cv::MatAllocator
size cv::Mat::MSize (列数,行数)
step cv::Mat::MStep (每行所占的字节数)
reshape ( cn, rows )
cv::Mat result = testMat.reshape ( 0, 3 );
参数:cn为新的通道数,如果cn = 0,表示通道数不会改变。
参数rows为新的行数,如果rows = 0,表示行数不会改变。
注意:新的行列必须与原来的行列相等,否则会报错。
reshape是按行展开,1,2,3;4,5,6 展开后是:1,2,3,4,5,6。而不是1,4,2,5,3,6.
注:opencv是行优先,matlab是列优先。src和dst的Mat可以为同一个
方法1:
vconcat(B,C,A); // 等同于A=[B ;C]
hconcat(B,C,A); // 等同于A=[B C]
方法2:
mat.push_back
每行每行存储进去。
Gabor_F.push_back(Gabor_F10);
cv::Mat img_encode; im_decode
ofstream fp1;
//编码与存储
std::vector data_encode;
imencode(".png", total_F, data_encode);
std::string str_encode(data_encode.begin(), data_encode.end());
fp1.open(file_path,ios::out|ios::binary);
fp1 << str_encode;
fp1.close();
//打开文件并读取
ifstream fp;
fp.open(file_path,ios::in|ios::binary);
std::stringstream sstr;
fp >> sstr.rdbuf();
std::string str_tmp = sstr.str();
Mat img_decode;
std::vector data(str_tmp.begin(), str_tmp.end());
//文件解码
img_decode = imdecode(data, CV_LOAD_IMAGE_COLOR);
//转换成灰度
cvtColor(img_decode,img_decode,CV_BGR2GRAY);
fp.close();
注:该方法的局限性在于只能存储unchar类型的数据,即:[0,255],因为是im操作,每个像素点都是8位0-255
情况1:一维数组。
cv::Mat ptr;
uchar* data_ptr = src.ptr(0); //原始Mat的数据指针
*(data_ptr+i)即为ptr[i]的值
情况2:二维数组
二维单通道元素可以用Mat::at(i, j)访问,i是行序号,j是列序号。
rowRange(x,y)、colRange(x,y) 是左闭右开[x,y)
实际行数为y-x
格雷码:任意两个相邻的代码只有一位二进制数不同,是可靠性编码。
二进制码 -> 格雷码(编码):最高位(最左边)保持不变,然后开始从左向右依次求异或。
格雷码 -> 二进制码(解码):保留格雷码的最高位作为自然二进制码的最高位,而次高位自然二进制码为高位自然二进制码与次高位格雷码相异或。
a.霍夫曼编码:比较好的方法,适用于有多个不同值的数据。
b.Golomb编码:
c.算术编码: 基本原理是将编码的消息表示成实数0和1之间的一个间隔(Interval),消息越长,编码表示它的间隔就越小。先定每个编码的范围,然后开始依次编码,
不断缩小区间,最后在定下的区间内随便选一个数字。(适用于元素比较多的数据)
d.LZW编码: 不断增加字典,进行匹配。
c.RLE编码: 统计各个编码的次数,消除空间冗余。
value:欲转换的数据;string:目标字符串的地址;radix:转换后的进制数,可以是10进制、16进制等。
功能:把一个整数转换成字符串。
char *strcat(char *dest,char *src);
将src中的字符拼接到dest后面。
用法:#include < string.h>
功能:比较内存区域buf1和buf2的前count个字节。
说明:
当buf1< buf2时,返回值<0
当buf1=buf2时,返回值=0
当buf1>buf2时,返回值>0
所以这里列出OpenCV中定义的型别和C++中型别的对应关系,
CV_8SC1 -> char
CV_8UC1 -> unsigned char
CV_16SC1 -> short
CV_16UC1 -> unsigned short
CV_32SC1 -> int
CV_32FC1 -> float
CV_64FC1 -> double
opencv中的数据型别命名规则为:CV_(比特数)+(数据类型)+(Channel数),我们也可以直接根据命名规则得到相应的数据型别。
(1)点的表示:Point
cv::Point aa; aa.x=10; aa.y=8
或者:
cv::Point aa=Point(10,8);
(2)颜色的表示: Scalar。元素表示颜色通道的值
Scalar(a,b,c)表示a,b,c分别为BGR的值
(3)尺寸表示Size
cv::Size aa = Size(width,height);
aa.width=;
aa.height=;
(4)矩形Rect
cv::Rect
成员变量为 有左上角点的坐标(x,y)和矩形的宽和高(width,height)
成员函数有 Size(), area(), contains(Point), inside(Rect),
tl():返回左上角坐标; br():返回右下角坐标
求两个矩形交集和并集 Rect rect=rect1&rect2
Rect rect=rect1|rect2
平移与缩放 Rect rectShift = rect+point;
Rect rectScale = rect+size;
实例: cv::FileStorage(const string& source, int flags, const string& encoding=string());
(1)实例化一个FileStorage类对象
(2)使用流操作符<<进行文件写入,>>进行文件读取,类似C++中的文件操作
(3)使用FileStorage::release()函数析构掉类对象,并关闭文件
两种方法:
cv::FileStorage fs(“file_info.yml”, FileStorage::WRITE);
fs << “template_number”<< number;
fs.release();
注:(1)fs<<”strings”;输入的是标签,这里切不可写成fs<<”strings:”如果多加了个冒号则会报错.
(2)存入yml文件时,必须是fs<<”AA”<
calib3d:相机校准和三维重建相关
core: 核心模块。opencv基本类型,数组操作,辅助功能,绘图函数等
improc: 图像处理相关
features2d: 特征提取
flann: 近邻搜索
gpu:gpu相关
highgui: 高层GUI图像用户界面
ml: 机器学习相关
stitching: 图像拼接
superres: 超分辨技术
video:视频相关
#include < time.h >
clock_t = startTime, endTime;
startTime=clock( ) ;
代码
endTime=clock( );
time=(double)(endTime-startTime) / CLOCKS_PER_SEC;