OpenCV学习笔记

最近在用opencv库,下面做一些自己的总结,方便将来查阅。

0.cv::Mat的内容:

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 (每行所占的字节数)

1. reshape

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可以为同一个

2. 合并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);

3. 存成二进制文件:img_encode,img_decode

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

4. Mat的元素访问

情况1:一维数组。
cv::Mat ptr;
uchar* data_ptr = src.ptr(0); //原始Mat的数据指针
*(data_ptr+i)即为ptr[i]的值
情况2:二维数组
二维单通道元素可以用Mat::at(i, j)访问,i是行序号,j是列序号。

5. 取Mat中的文件

rowRange(x,y)、colRange(x,y) 是左闭右开[x,y)
实际行数为y-x

6 .二进制码与格雷码的转换

格雷码:任意两个相邻的代码只有一位二进制数不同,是可靠性编码。

二进制码 -> 格雷码(编码):最高位(最左边)保持不变,然后开始从左向右依次求异或。
格雷码 -> 二进制码(解码):保留格雷码的最高位作为自然二进制码的最高位,而次高位自然二进制码为高位自然二进制码与次高位格雷码相异或。

7. 压缩方法。

a.霍夫曼编码:比较好的方法,适用于有多个不同值的数据。
b.Golomb编码:
c.算术编码: 基本原理是将编码的消息表示成实数0和1之间的一个间隔(Interval),消息越长,编码表示它的间隔就越小。先定每个编码的范围,然后开始依次编码,
不断缩小区间,最后在定下的区间内随便选一个数字。(适用于元素比较多的数据)
d.LZW编码: 不断增加字典,进行匹配。
c.RLE编码: 统计各个编码的次数,消除空间冗余。

8 .string相关操作的一些函数

原型:char *itoa( int value, char *string,int radix);

value:欲转换的数据;string:目标字符串的地址;radix:转换后的进制数,可以是10进制、16进制等。
功能:把一个整数转换成字符串。

char *strcat(char *dest,char *src);
将src中的字符拼接到dest后面。

原型:extern int memcmp(void *buf1, void *buf2, unsigned int count);

用法:#include < string.h>
功能:比较内存区域buf1和buf2的前count个字节。
说明:
当buf1< buf2时,返回值<0
当buf1=buf2时,返回值=0
当buf1>buf2时,返回值>0
所以这里列出OpenCV中定义的型别和C++中型别的对应关系,

9 .Mat类的数据类型

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数),我们也可以直接根据命名规则得到相应的数据型别。

10. opencv常用数据结构和函数

(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;

11. 文件存储FileStorage

实例: 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”<

12.opencv模块

calib3d:相机校准和三维重建相关
core: 核心模块。opencv基本类型,数组操作,辅助功能,绘图函数等
improc: 图像处理相关
features2d: 特征提取
flann: 近邻搜索
gpu:gpu相关
highgui: 高层GUI图像用户界面
ml: 机器学习相关
stitching: 图像拼接
superres: 超分辨技术
video:视频相关

13.opencv计时模块

#include < time.h >

clock_t = startTime, endTime;
startTime=clock( ) ;
代码
endTime=clock( );
time=(double)(endTime-startTime) / CLOCKS_PER_SEC;

你可能感兴趣的:(opencv,opencv图像识别,opencv基本操作,opencv学习笔记)