92.角点与特征点介绍

目录

        1 角点概念

         2 关键点概念

        3 关键点的绘制函数drawKeypoints()

         4 用c++编写代码实现

        1 角点概念

        角点是图像中具有明显变化的位置,例如像素值的最大最小点、线段的顶点、孤立的边缘点等。一般有以下几种:

        1、灰度梯度的最大值对应的像素点;

        2、两条直线或者多条直线的交点;

        3、两条曲线或者多条曲线的交点;

        4、一阶梯度导数的最大值和梯度方向变化率最大的像素点;

        5、一阶导数最大值,但二阶导数为0的点。

        以下是一些常见的角点检测方法和相关概念:

  1. Harris 角点检测:Harris 角点检测是最早提出的角点检测算法之一。它通过计算图像中每个像素的灰度值的变化率,并结合窗口内的梯度信息,来判断该像素是否为角点。

  2. Shi-Tomasi 角点检测:Shi-Tomasi 角点检测是对 Harris 角点检测的改进。它引入了一个角点响应度函数,在选择关键点时根据响应度进行排序,选择最大的响应度作为关键点。

  3. FAST 角点检测:FAST(Features from Accelerated Segment Test)角点检测算法是一种高速的角点检测方法。它通过在像素周围的圆形邻域内进行像素值比较,来判断该像素是否为角点。

  4. AGAST 角点检测:AGAST(Adaptive and Generic Accelerated Segment Test)是对 FAST 角点检测算法的改进版本。它采用了自适应的方式来选择像素点,并加入了灰度权重,使得检测结果更稳定。

        这些方法都是常用的角点检测算法,每种方法都有其特点和适用场景。在实际应用中,可以根据需求选择适合的角点检测算法来提取图像中的角点信息。

         2 关键点概念

        图像中的关键点指的是图像中具有显著性、重要性或独特性的位置或特征。这些关键点通常是图像中某个物体的边缘、角点、纹理等特征点,可以用来描述和表征图像中的局部结构。

        3 关键点的绘制函数drawKeypoints()

        drawKeypoints()函数是OpenCV库中用于在图像上绘制关键点的函数。它可以帮助我们可视化和分析检测到的关键点。

        下面是drawKeypoints()函数在C++中的详细介绍:

void drawKeypoints(const Mat& image, const vector<KeyPoint>& keypoints,
 Mat& outImage, const Scalar& color = Scalar::all(-1), 
int flags = DrawMatchesFlags::DEFAULT )

参数说明:

image:输入图像,即要绘制关键点的图像。

keypoints:关键点向量,包含了检测到的关键点信息。

outImage:输出图像,在输入图像上绘制关键点后的结果图像。

color:关键点的颜色,默认为Scalar::all(-1),表示随机颜色。

flags:绘制标志,用于设置绘制关键点的方式和样式,默认值为DrawMatchesFlags::DEFAULT。
    DrawMatchesFlags::DEFAULT:默认方式,不进行特殊标记。
    DrawMatchesFlags::DRAW_OVER_OUTIMG:在输出图像上绘制关键点,而不是在输入图像上绘制。
    DrawMatchesFlags::DRAW_RICH_KEYPOINTS:绘制更丰富的关键点信息,例如显示关键点的方向和大小。
    DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS:不绘制单个的关键点。

        在绘制关键点的函数drawKeypoints的第二个参数为KeyPoints类。在OpenCV中,KeyPoint类用于表示图像中的关键点。下面是KeyPoint类的C++介绍:


class KeyPoint
{public:
    // 构造函数
    KeyPoint();
    KeyPoint(float x, float y, float size, float angle = -1, float response = 0, int octave = 0, int class_id = -1);

    // 成员变量
    float pt.x;            // 关键点的x坐标
    float pt.y;            // 关键点的y坐标
    float size;            // 关键点的尺度大小
    float angle;           // 关键点的方向角度
    float response;        // 关键点的响应强度
    int octave;            // 关键点所在的金字塔层级
    int class_id;          // 关键点的类别标识符
};
KeyPoint类包含了以下成员变量:
pt.x和pt.y:关键点的二维坐标(x,y)。
size:关键点的尺度大小。
angle:关键点的方向角度。
response:关键点的响应强度。
octave:关键点所在的金字塔层级。
class_id:关键点的类别标识符。

         4 用c++编写代码实现

        下面是使用C++编写的drawKeypoints()函数的示例代码:

#include <opencv2/opencv.hpp>
#include<iostream>


