函数说明:
void Canny( InputArray image, OutputArray edges,double threshold1, double threshold2,int apertureSize = 3, bool L2gradient = false );
image:输入图像
edges:输出图像
threshold1:像素值(最小值)
threshold2:像素值(最大值)
apertureSize:算法滤波核大小(3*3)
L2gradient:是否应用更精确的方式计算
void findContours( InputArray image, OutputArrayOfArrays contours,OutputArray hierarchy, int mode,int method, Point offset = Point());
image:原始图像
contours:检测到的轮廓的点的集合
hierarchy:记录轮廓之间的关系,四个维度:同级后一个轮廓的序号,同级上一个轮廓的序号,第一个孩子序号,父亲序号
mode:轮廓的检测方式
RETR_EXTERNAL仅仅检测外圈轮廓
RETR_LIST 检测全部轮廓,但是没有层级关系
RETR_CCOMP 仅仅两层包含关系,即只有外层和内层,假设有夹层,那么夹层也算外层,只要某个轮廓还包含轮廓,都算外部轮廓
RETR_TREE 检测所有的轮廓,并建议非常完整的层级关系
RETR_FLOODFILL无描述
method:轮廓点的存储方式
CHAIN_APPROX_NONE 相邻的轮廓点坐标只相差一个像素,所以是连续轮廓点
CHAIN_APPROX_SIMPLE 横,竖对角线段只保存断点数据,比如矩形就只保存四个顶点
CHAIN_APPROX_TC89_L1
CHAIN_APPROX_TC89_KCOS
//边缘检测:m_Mat是原始图像,m_Mat_OutPut是用来接收轮廓点的图像
Canny(m_Mat,m_Mat_OutPut,100,200);
//轮廓发现:扫描图像将轮廓点集全找出来
vector<vector<Point>>contours;
vector<Vec4i>hierachy;
findContours(m_Mat_OutPut,contours,hierachy,RETR_TREE,CHAIN_APPROX_SIMPLE,Point(0,0));
//遍历轮廓点:将符合条件的轮廓画到原始图像上
for (int i = 0; i < contours.size(); ++i) {
double area = contourArea(contours[i]);//轮廓面积
double length = arcLength(contours[i],false);//轮廓长度
if(area<1000&&length<1000){continue;}
drawContours(m_Mat,contours,i,Scalar(rand()%255,rand()%255,rand()%255));//
}
//图像显示
QImage img = cvMat_To_Qimage(m_Mat);
img = img.scaled(ui->label_3->geometry().width(),ui->label_3->geometry().height(),
Qt::KeepAspectRatio,Qt::SmoothTransformation);
ui->label_3->setPixmap(QPixmap::fromImage(img));