c++-OpenCV KeyPoint 位置 坐标 改变 错误

问题描述

OpenCV KeyPoint 位置 坐标 改变 错误

KeyPoint
位置 坐标 错误
怎么改变

class Patch {

public:
Patch() :angle(0)
{
}
float operator-(Patch rhs)
{
float sum = 0.f;
for (int i = 0; i < 16 * 16; ++i)
{
if (this->patches[i] - rhs.patches[i]>0)
sum += (this->patches[i] - rhs.patches[i]);
else
sum -= (this->patches[i] - rhs.patches[i]);
}
return (sum);
}

/*Patch(Patch &rhs)
{
    for (int i = 0; i < 16 * 16; ++i)
        this->patches[i] = rhs.patches[i];
    this->x = rhs.x;
    this->y = rhs.y;
    this->flag = rhs.flag;
    this->octave = rhs.octave;
    this->angle = rhs.angle;
}*/

float patches[256];
float x, y;
int flag;
int octave;
float angle;
float size;

};

void Operation::getPatchCoarse()
{
float y, x, _x, _y;
int sample_x, sample_y;
float co, si;
num = 0;

cv::KeyPoint *p = &keypoints[index];

x = p->pt.x;
y = p->pt.y;

for (int i = -24; i <= 24; i += 2)
for (int j = -24; j <= 24; j += 2)
{
    count = 0;
    float temp;
    _x = x + i;
    _y = y + j;
    temp = _x > 0 ? _x : 0;
    temp = temp < grayImg.cols ? temp : grayImg.cols;
    patchC[num].x = temp;
    temp = _y > 0 ? _y : 0;
    temp = temp < grayImg.rows ? temp : grayImg.rows;
    patchC[num].y = temp;
    co = cos(p->angle);
    si = sin(p->angle);

    //psize = p->size;

    for (int k = -8; k <= 8; ++k)
    {
        for (int l = -8; l <= 8; ++l)
        {
            //Get coords of sample point on the rotated axis
            sample_x = cvRound(_x + (-l*si + k*co));
            sample_y = cvRound(_y + (l*co + k*si));
            sample_x = sample_x > 0 ? sample_x : 0;
            sample_y = sample_y > 0 ? sample_y : 0;
            sample_x = sample_x < grayImg.cols ? sample_x : grayImg.cols;
            sample_y = sample_y < grayImg.rows ? sample_y : grayImg.rows;

            patchC[num].patches[count++] = grayImg.at<unsigned char>(sample_y, sample_x);
        }
    }
    num++;
}

}
////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////
void Operation::getPatchFine()
{
float y, x;
int sample_x, sample_y;
float co, si, _x, _y;
num = 0;

rhs;
x = rhs.x;
y = rhs.y;

for (float i = -1.75; i <= 1.75; i += 0.25)
for (float j = -1.75; j <= 1.75; j += 0.25)
{
    count = 0;
    float temp;
    _x = x + i;
    _y = y + j;
    temp = _x > 0 ? _x : 0;
    temp = temp < grayImg.cols ? temp : grayImg.cols;
    patchF[num].x = temp;
    temp = _y > 0 ? _y : 0;
    temp = temp < grayImg.rows ? temp : grayImg.rows;
    patchF[num].y = temp;
    co = cos(rhs.angle);
    si = sin(rhs.angle);

    psize = rhs.size;

    for (int k = -8; k <= 8; ++k)
    {
        for (int l = -8; l <= 8; ++l)
        {
            //Get coords of sample point on the rotated axis
            sample_x = cvRound(_x + (-l*si + k*co));
            sample_y = cvRound(_y + (l*co + k*si));

            sample_x = sample_x > 0 ? sample_x : 0;
            sample_y = sample_y > 0 ? sample_y : 0;
            sample_x = sample_x < grayImg.cols ? sample_x : grayImg.cols;
            sample_y = sample_y < grayImg.rows ? sample_y : grayImg.rows;

            patchF[num].patches[count++] = grayImg.at<unsigned char>(sample_y, sample_x);
        }
    }
    num++;
}

}

