openCV 簡單實現身高測量(二)

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

 

相關文章
相關標籤/搜索