我正在 OpenCV 中进行对象检测项目,其中包括将模板图像中的对象与参考图像匹配。使用 SIFT 算法可以准确地检测和匹配特征,但我想要一个围绕匹配特征的矩形我的算法使用 KD-Tree est ean First 技术来获得匹配
问问题
5296 次
2 回答
5
我使用以下代码改编自 OpenCV 中的 SURF 算法(modules/features2d/src/surf.cpp)来提取关键点的周围环境。
除了基于矩形和 ROI 的其他示例之外,此代码根据特征检测算法确定的方向和比例(均在KeyPoint
结构中可用)返回正确定向的补丁。
几个不同图像上的检测结果示例:
const int PATCH_SZ = 20;
Mat extractKeyPoint(const Mat& image, KeyPoint kp)
{
int x = (int)kp.pt.x;
int y = (int)kp.pt.y;
float size = kp.size;
float angle = kp.angle;
int win_size = (int)((PATCH_SZ+1)*size*1.2f/9.0);
Mat win(win_size, win_size, CV_8UC3);
float descriptor_dir = angle * (CV_PI/180);
float sin_dir = sin(descriptor_dir);
float cos_dir = cos(descriptor_dir);
float win_offset = -(float)(win_size-1)/2;
float start_x = x + win_offset*cos_dir + win_offset*sin_dir;
float start_y = y - win_offset*sin_dir + win_offset*cos_dir;
uchar* WIN = win.data;
uchar* IMG = image.data;
for( int i = 0; i < win_size; i++, start_x += sin_dir, start_y += cos_dir )
{
float pixel_x = start_x;
float pixel_y = start_y;
for( int j = 0; j < win_size; j++, pixel_x += cos_dir, pixel_y -= sin_dir )
{
int x = std::min(std::max(cvRound(pixel_x), 0), image.cols-1);
int y = std::min(std::max(cvRound(pixel_y), 0), image.rows-1);
for (int c=0; c<3; c++) {
WIN[i*win_size*3 + j*3 + c] = IMG[y*image.step1() + x*3 + c];
}
}
}
return win;
}
我不确定比例是否完全正常,但它取自 SURF 源,结果看起来与我相关。
于 2012-01-17T15:11:55.080 回答