一、图像的加载、修改、保存
- 图像加载:cv:imread—加载图像文件成文一个Mat对象
- 图像修改:cv:cvtColor—把图像从一个色彩空间转到另一个色彩空间(输 入,输出,色彩空间转换)
- 图像保存:imwrite
- 创建openCV窗口:nameWindow
- 图像显示到窗口:imshow
- 滑块:TrackBar
//其中最重要的是callback函数功能。如果设置为NULL就是说只有值updata,但是不会调用callback的函数
-createTrackbar(constString & trackbarname, constStringwinName, int* value, int count, Trackbarcallback func,void* userdata = 0)
二、矩阵的掩膜操作
- 获取像素矩阵指针:Mat.ptr(int i = 0)—索引i表示第几行,从0开始计行数
- 获取当前行指针:const uchar* current = myImage.ptr(row)
- 像素范围处理:
saturate_cast(-100)—返回0
saturate_cast(288)—返回255
saturate_cast(100)—返回100 - 定义掩膜:Mat kernel = (Mat_(3,3<<0,-1,0,-1,5,-1,0,-1,0))
- 掩膜(Kernel)操作:filter2D( src , dst , src.depth() , kernel )
掩膜模板举例:实现图像对比图调整
P( i , j ) = 5*P( i , j ) - [ P( i - 1 , j ) + P( i + 1 , j ) + P( i , j - 1 ) + P( i , j + 1 ) ]
原理解析代码:
int cols = (src.cols-1) * src.channels();
int offsetx = src.channels();
int rows = src.rows;
//定义与原图大小相同的空白图像
dst = Mat::zeros(src.size(), src.type());
//遍历获取原图每行像素
for (int row = 1; row < (rows - 1); row++) {
const uchar* previous = src.ptr<uchar>(row - 1);
const uchar* current = src.ptr<uchar>(row);
const uchar* next = src.ptr<uchar>(row + 1);
//定义目标图像像素行
uchar* output = dst.ptr<uchar>(row);
for (int col = offsetx; col < cols; col++) {
//对目标图像像素点赋值
output[col] = saturate_cast<uchar>(5 * current[col] - (current[col- offsetx] + current[col+ offsetx] + previous[col] + next[col]));
}
}
//上述循环可由下方api替代
Mat kernel = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
filter2D(src, dst, src.depth(), kernel);
三、Mat对象
Mat对象:图像数据结构、自动分配内存、不存在内存泄漏、面向对象的数据结构、分为 头部+数据部分;赋值和拷贝构造函数只复制头部份
常见方法:
构造—
例:
Mat dst;
dst = Mat(src.size(),src.type()) 或 dst.create(src.size(),src.type())
dst = Scalar(127,0,255);
例:
Mat M(2,2,CV_8UC3,Scalar(0,0,255))
//(2行, 2列, 每个通道占8位、U无符号、C Char类型、通道数目3, 初始化像素值--长度对应通道数目)
例:
Mat mat = Mat::zeros()//初始化纯黑色图片
复制—void copyTo(Mat mat) (实现数据完全复制)
复制—Mat clone() (实现数据完全复制)
类型转换—void convertTo(Mat dst,int type) (例:8位转浮点)
获取通道—int channnels()
获取位深—int depth()
判空—bool empty()
获取指针—uchar* ptr(i=0) (const uchar* firstRow = dst.ptr(0))