轮廓检测是个很麻烦的事情,需要排除各种环境因素,难以有普遍适用的标准,本程序也只是在不规则形状表面粗糙的工件轮廓检测中寻找到的较为适合的方法
首先进行平滑灰度化、然后进行Canny边缘检测、进行闭运算连接缺口平滑边缘、对内部填充、检测轮廓(去掉小轮廓)
网上找到的一些程序在findContours之前对图像进行二值化,感觉效果不佳,且需要反复调节阈值
直接进行Canny检测边缘图形效果更好
闭运算函数morphologyEx是图形学处理函数,可以有效平滑边缘
//轮廓提取
//invertColor(quad);//反色
blur(quad,quad,Size(3,3));//平滑
cvtColor(quad,gray,CV_RGB2GRAY);//灰度
imshow("gray",gray);
cv::Mat resultGray;
imshow("enhanced",gray);
//threshold(gray,bin,125, 255, CV_THRESH_BINARY);//二值化?
//canny sobel laplace算子检测边缘
Canny(gray,bin,20,100);
imshow("canny",bin);
//闭运算
Mat element3(3,3,CV_8U,Scalar(1));
Mat element5(5,5,CV_8U,Scalar(1));
Mat element7(7,7,CV_8U,Scalar(1));
morphologyEx(bin,bin,cv::MORPH_CLOSE,element5);
//填充 function:<imfill> in matlab
vector<vector<Point>> outline;
findContours(bin, outline,CV_RETR_LIST , CV_CHAIN_APPROX_NONE);
drawContours(bin, outline,
-1,//draw all contours
CV_RGB(255,255,255),
CV_FILLED,
1); //with a thickness of 2
imshow("temp",bin);
//查找轮廓
morphologyEx(bin,bin,cv::MORPH_CLOSE,element7);
outline.clear();
findContours(bin, outline,CV_RETR_EXTERNAL , CV_CHAIN_APPROX_NONE);
deleteShortContours(outline,100,9999);
finalcontours = Mat::zeros(quad.rows,quad.cols,CV_8UC3);
drawContours(finalcontours, outline,
-1,//draw all contours
CV_RGB(255,255,255),
1); //with a thickness of 2