回顾
Mat
行 列 通道 维度
row col channel dim
在Mat里面除了上面四个比较常用的量以外,还有flag变量,它是在Mat 的头里面,包含了图像的维度,深度(是short类型、char类型还是double类型的);除了flag还有一个data的指针,它是指向内存中数据所在地址的;还有一个referencecount指针,引用计数指针,看有多少指针指向了这个地址。
第二讲的内容开始
在Mat中有一个data指针,data指针指向的是数据在内存中的首地址,
例子:
Mat m(400,400,CV_8U,Scalar(0));
定义一个单通道的400*400大小的矩阵,矩阵元素初值为0,即全黑的图像
#include <iostream> #include<highgui.h> #include "opencv2/opencv.hpp" using namespace cv; using namespace std;
int main(int argc, char* argv[])
{
Mat m(400,400,CV_8U,Scalar(0));
for (int col = 0; col < 400; col++)
{
for (int row = 195; row < 205; row++)
{
cout << (int)(*(m.data + m.step[0] * row + m.step[1] * col)) << " ==>";
//获取第[row,col]个像素点的地址并用*符号解析
*(m.data + m.step[0] * row + m.step[1] * col) = 255;
cout << (int)(*(m.data + m.step[0] * row + m.step[1] * col)) << endl;
}
}
imshow("canvas",m);
cvWaitKey();
getchar();
return 0;
}
例子:
Vec3i color定义一个变量,它是Vector类型的,有3个元素,且是int型的;
注意cvWaitKey()可以传参,单位是毫秒;
#include <iostream> #include<highgui.h> #include "opencv2/opencv.hpp" using namespace cv; using namespace std;
int main(int argc, char* argv[])
{
Mat m = imread("lena.jpg");
int *p_address;
Vec3i color;
for (int col = 20; col < 40; col++)
{
for (int row = 2; row < 20; row++)
{
color[0] = (int)(*(m.data+m.step[0]*row+m.step[1]*col));
color[1] = (int)(*(m.data + m.step[0] * row + m.step[1] * col+m.elemSize1()));
color[1] = (int)(*(m.data + m.step[0] * row + m.step[1] * col + m.elemSize1()*2));
//获取第[row,col]个像素点的地址并用*符号解析
cout << color[0] << "," << color[1] << "," << color[2] << " ==>";
color[0] = 255;
color[1] = 0;
color[2] = 0;
*(m.data + m.step[0] * row + m.step[1] * col) = color[0];
*(m.data + m.step[0] * row + m.step[1] * col + m.elemSize1()) = color[1];
*(m.data + m.step[0] * row + m.step[1] * col + m.elemSize1() * 2) = color[2];
cout << (int)*(m.data + m.step[0] * row + m.step[1] * col) << (int)*(m.data + m.step[0] * row + m.step[1] * col + 1) << (int)*(m.data + m.step[0] + m.step[1] * col + 2) << endl;
}
}
imshow("canvas",m);
cvWaitKey();
getchar();
return 0;
}
结果:
opencv的模板类Mat_类
例子:
#include <iostream> #include<highgui.h> #include "opencv2/opencv.hpp" using namespace cv; using namespace std;
int main(int argc, char* argv[]) {
Mat m = imread("lena.jpg");
Mat_<Vec3b> m2 = m;
//for()循环画一个红色的实心圆
for (int y = 21; y < 42; y++)
{
for (int x = 2; x < 21; x++)
{
if (pow(double(x - 11), 2) + pow(double(y - 31), 2) - 64.0 < 0.00000000001)
{
//Mat_模板类实现了对()的重载,可以定位到一个像素
m2(x, y) = Vec3b(0,0,255);
}
}
}imshow("canvas",m);
cvWaitKey();
getchar();
return 0;
}
结果如下:
注意pow函数的含义:pow(src,double p,dst);//如果p是整数dst(I)=src(I)^p;其他|src(I)|^p
像素值的读写6
在2.4以前,有这两种数据类型IplImage和CvMat,我们现在都用Mat,然后有一些例程,它的形式是IplImage *p,这种图像指针类型的,我们可以用&iplimg这种引用的方式转换为Mat类型。
同时也支持这两种方式互转,
关于图像的读取
imread()函数,返回值是一个Mat类型,它读取失败里面的*data是指向NULL的,建议不要使用判断是否为NULL来说明是否读取成功;它自己有一个成员函数来判断的isempty();
flags只要大于0就代表返回3通道图像,灰度图像就会强制转化为3通道,flag为0,强制转化为单通道;flag小于0,那么是什么就读什么,不进行转换;
有一种图像格式叫做PNM,PPM,PGM,可移植像素格式,它是纯文本的格式,常见的是PGM的格式;
imwrite()是存储文件
注意并不是所有的Mat都可以存储成图像,目前只支持8U的单通道或者3通道格式,如果想把16U的转换成功的话,就只能用PNG格式或者JPEG2000,注意一下。
如果这个文件夹下有这个文件,它是直接覆盖的,不会有任何提醒;
介绍一下,打开外设,或者读取视频的一个例子
VideoCapture这样一个类,有一个构造函数直接指定设备的编号cap(0);
上面的例子是读,下面的例子是写
本课程涉及到深度学习与机器学习相关的内容,所以要学习一下python
python环境的安装,建议Anaconda+Ipython+(PyScripter)(版本2.7比较流行或者3.5都可以)
在2.7版本
x=3,x/2=1,是整型
在3.5版本
x=3,x/2=1.5是浮点型
机器学习
机器学习:要随机得观测数据,要随机得对观测数据进行采样,要学习数据的性质,其实也叫做特征feature,以及属性,属性通常叫做label,他是属于那一个类别,再来预测新的未知的数据的属性。在机器学习当中,我们通常要把数据分成两部分,一部分叫做training(训练集用来学习数据特征),另一部分叫做test(测试集用来测试算法是否准确)。机器学习的问题主要分为
监督学习和非监督学习
监督学习除了数据本身以外,还有额外的属性部分,也就是说会有一些feature,然后再额外的会有一些label,这样的问题分为分类和回归两部分;分类问题可以理解为输出是离散数据;回归问题输出的就是连续的,比如说根据年龄、体重,来预测身高。监督学习主要是分类,尽量把问题转化为分类问题。
如果输入没有额外的label等,那么就叫做非监督学习,主要分为聚类(kmeans)和核密度估计。
Knn-Grassroots Democracy
当有一个未知物体的时候,在我们做出推荐之前会考虑一下它周围的数据的label是属于那个类别,从而从而觉得这个数据是属于那个类别的。
knn作为一种机器学习算法也分为两部分,训练算法识别特征的类别,然后在训练集上测试;KNN的训练部分就是把训练集和标签全部存储,比如说,给出5这样一个训练的图像
,它的label就是5。
会有一个其他图片比如说是0,它的label就是0,
KNN就会把这两个属性全都存储下来,它就学习完了,只要把数据全部喂给算法,它就已经完成识别了,什么操作都没有,接下来就是测试部分,只要提供测试集,没有标签,在指定K的大小之后,让算法来猜它是什么数据。它是没有训练的,平时不学习,等到测试的时候问题就来了,它就把所有的训练集跟测试数据进行一一比对,比对就涉及到一个距离问题,测试两个向量的距离distance。
K-means算法。
原文:http://www.cnblogs.com/gary-guo/p/6274820.html