一、概述
案例:使用goodFeaturesToTrack实现角点检测
特点:goodFeaturesToTrack的检测速度比cornerHarris角点检测的速度更加快速,且API的使用更加方便
goodFeaturesToTrack(src,corners,maxCorners,quality_level,min_distance,Mat(),block_size,use_harris,k);
1.src:输入图像,输入的图像必须是8位或32位单通道图像
2.corners:输出的角点使用vector<Point2f>存储
3.maxCorners:最大角点数目,也就是corners集合中能存放的最大交点数,也就是最强的前corners个角点
4.quality_level:质量水平系数,是0.01~1之间的系数,其中系数越大检测到的角点就越少,反之亦然
5.min_distance:角点之间的最小距离,小于此距离的角点会被忽略,距离越大有可能检测到的角点就越少
6.Mat()掩码,mask=0忽略,基础用法忽略即可
7.block_size:Sobel算子,使用的邻域,四邻域,八邻域等 3,5,7
9.user_harris:是否使用harris检测,true是,false否
10.k:harris角点检测时使用一般为0.04,user_harris=false时此参数会被忽略
角点检测步骤:
1.加载原图
2.图像灰度化
3.执行角点检测
4.绘制角点并显示图像
二、代码示例
updateParams(min_distanceEidt->text().toDouble(),block_sizeEdit->text().toInt()); src = imread(filePath.toStdString().c_str());//加载原图 if(src.empty()){ qDebug()<<"Error file is empty"; return; } // imshow("src",src); cvtColor(src,gray,COLOR_BGR2GRAY);//转为灰度图 // imshow("gray",gray); //执行角点检测 vector<Point2f> corners;//检测出的角点 goodFeaturesToTrack(gray,corners,maxCorners,quality_level,min_distance,Mat(),block_size,use_harris,k); //将角点绘制出来 for(size_t t = 0;t<corners.size();t++){ circle(src,corners[t],3,Scalar(0,0,255),1,LINE_8); } QImage image = ImageUtils::matToQImage(src); QPixmap pixmap = QPixmap::fromImage(image); QGraphicsPixmapItem *item = new QGraphicsPixmapItem(pixmap.scaled(this->size(),Qt::KeepAspectRatio,Qt::SmoothTransformation)); scene.addItem(item);
三、演示图片