[原文檔鏈接]http://www.itdecent.cn/p/33728ba5827d
[先碼上 輪廓線間距離]
項目要求
尋找下面這幅圖片之中兩條白線之間的距離
得到每個點到對面線段的最小距離
求解平均距離
求解最中心距離
思路:
1.灰度后去干擾
2.利用labels提取兩邊輪廓
3.輸出結(jié)果存儲YLM
后期待解決
1.標簽labels疑問
2.距離提取問題
代碼一:[圖片讀取]
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
int main()
{
Mat src, gray_src;
src = imread("C:\\Users\\13658\\Desktop\\圖片素材\\線條.jpg");
if (!src.data)
{
printf("can not find image file..\n");
return -1;
}
代碼二:[連通域處理]
cvtColor(src, gray_src, COLOR_BGR2GRAY);
//閾值處理消去噪點,也可以高斯模糊處理
threshold(gray_src, gray_src, 200, 255, CV_THRESH_BINARY | CV_THRESH_OTSU);
//提取連通域
Mat labels;
connectedComponents(gray_src, labels, 8, CV_16U);
Mat result(gray_src.size(),CV_32FC1,Scalar::all(0));
for (int i=0;i<=1;i++)
{
Mat mask1 = labels == 1 + i;//提取標簽信息,當滿足條件返回255,不滿足返回0
Mat mask2 = labels == 1 + (1 - i);
Mat masknot;
bitwise_not(mask1, masknot);
namedWindow("mask1", CV_WINDOW_AUTOSIZE);
imshow("mask1", mask1);//右
namedWindow("mask2", CV_WINDOW_AUTOSIZE);
imshow("mask2",mask2);//左
Mat dist;
distanceTransform(masknot, dist, DIST_L2, CV_8U);
dist.copyTo(result, mask2);//核心,直接提取距離信息
}
FileStorage fs("distCtr.yml", FileStorage::WRITE);
fs << "Image" << result;
fs.release();
namedWindow("src",CV_WINDOW_AUTOSIZE);
imshow("src",src);
waitKey(0);
return 0;
}
[mask1 mask2 ]

mask1 右.png

mask2 左.png

src線條.jpg
[新應(yīng)用填充與反填充]

填充與反填充效果.png