////////////////////////////////////////////////////////////
void Operation::propagation()
{
float minSAD = FLT_MAX, SAD, thresh = 7200;
unsigned int minIdx = 0, min_Idx = 0;

size = int(keypoints.size());

for (index = 0; index < size; index++)
{
    if (!patches[index].flag)continue;

    getPatchCoarse();

    for (unsigned int i = 0; i < 625; i++)
    {
        SAD = patches[index] - patchC[i];
        if (SAD < minSAD)
        {
            minSAD = SAD;
            minIdx = i;
        }
    }
    rhs = patchC[minIdx];
    getPatchFine();

    for (unsigned int j = 0; j < 225; j++)
    {
        SAD = patches[index] - patchF[j];
        if (SAD < minSAD)
        {
            minSAD = SAD;
            min_Idx = j;
        }
    }
    rhs = patchF[min_Idx];

    if (minSAD < thresh)
    {
        for (int k = 0; k < 16 * 16; ++k)
            patches[index].patches[k] = rhs.patches[k];
        keypoints[index].pt = cv::Point2f(rhs.x, rhs.y);
        patches[index].x = rhs.x;
        patches[index].y = rhs.y;
    }
    else
    {
        keypoints[index].class_id = 0;
        patches[index].flag = 0;
    }
}

}

void Operation::getPatch()
{
int sample_x, sample_y, count;
float co, si, y, x;

patches.clear();

size = unsigned int (keypoints.size());
patches.resize(size);
for (index = 0; index < unsigned int(keypoints.size()); index++)
{

    cv::KeyPoint *kp = &keypoints[index];

    count = 0;
    newPatch.flag = 1;
    newPatch.octave = kp->octave;
    newPatch.angle = kp->angle;
    x = kp->pt.x;
    y = kp->pt.y;

    psize = kp->size;
    newPatch.size = psize;

    newPatch.x = kp->pt.x;
    newPatch.y = kp->pt.y;
    co = cos(kp->angle);
    si = sin(kp->angle);

    for (int k = -8; k <= 8; ++k)
    {
        for (int l = -8; l <= 8; ++l)
        {
            //Get coords of sample point on the rotated axis
            sample_x = cvRound(x + (-l*si + k*co));
            sample_y = cvRound(y + (l*co + k*si));

            sample_x = sample_x > 0 ? sample_x : 0;
            sample_y = sample_y > 0 ? sample_y : 0;
            sample_x = sample_x < grayImg.cols ? sample_x : grayImg.cols;
            sample_y = sample_y < grayImg.rows ? sample_y : grayImg.rows;

            newPatch.patches[count] = grayImg.at<unsigned char>(sample_y, sample_x);
            count++;
            if (count>size)break;
        }
    }
    patches[index] = newPatch;
}

}

解决方案

改变后,关键点集中显示在主对角线上半部分, 关键点坐标 的 x与y 很相近

解决方案二:

时间: 2024-08-03 01:54:16

c++-OpenCV KeyPoint 位置 坐标 改变 错误的相关文章

struts2.0-求助struts2 checkbox位置如何改变

问题描述 求助struts2 checkbox位置如何改变 我的复选框总是和文字重合,怎么办,如何把复选框弄到文字后面 <tr> <td>商品名称:</td> <td><s:property value="goodsname" /><s:checkbox cssClass="checkbox" name="checkbox" filevalue="goodsid"

硬件-有未经处理的异常0xc0000005,读取位置0x00a97000发生错误

问题描述 有未经处理的异常0xc0000005,读取位置0x00a97000发生错误 有未经处理的异常0xc0000005,读取位置0x00a97000发生错误 解决方案 代码中有指针操作不合法,你多看看你的代码是否有指针越界等操作行为 解决方案二: 0x00AE18F8 处有未经处理的异常: 0xC0000005: 读取位置 0x00000020 时发生访问冲突.OSG 有未经处理的异常: 0xC0000005: 读取位置 0xcdcdcdcd 时发生访问冲突0x5afd57aa处有未经处理的

