RGB转灰度函数
cvtColor(image, gray, COLOR_BGR2GRAY);
图像 目标图像 rgb转灰度
大津法二值化函数
threshold(gray, result1, 84, 255, THRESH_OTSU);
灰度图,目标图,阈值,大于阈值的转换的像素值,方法为大津法
自适应二值化
adaptiveThreshold(gray, result2, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY,101,10);
灰度图,目标图,大于阈值的转换的像素值,自适应方法,二值化方法
虽然人物的信息丢失了很多,但是背景基本上被去掉了。丢失的人物的信息可以通过位运算等恢复。在去除背景提取前景方面,自适应阈值函数要有效很多。
blockSize:分割计算的区域大小,取奇数 C:常数,每个区域计算出的阈值的基础上在减去这个常数作为这个区域的最终阈值,可以为负数
创建滑动条改变变量
imshow("bar", gray);
int lowth = 10;
int maxth = 255;
createTrackbar("thresold", "bar",&lowth, maxth, thresold_mat,&gray );
主函数中的写
第一行是展示窗口
lowth是起始位置大小 maxth是最大的大小
createTrackbar函数的参数是1 滑动条名称 2创建的窗口名字 3起始地址的位置 4最大值 5函数接口 6改变图像的地址
回调函数
void thresold_mat(int th, void* data) {
Mat src = *(Mat*)(data);
Mat dst;
threshold(src, dst, th, 255,THRESH_BINARY);
imshow("bar", dst);
}
后面参数必须得一样 固定格式
传给指针给src src改变也会带动data改变
二值化函数 且显示目标图像
访问电脑摄像头
VideoCapture cap(0);
while (1) {
Mat frame;
cap >> frame;
imshow("frame", frame);
waitKey(30);
}
waitkey是每隔30个时间单位就刷新一次画面
frame就是摄像头的画面 一帧画面
检测肤色
VideoCapture cap(0);
double i_minH = 0;
double i_maxH = 20;
double i_minS = 43;
double i_maxS = 255;
double i_minV = 55;
double i_maxV = 255;
while (1) {
Mat frame;
Mat hsvmat;
Mat detectmat;
cap >> frame;
cvtColor(frame, hsvmat, COLOR_BGR2HSV);
frame.copyTo(detectmat);
inRange(hsvmat, Scalar(i_minH, i_minS, i_minV), Scalar(i_maxH, i_maxS, i_maxV), detectmat);
imshow("frame", frame);
imshow("detect", detectmat);
waitKey(30);
}
人体肤色的HSV的区间
double i_minH = 0;
double i_maxH = 20;
double i_minS = 43;
double i_maxS = 255;
double i_minV = 55;
double i_maxV = 255;
rgb转换HSV函数
cvtColor(frame, hsvmat, COLOR_BGR2HSV);
复制图像另个函数表达
frame.copyTo(detectmat);
检测区间颜色内的函数文章来源:https://www.toymoban.com/news/detail-629609.html
inRange(hsvmat, Scalar(i_minH, i_minS, i_minV), Scalar(i_maxH, i_maxS, i_maxV), detectmat);
在hsvmat图像中检测在区间内的,并二值化,将区间内的变成白色,其他为黑色,存入detectmat文章来源地址https://www.toymoban.com/news/detail-629609.html
到了这里,关于OPENCV C++(三)二值化灰度函数+调用摄像头+鼠标响应+肤色检测的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!