1.Shi-Tomasコーナー検出原理
Shi-Tomasi (Good features to Track) コーナー検出アルゴリズムは、Harris コーナー検出アルゴリズムに基づいて改良されたコーナー検出方法であり、いくつかの欠点に対処するために改良されました。
Harris コーナー検出とは異なり、Shi-Tomasi はより単純化されたコーナー応答関数を使用します。コーナーポイントを評価するための基礎として、自己相関行列 M の小さい方の固有値 λmin が選択されます。
コーナー応答関数は、より小さい固有値です。
コーナーポイントの判定を図に示します。
- λ1 と λ2 が両方とも λmin 未満の場合、それは平面領域です
- λ1 と λ2 が両方とも λmin より大きい場合、それはコーナーポイントです
- λ1 と λ2 のどちらか一方のみが λmin より大きい場合、それはエッジ領域です。
2. Shi-Tomas のコーナーポイント関数 GoodFeatureToTrack() の検出
void cv::goodFeatureToTrack (InputArray 画像,
OutputArray のコーナー、
int maxCorners、
二重品質レベル、
最小距離を 2 倍にし、
InputArray マスク = noArray()、
int blockSize = 3、
bool useHarrisDetector =false、
ダブル k = 0.04
)
- コーナー: 検出されたコーナーポイントの出力量
- maxCorners: 検出されるコーナーポイントの数。
- qualityLevel: コーナー ポイントのしきい値と最良のコーナー ポイントの間の関係 (品質レベルとも呼ばれます)。パラメーターが 0.01 の場合、コーナー ポイントのしきい値が最良のコーナー ポイントの 0.01 倍であることを意味します。
- minDistance: 2 つのコーナーポイント間の最小ユークリッド距離
- マスク: コーナーポイントが検出される領域を示すマスク行列。
- blockSize: 勾配共分散行列のサイズを計算します。
- useHarrisDetector: ハリスコーナーポイントを使用するかどうか
- k: コーナー点のハリス検出時の一定重み係数
3. サンプルコード
void Tomas_f(Mat mat){
Mat gray;
cvtColor(mat,gray,COLOR_BGR2GRAY);
//提取角点
int maxCorners=100;//检测角点数目
double quality_level=0.01;//质量等级
double minDistance=0.04;//两个角点之间的最小欧式距离
vector<Point2f> corners;
goodFeaturesToTrack(gray,corners,maxCorners,quality_level,minDistance,Mat(),3, false);
//绘制角点
vector<KeyPoint> keyPoints;//存放角点的KeyPoint类,用于后期绘制角点时使用
for(int i=0;i<corners.size();i++){
//将角点存放在KeyPoint类中
KeyPoint keyPoint;
keyPoint.pt=corners[i];
keyPoints.push_back(keyPoint);
}
//用drwaKeyPoints()函数绘制角点坐标
drawKeypoints(mat,keyPoints,mat);
imwrite("/sdcard/DCIM/mat.png",mat);
}