如何使用OpenCV中的SIFT提取的功能获取目标对象周围的矩形

Pun*_*nit 9 opencv object-detection sift

我在OpenCV中进行物体检测项目,包括将模板图像中的对象与参考图像进行匹配.使用SIFT算法,功能得到精确检测和匹配,但我想在匹配的功能周围使用直肠我的算法使用KD-Tree est ean First技术来获得匹配

Jav*_*ock 7

如果你想在检测到的对象周围有一个矩形,这里你有一个完全相同的代码示例.你只需要在单应性H周围画一个矩形.

希望能帮助到你.祝好运.


Mic*_*man 5

我使用以下代码,改编自OpenCV中的SURF算法(modules/features2d/src/surf.cpp)来提取关键点的周围环境.

除了基于矩形和ROI的其他示例之外,此代码还根据由特征检测算法(KeyPoint结构中可用的)确定的方向和比例返回正确定向的补丁.

几个不同图像的检测结果示例:

SIFT关键点补丁提取示例

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;
}
Run Code Online (Sandbox Code Playgroud)

我不确定秤是否完全正常,但它是从SURF源获取的,结果看起来与我相关.