OpenCV cv :: inRange
函数执行基本阈值操作。基于HSV颜色空间中的像素值范围来检测对象。// inRange()函数讲解
void inRange( InputArray src,
InputArray lowerb,
InputArray upperb,
OutputArray dst);
第一个参数:输入图像
第二个参数:H、S、V的最小值,示例:Scalar(low_H, low_S, low_V)
第三个参数:H、S、V的最大值,示例:Scalar(low_H, low_S, low_V)
第四个参数:输出图像,要和输入图像有相同的尺寸且为CV_8U类
// 使用举例
Mat hsv = image.clone();
Mat frame_threshold = image.clone();
cvtColor(image, hsv, COLOR_BGR2HSV);
double low_H = 35;
double low_S = 43;
double low_V = 46;
double high_H = 77;
double high_S = 255;
double high_V = 255;
inRange(hsv, Scalar(low_H, low_S, low_V), Scalar(high_H, high_S, high_V), frame_threshold);
inputmat.at(x, y)
:三通道分别为BGR,而不是RGB// 这里inputmat是二值化图像的mat
inputmat.at<Vec3b>(x, y)[0];// 第一个通道,对应于BGR类型的蓝色通道
inputmat.at<Vec3b>(x, y)[1];// 第一个通道,对应于BGR类型的绿色通道
inputmat.at<Vec3b>(x, y)[2];// 第一个通道,对应于BGR类型的红色通道
inputmat.at(x, y)
// 这里inputmat是二值化图像的mat
inputmat.at<Vec3b>(x, y)[0];// 第一个通道,H:色相
inputmat.at<Vec3b>(x, y)[1];// 第一个通道,S:饱和度
inputmat.at<Vec3b>(x, y)[2];// 第一个通道,V:明度
uchar
。// 这里inputmat是二值化图像的mat
inputmat.at<uchar>(x, y);
if (inputmat.at<uchar>(x, y) == 255){
//白色像素点
}
if (inputmat.at<uchar>(x, y) == 0){
//黑色像素点
}
#define CV_8SC1 CV_MAKETYPE(CV_8S,1)
#define CV_8SC2 CV_MAKETYPE(CV_8S,2)
#define CV_8SC3 CV_MAKETYPE(CV_8S,3)
#define CV_8SC4 CV_MAKETYPE(CV_8S,4)
#define CV_8SC(n) CV_MAKETYPE(CV_8S,(n))
#define CV_16UC1 CV_MAKETYPE(CV_16U,1)
#define CV_16UC2 CV_MAKETYPE(CV_16U,2)
#define CV_16UC3 CV_MAKETYPE(CV_16U,3)
#define CV_16UC4 CV_MAKETYPE(CV_16U,4)
#define CV_16UC(n) CV_MAKETYPE(CV_16U,(n))
#define CV_32SC1 CV_MAKETYPE(CV_32S,1)
#define CV_32SC2 CV_MAKETYPE(CV_32S,2)
#define CV_32SC3 CV_MAKETYPE(CV_32S,3)
#define CV_32SC4 CV_MAKETYPE(CV_32S,4)
#define CV_32SC(n) CV_MAKETYPE(CV_32S,(n))
#define CV_64FC1 CV_MAKETYPE(CV_64F,1)
#define CV_64FC2 CV_MAKETYPE(CV_64F,2)
#define CV_64FC3 CV_MAKETYPE(CV_64F,3)
#define CV_64FC4 CV_MAKETYPE(CV_64F,4)
#define CV_64FC(n) CV_MAKETYPE(CV_64F,(n))
CV_<bit_depth>(S|U|F)C<number_of_channels>
bit_depth
—比特数—代表8bite,16bites,32bites,64bites—S|U|F
:代表数据类型S--代表—signed int—有符号整形,
U–代表–unsigned int–无符号整形,
F–代表–float-------单精度浮点型
C
代表—一张图片的通道数,比如:1–灰度图片–grayImg—是–单通道图像
2–RGB彩色图像---------是–3通道图像
3–带Alph通道的RGB图像–是--4通道图像
-方法一: 基于RGB的肤色检测
在均匀光照下应满足以下判别式:
R>95 AND G>40 B>20 AND MAX(R,G,B)-MIN(R,G,B)>15 AND ABS(R-G)>15 AND R>G AND R>B
在侧光拍摄环境下:
R>220 AND G>210 AND B>170 AND ABS(R-G)<=15 AND R>B AND G>B
该方法的原理:
a.将RGB图像转换到YCrCb颜色空间,提取Cr分量图像
b.对Cr做自二值化阈值分割处理(Otsu法)
Ptr<FaceRecognizer> LBPHRecog = createLBPHFaceRecognizer(1, 8 ,3, 3, 50); //构造LBPH人脸识别类的对象并初始化
int radius = 1 :中心像素点到周围像素点的距离,相邻像素距离为1,以此类推
int neighbors = 8 :选取的周围像素点的个数
int grid_x= 8 :将一张图片在x方向分成8块
int grid_y = 8 :将一张图片在y方向分成8块
double threshold = DBL_MAX :LBP特征向量相似度的阈值,只有两张图片的相似度小于阈值才可认为识别有效,大于阈值则返回-1
LBPHRecog->train(trainPic, labels); //LBP人脸识别训练函数
训练函数参数中的trainPic是一个vector,所有需要训练的图片都被包含在内,labels也是vector,存储与trainPic中对应训练图片的名字,这样从trainPic中得到的与识别的图片最相似的图片的名字即可在labels中查找到。
result = LBPHRecog->predict(recogPic);//进行识别,并返回识别结果
-openCV中通过使用findContours
函数,简单几个的步骤就可以检测出物体的轮廓,参考链接
findContours( InputOutputArray image, OutputArrayOfArrays contours,
OutputArray hierarchy, int mode,
int method, Point offset=Point());
vector> contours
,是一个向量,并且是一个双重向量,向量内每个元素保存了一组由连续的Point点构成的点的集合的向量,每一组Point点集就是一个轮廓。 有多少轮廓,向量contours就有多少元素。vector hierarchy
轮廓特征取值一:CV_RETR_EXTERNAL只检测最外围轮廓,包含在外围轮廓内的内围轮廓被忽略
取值二:CV_RETR_LIST 检测所有的轮廓,包括内围、外围轮廓,但是检测到的轮廓不建立等级关 系,彼此之间独立,没有等级关系,这就意味着这个检索模式下不存在父轮廓或内嵌轮廓, 所以hierarchy向量内所有元素的第3、第4个分量都会被置为-1,具体下文会讲到
取值三:CV_RETR_CCOMP 检测所有的轮廓,但所有轮廓只建立两个等级关系,外围为顶层,若外围 内的内围轮廓还包含了其他的轮廓信息,则内围内的所有轮廓均归属于顶层
取值四:CV_RETR_TREE, 检测所有轮廓,所有轮廓建立一个等级树结构。外层轮廓包含内层轮廓,内层轮廓还可以继续包含内嵌轮廓。
取值一:CV_CHAIN_APPROX_NONE 保存物体边界上所有连续的轮廓点到contours向量内
取值二:CV_CHAIN_APPROX_SIMPLE 仅保存轮廓的拐点信息,把所有轮廓拐点处的点保存入contours向量内,拐点与拐点之间直线段上的信息点不予保留
取值三和四:CV_CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS使用teh-Chinl chain 近似算法