OpenCV学习笔记 01
- 视频显示方式
①视频以帧形式显示,需反复读取并刷新
②OpenCV所打开的视频文件会进入一个图像输入流中等待输入
所以,一般的显示方法如下:
while(1)
{
Mat frame;
video >> frame;
if(frame.empty())
{
break;
}
imshow("窗口名称",frame);
waitKey(1000/30); //自行设置刷新率,1000单位为豪秒
}
一、图像颜色空间
1.YUV、HSV、RGB、Lab
颜色模型转换:
void cv::cvtColor(InputArray src
OUtputArray dst
int code //转换颜色标志
int dstCn) //输出矩阵通道数
2.多通道分离与合并
通道分离函数split :将「输入」的通道拆分,存入「输出」(数组形式 or Vector)
void cv::split(const Mat * input,
Mat * output //Mat类的数组
)
void cv::split(InputArray input,
OutputArrayofArray output //Vector<Array>
)
多通道合并函数merge:「输入」(数组形式),输出各通道合并后的结果
void cv::merge( const Mat * input, //输入一个Mat数组
size_t count, //输入需要合并数组前多少项>0
OutputArray output //输出
)
void cv::merge( InputArrayofArray input, //输入一个Vector<Array>
OutputArray output //输出
)
二、像素操作处理
1.单幅图像素操作
1.1 像素最大最小值
用于求灰度值最大的元素
void cv::minMaxLoc(InputArray input,
double * minVal, //矩阵中的最小值
double * maxVal,
Point * minLoc = 0, //上述最小值**按行扫描**第一次出现的位置
Point * maxLoc = 0,
InputArray mask = noArray() //可设定应用范围遮罩
)
1.2 图像平均值与标准差
图像平均值:衡量图像整体亮度,平均值越高整体越亮
图像标准差:衡量图像对比度、像素均值的离散程度,标准差越大图像质量越好
只计算平均值–>mean()
cv::Scalar cv::mean(InputArray input, //Mat
INputArray mask = noArray(),
)
//Scalar是opencv的一个Struct,是一个存放4个double值的数组
平均值 && 标准差–>meanStdDev()
void cv::meanStdDev(InputArray src, //输入图像
OutputArray mean, //各个通道的像素平均值(Mat)
OutputArray stddev, //各个通道的像素标准差(Mat)
InputArray mask = noArray()
)
2.两图之间的像素操作
2.1 比较运算(max,min)
max/min:输入两个Mat类对象,输出一个各个像素取最大/最小值的Mat类对象
用途:与掩膜图像运算实现抠图、与特定颜色的掩膜遮罩实现过滤指定颜色
void cv::max(InputArray input1,
InputArray input2,
OutputArray dst
)
void cv::min(InputArray input1,
InputArray input2,
OutputArray dst
)
2.2 逻辑运算
”与、或、异或、非“
① 会自动转换为Binary后进行按位运算(00000101—>11111010)
② 函数为
bitwise_and()、bitwise)_or()、bitwise_xor()、bitwise_not()cpp
void cv::bitwise_and(InputArray input1,
InputArray input2,
OutputArray dst,
InputArray mask = noArray()
)
3. 图像二值化
二值图像:每个像素点均为黑色或者白色的图像。二值图像一般用来描述字符图像,其优点是占用空间少,高度压缩
3.1 单阈值二值化threshold()
3.1.1 手动设定阈值
double cv::threshold(InputArray input,
OutputArray output,
double thresh, //手动设置阈值
/*若选择BINARY模式*/ double maxval, //BIANRY模式下设置最大值
int type //二值化算法
)
THRESH_BINARY | 高于阈值置最大,低于阈值置0 |
THRESH_BINARY_INV | 高于阈值置0,低于阈值置最大 |
THRESH_TRUNC | 高于阈值置为阈值 |
THRESH_TOZERO | 高于阈值置为0 |
THRESH_TOZERO_INV | 低于阈值置为0 |
3.1.2 自动计算阈值
大 津 法:THRESH_OTSU
三角形法:THRESH_TRIANGLE
double cv::threshold(InputArray input,
OutputArray output,
double thresh, //手动设置阈值
/*若选择BINARY模式*/ double maxval, //BIANRY模式下设置最大值
int type //二值化算法
)
eg. threshold(input,output,100,255,THRESH_BINARY | THRESH_OTSU)
3.2 多阈值二值化
LUT表(多阈值表)
① 对原有像素值(0~255)向LUT表进行映射,将每个区间段映射为一个值
② 使用LUT表进行二值化
void cv::LUT(InputArray input,
InputArray lut, //完成映射的LUT表
OutputArray output
)
3.3 局部自适应阈值二值化adaptiveTreshold()
均值法:ADAPTIVE_THRESH_MEAN_C
高斯法:ADAPTIVE_THRESH_GUASSIAN_C
double cv::adaptiveThreshold(InputArray input,
OutputArray output,
/*若选择BINARY模式*/ double maxval, //BIANRY模式下设置最大值
int adaptiveMethod, //自适应算法
int thresholdType, //二值化方法
int blockSize,
//自适应二值化通过动态计算像素邻域的平均值来确定阈值,blockSize为邻域大小,为奇数
double c //阈值调整系数
)
eg.adaptiveThreshold(input,output,255,
ADAPTIVE_THRESH_MEAN_C,THRESH_BINARY,55,0)