前篇讲过基于相机焦距和手机PPI进行测量身高,可是这种测量方式具备不可控性,偏差很大,因此该篇文章采用参照物对比进行测量身高。小程序
和前篇同样进行HOG特征检测,Grabcut分割,BorderMatting边缘细化。测试
而后就是识别参照物,利用直方图均衡化提升对比度而后在进行剔除非阈值范围内的颜色。固然在进行处理以前,将RGB模型转变成HSV模型。该项目是基于小程序实现,因此用户再输入基本信息时须要输入参照物的长度和颜色。spa
void GCApplication::measureReferencePX() { Mat imgHSV; //黄、红、蓝 int index; if (color == "黄色") index = 0; else if (color == "红色") index = 1; else index = 2; int iLowH[3] = { 18,156,110 }; int iHighH[3] = { 38,180,130 }; //设置饱和度的范围值 int iLowS[3] = { 90,43,43 }; int iHighS = 255; //设置亮度的范围值 int iLowV[3] = { 90,46 ,46 }; int iHighV = 255; vector<Mat> hsvSplit; cvtColor(*image, imgHSV, COLOR_BGR2HSV); //BGR 转化成 HSV,由于直方图均衡化须要在HSV空间作 imshow("imgHSV1", imgHSV); split(imgHSV, hsvSplit); equalizeHist(hsvSplit[2], hsvSplit[2]); merge(hsvSplit, imgHSV); inRange(imgHSV, Scalar(iLowH[index], iLowS[index], iLowV[index]), Scalar(iHighH[index], iHighS, iHighV), imgThresholded); //图像的范围 imshow("Thresholded", imgThresholded); //开操做 (去除一些噪点) Mat element = getStructuringElement(MORPH_RECT, Size(5, 5)); //morphologyEx(imgThresholded, imgThresholded, MORPH_OPEN, element); //闭操做 (链接一些连通域) morphologyEx(imgThresholded, imgThresholded, MORPH_CLOSE, element); //计算参照物像素高度 int i, j; int flagA, flagB; flagA = flagB = 0; //从上面进行遍历 for (i = 0; i < imgThresholded.rows; i++) { for (j = 0; j < imgThresholded.cols; j++) if (imgThresholded.at<uchar>(i, j) == 255 && !flagA) // 标记第一个出现像素的像素点 { FA.x = j;//注意顺序,坐标原点位于左上角 FA.y = i; flagA = 1; break; } if (flagA) break; } //从下面进行遍历 for (i = imgThresholded.rows - 1; i > 0; i--) { for (j = 0; j < imgThresholded.cols; j++) if (imgThresholded.at<uchar>(i, j) == 255 && !flagB) // 标记第一个出现像素的像素点 { FB.x = j;//注意顺序,坐标原点位于左上角 FB.y = i; flagB = 1; break; } if (flagB) break; } imshow("Thresholded Image", imgThresholded); maxRefPX = FB.y - FA.y; }
而后也对人物前景进行二值化,遍历找到两组特征点。code
计算两个的比例系数K,而后根据参照物真实长度进行等比例计算。blog
通过系统的测试,如在系统的使用要求下(拍摄距离需2.5m外,测量人员身上携带颜色与参照物颜色不一样),偏差率在5‰。element