一个关于监控内存使用情况,CPU温度的程序不定时间,不定位置的出现错误,可能会是什么问题?

问题描述 一个关于监控内存使用情况,CPU温度的程序不定时间,不定位置的出现错误,可能会是什么问题? 面试时,面试官问了一道这么问题,小弟我什么项目都没接触过,因此不知道,希望大家给解决一下. 解决方案 这只能说面试官在暗示你,我们这个公司比较牛,你要有心理准备,我们不但写的程序没有测试,而且也不带使用调试器的. 解决方案二: 其他程序占用了CPU,你的监控程序在运行的时候因为没有机会让CPU执行而记录的数据不能及时更新?

qgraphicsitem 坐标-有没有QGraphicsItem坐标改变就相应的函数,求解答!

问题描述 有没有QGraphicsItem坐标改变就相应的函数,求解答! 有没有QGraphicsItem坐标改变就相应的函数,求解答!

android帧动画,移动位置,缩放,改变透明度等动画讲解

1.苦逼的需求又来了,需要实现一些动画效果,第一个想到的是播放gif图片,但是这样会占包的资源,并且清晰度不高,于是想着程序实现,自己用帧动画+缩放+移动+透明度 实现了一些想要的效果,这里跟大家分享一下 2.效果图如下:      3.帧动画实现代码     1).首先获取每帧显示的ImageView控件,然后把所有帧放到AnimationDrawable对象里面去,开启动画,通过handle延时2秒关闭动画 ImageView ivFrame = (ImageView) findViewBy

php“内存位置访问无效”错误的解决办法

配置环境如下: Win2003SP2+IIS6+php5.26+mysql5.0.51a+zend3.3a+PhpMyAdmin2.11.7.1 PHP执行方式:isapi.Mysql为手动安装. 关于"内存位置访问无效"的错误解决办法与步骤:(一些部份无效的调试步骤略过..) 一.将IIS的错误显示打开,未发现错误原因! 二.检查IIS扩展,ISAPI.php.ini与Mysql配置以及相应的安装目录ACLs权限,均无误. 三.回收IIS进程,错误仍然出现"内存位置访问无效

获取鼠标的位置/坐标

使用JavaScript 如何获取鼠标的位置呢? 获取光标的位置   获取鼠标坐标 先看效果  核心方法: Js代码   /***   * 返回鼠标的坐标   * @param e   * @returns {{x: (Number|pageX|*), y: (Number|pageY|*)}}   */   var getCoordInDocument = function(e) {       e = e || window.event;       var x = e.pageX || (

php出现内存位置访问无效错误问题解决方法_php技巧

配置环境如下: Win2003SP2+IIS6+php5.26+mysql5.0.51a+zend3.3a+PhpMyAdmin2.11.7.1 PHP执行方式:isapi.Mysql为手动安装. 关于"内存位置访问无效"的 错误解决办法与步骤:(一些部份无效的调试步骤略过..) 一.将IIS的错误显示打开,未发现错误原因! 二.检查IIS扩展,ISAPI.php.ini与Mysql配置以及相应的安装目录ACLs权限,均无误. 三.回收IIS进程,错误仍然出现"内存位置访问无

相对位置不改变-android如何实现容器等比例放大,内部子控件也等比例放大,而且相对位置不发生改变

问题描述 android如何实现容器等比例放大,内部子控件也等比例放大,而且相对位置不发生改变 android如何实现容器等比例放大,内部子控件也等比例放大,而且相对位置不发生改变,求大神解答 解决方案 动态设置容器和自控件的LayoutParams,抽取基数,抽取倍数就可以了,根据基数乘以倍数就是最后的大小