opencv学习(二十八)①cornerHarris②8位convertScaleAbs③Shi_Tomas角点检测goodFeaturesToTrack④亚像素级精度角点检测cornerSubPix

1,Harris角点检测cornerHarris

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

实例1,Harris角点检测cornerHarris



//---------------------------------【头文件、命名空间包含部分】----------------------------
//      描述:包含程序所使用的头文件和命名空间
//------------------------------------------------------------------------------------------------
#include <opencv2/opencv.hpp>
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
using namespace cv;
using namespace std;


//-----------------------------------【宏定义部分】--------------------------------------------  
//  描述:定义一些辅助宏  
//------------------------------------------------------------------------------------------------  
#define WINDOW_NAME1 "【程序窗口1】"        //为窗口标题定义的宏  
#define WINDOW_NAME2 "【程序窗口2】"        //为窗口标题定义的宏  

//-----------------------------------【全局变量声明部分】--------------------------------------
//      描述:全局变量声明
//-----------------------------------------------------------------------------------------------
Mat g_srcImage, g_srcImage1, g_grayImage;
int thresh = 70; //当前阈值
int max_thresh = 175; //最大阈值


 //-----------------------------------【全局函数声明部分】--------------------------------------
 //     描述:全局函数声明
  //-----------------------------------------------------------------------------------------------
void on_CornerHarris(int, void*);//回调函数


//-----------------------------------【main( )函数】--------------------------------------------
//      描述:控制台应用程序的入口函数,我们的程序从这里开始执行
//-----------------------------------------------------------------------------------------------
int main(int argc, char** argv)
{
    //【0】改变console字体颜色
    system("color 3F");

    //【1】载入原始图并进行克隆保存
    g_srcImage = imread("D://1.jpg", 1);
    if (!g_srcImage.data) { printf("读取图片错误,请确定目录下是否有imread函数指定的图片存在~! \n"); return false; }
    imshow("原始图", g_srcImage);
    g_srcImage1 = g_srcImage.clone();

    //【2】存留一张灰度图
    cvtColor(g_srcImage1, g_grayImage, COLOR_BGR2GRAY);

    //【3】创建窗口和滚动条
    namedWindow(WINDOW_NAME1, WINDOW_AUTOSIZE);
    createTrackbar("阈值: ", WINDOW_NAME1, &thresh, max_thresh, on_CornerHarris);

    //【4】调用一次回调函数,进行初始化
    on_CornerHarris(0, 0);

    waitKey(0);
    return(0);
}

//-----------------------------------【on_HoughLines( )函数】--------------------------------
//      描述:回调函数
//----------------------------------------------------------------------------------------------

void on_CornerHarris(int, void*)
{
    //---------------------------【1】定义一些局部变量-----------------------------
    Mat dstImage;//目标图
    Mat normImage;//归一化后的图
    Mat scaledImage;//线性变换后的八位无符号整型的图

                    //---------------------------【2】初始化---------------------------------------
                    //置零当前需要显示的两幅图,即清除上一次调用此函数时他们的值
    dstImage = Mat::zeros(g_srcImage.size(), CV_32FC1);
    g_srcImage1 = g_srcImage.clone();

    //---------------------------【3】正式检测-------------------------------------
    //进行角点检测
    cornerHarris(g_grayImage, dstImage, 
        2,//2*2领域大小 
        3, //孔径大小
        0.04,//权重参数
        BORDER_DEFAULT);

    imshow("8位无符号图处理前效果", dstImage);
    // 归一化与转换
    normalize(dstImage, normImage, 0, 255, NORM_MINMAX, CV_32FC1, Mat());

    convertScaleAbs(normImage, scaledImage);//将归一化后的图线性变换成8位无符号整型 


                                            //---------------------------【4】进行绘制-------------------------------------
                                            // 将检测到的,且符合阈值条件的角点绘制出来
    for (int j = 0; j < normImage.rows; j++)
    {
        for (int i = 0; i < normImage.cols; i++)
        {
            if ((int)normImage.at<float>(j, i) > thresh + 80)
            {
                circle(g_srcImage1, Point(i, j), 5, Scalar(10, 10, 255), 2, 8, 0);
                circle(scaledImage, Point(i, j), 5, Scalar(0, 10, 255), 2, 8, 0);
            }
        }
    }
    //---------------------------【4】显示最终效果---------------------------------
    imshow(WINDOW_NAME1, g_srcImage1);
    imshow(WINDOW_NAME2, scaledImage);

}

这里写图片描述

2,Shi_Tomas角点检测goodFeaturesToTrack()

