计算机视觉-OpenCV源码解析--Kitchen-Rosenfeld角点检测应用(源码下载以及用到的知识都将链接放在了文章里)

最近开始学习“计算机视觉”,打算每天学习一个OpenCV算法,并将测算法用到的知识都写到博客里面进行备份,以供日后需要的时候查阅。

Kitchen-Rosenfeld角点检测应用

1、此算法应用实例的下载

1.1、应用代码的下载

git clone  https://github.com/bbclr20/OpenCV-Corner-Feature-Examples.git

此链接的代码质量非常严谨,在这里强烈推荐根据此代码学习这个算法的应用。
在这里附上一份自己对照着码了一遍的算法,也供不方便下载的读者进行 Ctrl +C / V.

详细代码

#include<opencv2/opencv.hpp>
#include<iostream>
using namespace std ;
using namespace cv ;
int main(int argc, char **argv)
{
    Mat src,gray,color_edge;
    src = imread("/home/lm/CLionProjects/Kitchen-Rosenfeld/chessboard.png");
    if( !src.data ){
        return -1;
    }
    cvtColor(src,gray,CV_BGR2GRAY);
    GaussianBlur(gray,gray,Size(9,9),3,3);
    Mat corners,dilated_corners;  ////  接下来进行 Kitchen-Rosenfeld角点检测,得到corners变量
    preCornerDetect(gray,corners,5);  /// 最后一个参数表示:孔径尺寸
    dilate(corners,dilated_corners,Mat());  ////  进行遍历所有的像素,根据所设的阈值,对角点进行花圈处理
    for (int j = 0; j < src.rows ; j++) {
        /// 取每一行的首地址指针
        const float* tmp_data = (const float*)dilated_corners.ptr(j);  // 其实这一步取的是:一个数组,所以才有了下面的循环
        const float* corners_data = (const float*) corners.ptr(j);
        for (int i = 0; i < src.cols; i++) {
            ///  在这里设定非极大值抑制,并且要满足阈值条件,阈值设定为0.027,膨胀处理的结果如果等于角点,则说明该角点是在3*3邻域内的最大值
            if(tmp_data[i] > 0.027 && corners_data[i] == tmp_data[i])
            {
                circle(src,Point(i,j),5,Scalar(0,0,255),-1,8,0);
            }

        }

    }
   // namedWindow("Kitchen-Rosenfeld_Practice",CV_WINDOW_AUTOSIZE);     /// 在这里后一个参数是设置窗口的大小所用
    imshow("Kitchen-Rosenfeld",src);
    waitKey(0);
    return 0;
}

2、 与该算法相关的一些知识

2.1、cvtColor 函数的使用

这是一个 颜色转换空间函数,关于这个函数的使用,在这里就不浪费口舌了,在这里贴一个自己认为写的很好的博客,这位博主分析的很到位。如果有疑问,烦请移驾去学习一下。
https://blog.csdn.net/keith_bb/article/details/53470170#commentBox

2.2、GaussianBlur() 函数的使用

高斯滤波是一种线性平滑滤波,对于除去高斯噪声有很好的效果
高斯滤波是对整幅图像进行加权平均的过程,每一个像素点的值都由其本身和邻域内的其他像素值经过加权平均后得到
https://www.cnblogs.com/ilym/p/8059712.html
高斯函数扫盲贴:
https://blog.csdn.net/ccblogger/article/details/73065044#commentBox

2.3、dilate( ) 函数/膨胀处理

首先,浅显的理解膨胀/腐蚀算法,可以去这个博客
https://blog.csdn.net/qq_39689802/article/details/78006173
博主讲的还是很清楚的,还有一些应用实例。
在函数的具体使用上,请看
https://blog.csdn.net/qq_41553038/article/details/80048510

3、额外的一些注意点

3.1、 关于C++中: int main(int argc, char** argv)的解读

通俗一点讲,这里的意思是表示程序里面的参数个数和存储参数数组
前者可接受 命令行参数,argc表示参数个数, argv[]是参数数组,其中第0个参数是程序本身的名称(包含路径)。
argv[]是一个字符数组.
argv[0]:指向程序的全路径名
argv[1]:指向在DOS命令行中执行程序名后的第一个字符串。
argv[2]:指向第二个字符串。

相关的博客:
https://blog.csdn.net/github_35160620/article/details/51708659

猜你喜欢

转载自blog.csdn.net/qq_18649781/article/details/86080470