GoodFeaturesToTrack
性質是圖像處理技術函式
功能是確定圖像的強角點
基本介紹
- 外文名:GoodFeaturesToTrack
- 性質:圖像處理技術函式
- 功能:確定圖像的強角點
- 主要參數:image,eig_image等
函式簡介,函式套用,
函式簡介
GoodFeaturesToTrack
void cvGoodFeaturesToTrack( const CvArr* image, CvArr* eig_image, CvArr* temp_image,
CvPoint2D32f* corners, int* corner_count,
double quality_level, double min_distance,
const CvArr* mask=NULL,
int block_size = NULL,
int use_harris = 0,
double k = 0.4
);
image
輸入圖像,8-位或浮點32-比特,單通道
eig_image
臨時浮點32-點陣圖像,尺寸與輸入圖像一致
temp_image
另外一個臨時圖像,格式與尺寸與 eig_image 一致
corners
輸出參數,檢測到的角點
corner_count
輸出參數,檢測到的角點數目
quality_level
min_distance
限制因子。得到的角點的最小距離。使用 Euclidian 距離
mask
ROI:感興趣區域。函式在ROI中計算角點,如果 mask 為 NULL,則選擇整個圖像。
函式套用
函式 cvGoodFeaturesToTrack 在圖像中尋找具有大特徵值的角點。該函式,首先用cvCornerMinEigenVal 計算輸入圖像的每一個像素點的最小特徵值,並將結果存儲到變數 eig_image 中。然後進行非最大值抑制(僅保留3x3鄰域中的局部最大值)。下一步將最小特徵值小於 quality_level?max(eig_image(x,y)) 排除掉。最後,函式確保所有發現的角點之間具有足夠的距離,(最強的角點第一個保留,然後檢查新的角點與已有角點之間的距離大於 min_distance )。
block_size
use_harris
標誌位。當use_harris的值為非0,則函式使用Harris的角點定義;若為0,則使用Shi-Tomasi的定義。
k
實現的代碼如下所示:實用前請配置Opencv。
#include "cv.h"
#include "highgui.h"
#include "stdio.h"
#define max_corners 50
int main( int argc, char** argv )
{
int cornerCount=max_corners;
CvPoint2D32f corners[max_corners];
double qualityLevel = 0.05;
double minDistance = 5;
IplImage *srcImage = 0, *grayImage = 0, *corners1 = 0, *corners2 = 0;
int i;
CvScalar color = CV_RGB(255,0,0);
cvNamedWindow( "image", 1 ); //創建顯示視窗
//載入一副圖片
srcImage = cvLoadImage("F:\\新建資料夾\\imagetodep\\imagetodep\\3.2.jpg", 1); //為你圖片存放的位置
grayImage = cvCreateImage(cvGetSize(srcImage), IPL_DEPTH_8U, 1);
//將原圖灰度化
cvCvtColor(srcImage, grayImage, CV_BGR2GRAY);
//創建2個與原圖大小相同的臨時圖像
corners1= cvCreateImage(cvGetSize(srcImage), IPL_DEPTH_32F, 1);
corners2= cvCreateImage(cvGetSize(srcImage),IPL_DEPTH_32F, 1);
//角點檢測
cvGoodFeaturesToTrack (grayImage, corners1, corners2, corners,
&cornerCount, qualityLevel, minDistance, 0);
printf("num corners found: %d\n", cornerCount);
//在原圖中將角點標記出來
if(cornerCount>0)
{
for (i=0; i <cornerCount;++i){
cvCircle(srcImage, cvPoint((int)(corners[i].x), (int)(corners[i].y)), 6,
color, 2, CV_AA, 0);
}
}
cvShowImage( "image", srcImage );
cvReleaseImage(&srcImage);
cvReleaseImage(&grayImage);
cvReleaseImage(&corners1);
cvReleaseImage(&corners2);
cvWaitKey(0);
return 0;
}
#include "highgui.h"
#include "stdio.h"
#define max_corners 50
int main( int argc, char** argv )
{
int cornerCount=max_corners;
CvPoint2D32f corners[max_corners];
double qualityLevel = 0.05;
double minDistance = 5;
IplImage *srcImage = 0, *grayImage = 0, *corners1 = 0, *corners2 = 0;
int i;
CvScalar color = CV_RGB(255,0,0);
cvNamedWindow( "image", 1 ); //創建顯示視窗
//載入一副圖片
srcImage = cvLoadImage("F:\\新建資料夾\\imagetodep\\imagetodep\\3.2.jpg", 1); //為你圖片存放的位置
grayImage = cvCreateImage(cvGetSize(srcImage), IPL_DEPTH_8U, 1);
//將原圖灰度化
cvCvtColor(srcImage, grayImage, CV_BGR2GRAY);
//創建2個與原圖大小相同的臨時圖像
corners1= cvCreateImage(cvGetSize(srcImage), IPL_DEPTH_32F, 1);
corners2= cvCreateImage(cvGetSize(srcImage),IPL_DEPTH_32F, 1);
//角點檢測
cvGoodFeaturesToTrack (grayImage, corners1, corners2, corners,
&cornerCount, qualityLevel, minDistance, 0);
printf("num corners found: %d\n", cornerCount);
//在原圖中將角點標記出來
if(cornerCount>0)
{
for (i=0; i <cornerCount;++i){
cvCircle(srcImage, cvPoint((int)(corners[i].x), (int)(corners[i].y)), 6,
color, 2, CV_AA, 0);
}
}
cvShowImage( "image", srcImage );
cvReleaseImage(&srcImage);
cvReleaseImage(&grayImage);
cvReleaseImage(&corners1);
cvReleaseImage(&corners2);
cvWaitKey(0);
return 0;
}