func GoodFeaturesToTrack(img Mat, corners *Mat, maxCorners int, quality float64, minDist float64)
*corners Mat
为角点检测后保存的角点数据,此Mat对象和其它的Mat对象不同,这里面放的是角点数据,不是图像数据,不能显示在窗口中
maxCorners int, quality float64, minDist float64
这几个参数是可调参数,以情况可调
void cv::goodFeaturesToTrack ( InputArray image,
OutputArray corners,
int maxCorners,
double qualityLevel,
double minDistance,
InputArray mask = noArray(),
int blockSize = 3,
bool useHarrisDetector = false,
double k = 0.04
)
这是c++中 opencv的源码,参数比gocv多了几个,多的参数都是默认值
image 输入8位或浮点32位单通道图像
corners 检测角点的输出向量
maxCorners 返回的最大角点个数
qualityLevel 图像角点最小可接受质量的参数
minDistance 返回角之间的最小可能欧几里得距离
blockSize 计算每个像素邻域上的导数协变矩阵的平均块的大小
useHarrisDetector 是否使用Harris检测器
k 哈里斯探测器的自由参数
opencv中的角点绘制方式网上有很多,这里就不做演示了
gocv中的角点绘制和opencv不同,不能用opencv中的方式去解析绘制角点
只要你用了心去学习,你94未来的大大
这里要解析mat对象,获取行列,你会发现这个mat对象只有1行多列,这里面存的就是角点
如果你是小白你完全不知道怎么获取这个mat对象中的角点
这个角点是32位,要用到下面这个方法,然后在Vecf这里去取
Vecf[0],Vecf[1]分别对应x,y坐标
func (m *Mat) GetVecfAt(row int, col int) Vecf
corners := gocv.NewMat()
gocv.GoodFeaturesToTrack(contMat, &corners, 200, 0.01, 10)
//绘制角点
for row := 0; row < corners.Rows(); row++ {
point := corners.Row(row)
for col := 0; col < point.Cols(); col++ {
vf := point.GetVecfAt(col, 0)//每一个point里只有一行一列
fmt.Println(vf[0], vf[1])
gocv.Circle(&contMat, image.Point{int(vf[0]), int(vf[1])}, 3, color.RGBA{25, 25, 255, 0}, -1)
}
}