天天看點

儀表盤刻度檢測

圖像群裡有人提出了一個在附件圖檔中定位刻度的問題,發現原圖是已經完成很好二值化處理的圖檔,簡單做了下嘗試,好久沒寫了,希望大神指出錯誤

void dashboard()//儀表盤

{

    cv::Mat src = imread("D:\\GitHub\\cuidraw2015\\Debug\\image.jpg", CV_LOAD_IMAGE_COLOR);

    if (!src.empty())

    {

        cv::Mat mvs[3];

        cv::split(src, mvs);

        cv::Mat &r = mvs[0];

        Mat kennel;

        Mat mask = Mat::zeros(src.size(), CV_8UC1);  //建一個純黑圖像(mask的大小同src1的大小相同)

        kennel = getStructuringElement(MORPH_RECT, cv::Size(9, 9));

        cv::dilate(r, mask, kennel);

        cv::erode(mask, mask, kennel);

        cv::Mat inversedMat = 255 - r;

        kennel = getStructuringElement(MORPH_RECT, cv::Size(3, 3));

        cv::erode(inversedMat, inversedMat, kennel);

        cv::dilate(inversedMat, inversedMat, kennel);

        cv::adaptiveThreshold(inversedMat, inversedMat, 255, CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY_INV, 3, 15);

        std::vector< std::vector<cv::Point> > contours_list;

        std::vector<cv::Vec4i> hierarchy;

        cv::findContours(inversedMat, contours_list, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE, cv::Point(0, 0));

        if (!contours_list.empty() && !hierarchy.empty())

        {

            for (int idx = 0; idx < contours_list.size(); idx++)

            {

                //填充輪廓函數

                Scalar color(255, 255, 255);

                drawContours(src, contours_list, idx, color, CV_FILLED);

            }

        }

        cv::split(src, mvs);

        r = mvs[0];

        Mat dst;

        cv::absdiff(r, mask, dst);

        kennel = getStructuringElement(MORPH_RECT, cv::Size(3, 3));

        cv::erode(dst, dst, kennel);

        cv::adaptiveThreshold(dst, dst, 255, CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY_INV, 3, 15);

        cv::findContours(dst, contours_list, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE, cv::Point(0, 0));

        src = imread("D:\\GitHub\\cuidraw2015\\Debug\\image.jpg", CV_LOAD_IMAGE_COLOR);

        if (!contours_list.empty() && !hierarchy.empty())

        {

            for (int idx = 0; idx < contours_list.size(); idx++)

            {

                //填充輪廓函數

                Scalar color(0, 0, 255);

                drawContours(src, contours_list, idx, color);

            }

        }

        imshow("resultImage", src);

        //等待直到有鍵按下

        waitKey(0);

        //銷毀MyWindow的視窗

        destroyAllWindows();

    }

}

繼續閱讀