Harris、Shi-Tomasi和亚像素角点都是角点,隶属于特征点这个大类(特征点可以分为边缘、角点、斑点).
一、Harris角点检测是一种直接基于灰度图像的角点提取算法,稳定性较高,但是也可能出现有用信息丢失的情况。
函数:cornerHarris()
void cv::cornerHarris | ( | InputArray | src, //需要为8位单通道 |
| | OutputArray | dst, //结果 |
| | int | blockSize, //领域大小 |
| | int | ksize, //Sobel孔径大小 |
| | double | k, //Harris参数 |
| | int | borderType = |
| ) | | |
Harris corner detector.
The function runs the Harris corner detector on the image. Similarly to cornerMinEigenVal and cornerEigenValsAndVecs , for each pixel (x, y) it calculates a 2\times2 gradient covariance matrix M^{(x,y)} over a \texttt{blockSize} \times \texttt{blockSize}
(特征点计算方法)
Corners in the image can be found as the local maxima of this response map.
src | Input single-channel 8-bit or floating-point image. |
dst | Image to store the Harris detector responses. It has the type CV_32FC1 and the same size as src . |
blockSize | Neighborhood size (see the details on cornerEigenValsAndVecs ). |
ksize | Aperture parameter for the Sobel operator. |
k | Harris detector free parameter. See the formula below. |
borderType | Pixel extrapolation method. See cv::BorderTypes. |
调用:
Mat srcGray = imread("e:/template/lena.jpg",IMREAD_GRAYSCALE);
//进行角点检测
Mat matHarris;
cornerHarris(srcGray,matHarris,2,3,0.01);
//显示
Mat matDst;
threshold(matHarris,matDst,0.00001,255,THRESH_BINARY);
imshow("matDst",matDst);
waitKey(0);
lena的结果:
二、Shi-Tomasi角点
一般认为是Harris的改进,因为当时提出的论文叫做《Good Features to Track》,所以这种角点再OpenCV中叫做goodFeatures
函数:goodFeaturesToTrack()
void cv::goodFeaturesToTrack | ( | InputArray | image,//输入图像 |
| | OutputArray | corners,//输出向量 |
| | int | maxCorners,//角点最大数量 |
| | double | qualityLevel,//角点检测可接受的最小特征值 |
| | double | minDistance,//角点之间的最小距离 |
| | InputArray | mask = |
| | int | blockSize = |
| | bool | useHarrisDetector = |
| | double | k = |
| ) | | |
Determines strong corners on an image.
The function finds the most prominent corners in the image or in the specified image region, as described in [154]
- Function calculates the corner quality measure at every source image pixel using the cornerMinEigenVal or cornerHarris .
- Function performs a non-maximum suppression (the local maximums in 3 x 3 neighborhood are retained).
- The corners with the minimal eigenvalue less than qualityLevel⋅maxx,yqualityMeasureMap(x,y)
- The remaining corners are sorted by the quality measure in the descending order.
- Function throws away each corner for which there is a stronger corner at a distance less than maxDistance.
The function can be used to initialize a point-based tracker of an object.
If the function is called with different values A and B of the parameter qualityLevel , and A > B, the vector of returned corners with qualityLevel=A will be the prefix of the output vector with qualityLevel=B .
image | Input 8-bit or floating-point 32-bit, single-channel image. |
corners | Output vector of detected corners. |
maxCorners | Maximum number of corners to return. If there are more corners than are found, the strongest of them is returned. |
qualityLevel | Parameter characterizing the minimal accepted quality of image corners. The parameter value is multiplied by the best corner quality measure, which is the minimal eigenvalue (see cornerMinEigenVal ) or the Harris function response (see cornerHarris ). The corners with the quality measure less than the product are rejected. For example, if the best corner has the quality measure = 1500, and the qualityLevel=0.01 , then all the corners with the quality measure less than 15 are rejected. |
minDistance | Minimum possible Euclidean distance between the returned corners. |
mask | Optional region of interest. If the image is not empty (it needs to have the type CV_8UC1 and the same size as image ), it specifies the region in which the corners are detected. |
blockSize | Size of an average block for computing a derivative covariation matrix over each pixel neighborhood. See cornerEigenValsAndVecs . |
useHarrisDetector | Parameter indicating whether to use a Harris detector (see cornerHarris) or cornerMinEigenVal. |
k | Free parameter of the Harris detector. |
调用:
Mat srcGray = imread("e:/template/lena.jpg",IMREAD_GRAYSCALE);
//进行角点检测
Mat matHarris;
vector<Point2f> corners;//输出向量
goodFeaturesToTrack(srcGray,corners,100,0.01,10,Mat(),3,false,0.04);
//显示
Mat matDst = srcGray.clone();
for (int i=0;i<corners.size();i++)
{
circle(matDst,corners[i],2,Scalar(255));
}
imshow("matDst",matDst);
waitKey(0);
结果:
可以看到,眼部、帽子上面的尖端这些的却是"GoodFeatures"的地方都被标注了出来
三、如果需要亚像素的角点,我们必须更进一步。
函数:cornerSubPix()
void cv::cornerSubPix | ( | InputArray | image, |
| | InputOutputArray | corners, |
| | Size | winSize, |
| | Size | zeroZone, |
| | TermCriteria | criteria |
| ) | | |
调用:需要注意现计算goodfeatures再算亚像素
Mat srcGray = imread("e:/template/lena.jpg",IMREAD_GRAYSCALE);
//进行角点检测
Mat matHarris;
vector<Point2f> corners;//输出向量
cv::goodFeaturesToTrack(
srcGray, // Image to track
corners, // Vector of detected corners (output)
MAX_CORNERS, // Keep up to this many corners
0.01, // Quality level (percent of maximum)
5, // Min distance between corners
cv::noArray(), // Mask
3, // Block size
false, // true: Harris, false: Shi-Tomasi
0.04 // method specific parameter
);
cv::cornerSubPix(
srcGray, // Input image
corners, // Vector of corners (input and output)
cv::Size(5, 5), // Half side length of search window
cv::Size(-1,-1), // Half side length of dead zone (-1=none)
cv::TermCriteria(
cv::TermCriteria::MAX_ITER | cv::TermCriteria::EPS,
20, // Maximum number of iterations
0.03 // Minimum change per iteration
)
);
//显示
Mat matDst = srcGray.clone();
for (int i=0;i<corners.size();i++)
{
circle(matDst,corners[i],2,Scalar(255));
cout<<"\t"<<"序号"<<i<<"亚像素坐标("<<corners[i].x<<","<<corners[i].y<<")"<<endl;
}
imshow("matDst",matDst);
waitKey(0);
结果:
可以看到其计算处理小数点后面的值。
四、小结
角点虽然现在用的比较少了,但是作为基本的知识有必要了解;下一步的更为复杂的特征点模型都是基于角点的,它们之间有着一脉相承的关系。