其他
【强基固本】一步步用c++实现harris角点检测
“强基固本,行稳致远”,科学研究离不开理论基础,人工智能学科更是需要数学、物理、神经科学等基础学科提供有力支撑,为了紧扣时代脉搏,我们推出“强基固本”专栏,讲解AI领域的基础知识,为你的科研学习提供助力,夯实理论基础,提升原始创新能力,敬请关注。
地址:https://www.zhihu.com/people/ban-zhuan-de-37
https://github.com/enazoe/toy/tree/master/harris
00
01
02
(1) 分别计算x和y方向的梯度Ix,Iy,和梯度的乘积Ixx,Iyy,Ixy
cv::Mat sobelx = (cv::Mat_<float>(3,3) << -1, 0, 1, -2, 0, 2, -1, 0, 1);
cv::Mat sobely = (cv::Mat_<float>(3,3) << -1, -2, -1, 0, 0, 0, 1, 2, 1);
cv::Mat Ix= filter_uchar(in_,sobelx);
cv::Mat Iy= filter_uchar(in_,sobely);
Ixx = Ix.mul(Ix);
Iyy = Iy.mul(Iy);
Ixy = Ix.mul(Iy);
(2) 使用窗口函数对Ixx,Iyy,Ixy进行高斯加权
Ixx = filter_float(Ixx,kernel);
Iyy = filter_float(Iyy,kernel);
Ixy = filter_float(Ixy,kernel);
(3) 遍历图像,在每个位置构建M矩阵,并计算响应值R
cv::Mat score_img(const cv::Mat &in_)
{
cv::Mat res = cv::Mat::zeros(in_.size(),CV_32FC1);
for (int r = 0; r < in_.rows; r++)
{
for(int c = 0; c < in_.cols; c++)
{
cv::Mat M = (cv::Mat_<float>(2,2)<<Ixx.at<float>(r,c),Ixy.at<float>(r,c),Ixy.at<float>(r,c),Iyy.at<float>(r,c));
float score = cv::determinant(M) - 0.05*cv::trace(M)[0]*cv::trace(M)[0];
res.at<float>(r,c) = score;
}
}
return res;
}
(4) 阈值化处理得到corners
void get_corners(const cv::Mat &res_,const float thresh_ ,std::vector<cv::Point> &corners_)
{
corners_.clear();
for (int r = 0; r < res_.rows; r++)
{
for(int c = 0; c < res_.cols; c++)
{
if (res_.at<float>(r,c)>thresh_)
{
corners_.emplace_back(c,r);
}
}
}
}
03
参考文献
https://www.bilibili.com/video/BV1Wb411b79B
https://senitco.github.io/2017/06/18/image-feature-harris/
http://www.cse.psu.edu/~rtc12/CSE486/lecture06.pdf
https://docs.opencv.org/master/dc/d0d/tutorial_py_features_harris.html
“强基固本”历史文章
深度学习与围棋:为围棋数据设计神经网络
最受欢迎的算法之一:反向传播训练
神经网络结构下理解Logistic Regression &TF框架下构造Logistic实现Mnist分类
深入探究MMD距离
机器学习常用评价指标总览
信息量、熵、相对熵(KL散度)、交叉熵
神经网络常用求导
深度学习算法收敛性证明之拓展SGD
看了这篇文章你还不懂SVM你就来打我
卷积神经网络(CNN)反向传播算法
边框回归(Bounding Box Regression)详解
《CV中的多视图几何》——相机模型与标定
AI 框架基础技术之自动求导机制 (Autograd)
主成分分析(PCA)
深度学习算法收敛性证明
更多强基固本专栏文章,
请点击文章底部“阅读原文”查看
分享、点赞、在看,给个三连击呗!