cv::RNG rng(10000);
int main()
{
    cv::Mat image = cv::imread("lena.png"); // 读取图像,注意替换为你自己的图像路径

    std::vector<cv::KeyPoint> keypoints; // 关键点容器
    // 假设这里有一些方法检测到了关键点,并将其存储在keypoints中


    for (int i = 0; i < 50; i++)
    {
        cv::KeyPoint keypoint;
        keypoint.pt.x = rng.uniform(0, image.cols - 1);
        keypoint.pt.y = rng.uniform(0, image.rows - 1);
        keypoints.push_back(keypoint);
    }

    cv::Mat output;
    cv::Scalar color(0, 255, 0); // 绘制关键点的颜色,这里使用绿色

    // 在图像上绘制关键点
    cv::drawKeypoints(image, keypoints, output, color, cv::DrawMatchesFlags::DEFAULT);

    cv::imshow("input", image); // 显示结果图像
    cv::imshow("Output", output); // 显示结果图像
    cv::waitKey(0);

    return 0;
}

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
【资源说明】 1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料学习借鉴。 3、本资源作为“参考资料”如果需要实现其他功能,需要能看懂代码,并且热爱钻研,自行调试。 基于MATLAB的车牌字符识别源码+项目说明.zip # 基于Matlab的车牌字符识别 # 文件说明: ### 无数据扩充程序:Featrue1.m-Featrue6.m,test.m,Char_Index.txt ### 有数据扩充程序:Featrue11.m-Featrue66.m,test1.m,Char_Index_kuochong.txt ### main.m为主程序,Char_Index_Err.txt为需要人工校正的字符名称列表 ## 使用工具:Matlab,libsvm3.2.2 本文主要通过以下几个方面进行介绍: - **数据预处理** - **特征提取** - **模型训练与测试** - **模型优化** 本案例是通过SVM分类器对样本进行训练与测试,达到识别车牌字母、数字及汉字的目的。关于SVM的原理这里就不多赘述了,想了解的同学可以看下陈老师的SVM讲解,写的细致且易懂。 [耳东陈:零基础学SVM—Support Vector Machine(一)](https://zhuanlan.zhihu.com/p/24638007) 数据集是已经分割好的车牌字符,共有1000张车牌字符图片,大小均为47*92,两个txt文本文件分别包含所有字符和需要手工校正的字符图片的名字及对应的类别。 ### 1.数据预处理 将字符图像进行二值化操作,将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果的过程,而在Matlab中,一幅二值图像是一个取值只有0和1的逻辑数组。通常做法是先把彩色图像转化为灰度图像,再转化为呈现黑白的二值图像,此处我是直接将彩色RGB图转化为二值图,因为与后面的手工校正相关联。当转化完你会发现,大部分字符图像变为黑底白字,但是还有小部分为白底黑字,所以还需将此部分的图像进行反转处理,代码如下: ``` %读取文件 [input1, input2, input3] = textread('Char_Index.txt','%d %d %s',1000, 'headerlines',1); indexFileName = input3; for k=1:1000 A=imread(strcat('Char_Image/',char(indexFileName(k,1)))); t=graythresh(A);%设置阈值 B=im2bw(A,t);%将灰度图转化为二值图 %以图像左上角为原点,向下为x轴,向右为y轴,四个角的值大于等于2,即有2及以上为白点的,进行反转 [a,b]=size(B); if(B(1,1)+B(1,b)+B(a,1)+B(a,b)>=2) for i=1:a for j=1:b B(i,j)=1-B(i,j); end end end imwrite(B,strcat('Char_Image_Binary/',char(indexFileName(k,1)))); end ``` 经过上述步骤(二值化,反转),大部分字符已经转为黑底白字,但仍有小部分顽固字符宁死不屈,这里便进行人工校正。你可能会认为人工参与成本高,仅限于小数据量样本,并且项目上线后会不断地产生同样问题,所以这并完美,那么设想下,如果能实现全自动不就解决此问题了吗?该采取什么方法?这里先卖个关子,后面优化部分会跟大家分享。下图为人工筛选出的白底黑字部分字符名称。 这里要做的,仅仅是将这14张字符进行图片反转即可,最终得到全部的黑底白字的车牌字,代码如下: ``` [input] = textread('Char_Index_Err.txt','%s',14); indexFileName = input; for k=1:14 A=imread(strcat('Char_Image_Binary/',char(indexFileName(k,1)))); t=graythresh(A); B=im2bw(A,t); [a,b]=size(B); for i=1:a for j=1:b B(i,j)=1-B(i,j); end end imwrite(B,strcat('Char_Image

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

别叭叭儿—好好学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值