这里写图片描述
这里写图片描述
这里写图片描述

实例2,goodFeaturesToTrack()




//---------------------------------【头文件、命名空间包含部分】----------------------------
//      描述:包含程序所使用的头文件和命名空间
//------------------------------------------------------------------------------------------------
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
using namespace cv;
using namespace std;

//-----------------------------------【宏定义部分】-------------------------------------------- 
//  描述:定义一些辅助宏 
//----------------------------------------------------------------------------------------------
#define WINDOW_NAME "【Shi-Tomasi角点检测】"        //为窗口标题定义的宏 



//-----------------------------------【全局变量声明部分】--------------------------------------
//          描述:全局变量声明
//-----------------------------------------------------------------------------------------------
Mat g_srcImage, g_grayImage;
int g_maxCornerNumber = 33;
int g_maxTrackbarNumber = 500;
RNG g_rng(12345);//初始化随机数生成器


                 //-----------------------------【on_GoodFeaturesToTrack( )函数】----------------------------
                 //          描述:响应滑动条移动消息的回调函数
                 //----------------------------------------------------------------------------------------------
void on_GoodFeaturesToTrack(int, void*)
{
    //【1】对变量小于等于1时的处理
    if (g_maxCornerNumber <= 1) { g_maxCornerNumber = 1; }

    //【2】Shi-Tomasi算法(goodFeaturesToTrack函数)的参数准备
    vector<Point2f> corners;
    double qualityLevel = 0.01;//角点检测可接受的最小特征值
    double minDistance = 10;//角点之间的最小距离
    int blockSize = 3;//计算导数自相关矩阵时指定的邻域范围
    double k = 0.04;//权重系数
    Mat copy = g_srcImage.clone();  //复制源图像到一个临时变量中,作为感兴趣区域

                                    //【3】进行Shi-Tomasi角点检测
    goodFeaturesToTrack(g_grayImage,//输入图像
        corners,//检测到的角点的输出向量
        g_maxCornerNumber,//角点的最大数量
        qualityLevel,//角点检测可接受的最小特征值
        minDistance,//角点之间的最小距离
        Mat(),//感兴趣区域
        blockSize,//计算导数自相关矩阵时指定的邻域范围
        false,//不使用Harris角点检测
        k);//权重系数


           //【4】输出文字信息
    cout << "\t>此次检测到的角点数量为:" << corners.size() << endl;

    //【5】绘制检测到的角点
    int r = 4;
    for (int i = 0; i < corners.size(); i++)
    {
        //以随机的颜色绘制出角点
        circle(copy, corners[i], r, Scalar(g_rng.uniform(0, 255), g_rng.uniform(0, 255),
            g_rng.uniform(0, 255)), -1, 8, 0);
    }

    //【6】显示(更新)窗口
    imshow(WINDOW_NAME, copy);
}




//--------------------------------------【main( )函数】-----------------------------------------
//          描述:控制台应用程序的入口函数,我们的程序从这里开始执行
//-----------------------------------------------------------------------------------------------
int main()
{
    //【0】改变console字体颜色
    system("color 2F");



    //【1】载入源图像并将其转换为灰度图
    g_srcImage = imread("1.jpg", 1);
    cvtColor(g_srcImage, g_grayImage, COLOR_BGR2GRAY);

    //【2】创建窗口和滑动条,并进行显示和回调函数初始化
    namedWindow(WINDOW_NAME, WINDOW_AUTOSIZE);
    createTrackbar("最大角点数", WINDOW_NAME, &g_maxCornerNumber, g_maxTrackbarNumber, on_GoodFeaturesToTrack);
    imshow(WINDOW_NAME, g_srcImage);
    on_GoodFeaturesToTrack(0, 0);

    waitKey(0);
    return(0);
}

这里写图片描述

3,亚像素级精度角点检测cornerSubPix()

这里写图片描述
这里写图片描述
这里写图片描述

实例3,亚像素级精度角点检测,其实只是在goodFeatureToTrack()中加入了以下cornerSubPix几句:

    //【7】亚像素角点检测的参数设置
    Size winSize = Size(5, 5);
    Size zeroZone = Size(-1, -1);


    //此句代码的OpenCV3版为:
    TermCriteria criteria = TermCriteria(TermCriteria::EPS + TermCriteria::MAX_ITER, 40, 0.001);//迭代数和精确度

    //【8】计算出亚像素角点位置
    cornerSubPix(g_grayImage, corners, winSize, zeroZone, criteria);

    //【9】输出角点信息
    for (int i = 0; i < corners.size(); i++)
    {
        cout << " \t>>精确角点坐标[" << i << "]  (" << corners[i].x << "," << corners[i].y << ")" << endl;
    }

