opencv小案例一

[原文檔鏈接]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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容