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