前篇講過基於相機焦距和手機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