最终如下所示:




//---------------------------------【头文件、命名空间包含部分】----------------------------
//      描述:包含程序所使用的头文件和命名空间
//------------------------------------------------------------------------------------------------
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
using namespace cv;
using namespace std;

//-----------------------------------【宏定义部分】-------------------------------------------- 
//  描述:定义一些辅助宏 
//----------------------------------------------------------------------------------------------
#define WINDOW_NAME "【Shi-Tomasi角点检测】"        //为窗口标题定义的宏 



//-----------------------------------【全局变量声明部分】--------------------------------------
//          描述:全局变量声明
//-----------------------------------------------------------------------------------------------
Mat g_srcImage, g_grayImage;
int g_maxCornerNumber = 33;
int g_maxTrackbarNumber = 500;
RNG g_rng(12345);//初始化随机数生成器


                 //-----------------------------【on_GoodFeaturesToTrack( )函数】----------------------------
                 //          描述:响应滑动条移动消息的回调函数
                 //----------------------------------------------------------------------------------------------
void on_GoodFeaturesToTrack(int, void*)
{
    //【1】对变量小于等于1时的处理
    if (g_maxCornerNumber <= 1) { g_maxCornerNumber = 1; }

    //【2】Shi-Tomasi算法(goodFeaturesToTrack函数)的参数准备
    vector<Point2f> corners;
    double qualityLevel = 0.01;//角点检测可接受的最小特征值
    double minDistance = 10;//角点之间的最小距离
    int blockSize = 3;//计算导数自相关矩阵时指定的邻域范围
    double k = 0.04;//权重系数
    Mat copy = g_srcImage.clone();  //复制源图像到一个临时变量中,作为感兴趣区域

                                    //【3】进行Shi-Tomasi角点检测
    goodFeaturesToTrack(g_grayImage,//输入图像
        corners,//检测到的角点的输出向量
        g_maxCornerNumber,//角点的最大数量
        qualityLevel,//角点检测可接受的最小特征值
        minDistance,//角点之间的最小距离
        Mat(),//感兴趣区域
        blockSize,//计算导数自相关矩阵时指定的邻域范围
        false,//不使用Harris角点检测
        k);//权重系数


           //【4】输出文字信息
    cout << "\t>此次检测到的角点数量为:" << corners.size() << endl;

    //【5】绘制检测到的角点
    int r = 4;
    for (int i = 0; i < corners.size(); i++)
    {
        //以随机的颜色绘制出角点
        circle(copy, corners[i], r, Scalar(g_rng.uniform(0, 255), g_rng.uniform(0, 255),
            g_rng.uniform(0, 255)), -1, 8, 0);
    }

    //【6】显示(更新)窗口
    imshow(WINDOW_NAME, copy);
}




//--------------------------------------【main( )函数】-----------------------------------------
//          描述:控制台应用程序的入口函数,我们的程序从这里开始执行
//-----------------------------------------------------------------------------------------------
int main()
{
    //【0】改变console字体颜色
    system("color 2F");



    //【1】载入源图像并将其转换为灰度图
    g_srcImage = imread("1.jpg", 1);
    cvtColor(g_srcImage, g_grayImage, COLOR_BGR2GRAY);

    //【2】创建窗口和滑动条,并进行显示和回调函数初始化
    namedWindow(WINDOW_NAME, WINDOW_AUTOSIZE);
    createTrackbar("最大角点数", WINDOW_NAME, &g_maxCornerNumber, g_maxTrackbarNumber, on_GoodFeaturesToTrack);
    imshow(WINDOW_NAME, g_srcImage);
    on_GoodFeaturesToTrack(0, 0);

    waitKey(0);
    return(0);
}
//【7】亚像素角点检测的参数设置
    Size winSize = Size(5, 5);
    Size zeroZone = Size(-1, -1);


    //此句代码的OpenCV3版为:
    TermCriteria criteria = TermCriteria(TermCriteria::EPS + TermCriteria::MAX_ITER, 40, 0.001);//迭代数和精确度

    //【8】计算出亚像素角点位置
    cornerSubPix(g_grayImage, corners, winSize, zeroZone, criteria);

    //【9】输出角点信息
    for (int i = 0; i < corners.size(); i++)
    {
        cout << " \t>>精确角点坐标[" << i << "]  (" << corners[i].x << "," << corners[i].y << ")" << endl;
    }

这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_41553038/article/details/80263689
今日推荐