OpenCV学习笔记 一

一、图像的加载、修改、保存

  1. 图像加载:cv:imread—加载图像文件成文一个Mat对象
  2. 图像修改:cv:cvtColor—把图像从一个色彩空间转到另一个色彩空间(输 入,输出,色彩空间转换)
  3. 图像保存:imwrite
  4. 创建openCV窗口:nameWindow
  5. 图像显示到窗口:imshow
  6. 滑块:TrackBar
//其中最重要的是callback函数功能。如果设置为NULL就是说只有值updata,但是不会调用callback的函数
-createTrackbar(constString & trackbarname, constStringwinName, int* value, int count, Trackbarcallback func,void* userdata = 0)

二、矩阵的掩膜操作

  1. 获取像素矩阵指针:Mat.ptr(int i = 0)—索引i表示第几行,从0开始计行数
  2. 获取当前行指针:const uchar* current = myImage.ptr(row)
  3. 像素范围处理:
    saturate_cast(-100)—返回0
    saturate_cast(288)—返回255
    saturate_cast(100)—返回100
  4. 定义掩膜:Mat kernel = (Mat_(3,3<<0,-1,0,-1,5,-1,0,-1,0))
  5. 掩膜(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))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值