- 操作系统:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 编程语言:C++11
算法描述
计算用于角点检测的特征图。
 该函数计算源图像的基于复杂空间导数的函数
  
      
       
        
        
          dst 
         
        
          = 
         
        
          ( 
         
         
         
           D 
          
         
           x 
          
         
        
          src 
         
         
         
           ) 
          
         
           2 
          
         
        
          ⋅ 
         
         
         
           D 
          
          
          
            y 
           
          
            y 
           
          
         
        
          src 
         
        
          + 
         
        
          ( 
         
         
         
           D 
          
         
           y 
          
         
        
          src 
         
         
         
           ) 
          
         
           2 
          
         
        
          ⋅ 
         
         
         
           D 
          
          
          
            x 
           
          
            x 
           
          
         
        
          src 
         
        
          − 
         
        
          2 
         
         
         
           D 
          
         
           x 
          
         
        
          src 
         
        
          ⋅ 
         
         
         
           D 
          
         
           y 
          
         
        
          src 
         
        
          ⋅ 
         
         
         
           D 
          
          
          
            x 
           
          
            y 
           
          
         
        
          src 
         
        
       
         \texttt{dst} = (D_x \texttt{src} )^2 \cdot D_{yy} \texttt{src} + (D_y \texttt{src} )^2 \cdot D_{xx} \texttt{src} - 2 D_x \texttt{src} \cdot D_y \texttt{src} \cdot D_{xy} \texttt{src} 
        
       
     dst=(Dxsrc)2⋅Dyysrc+(Dysrc)2⋅Dxxsrc−2Dxsrc⋅Dysrc⋅Dxysrc
 其中  
     
      
       
        
        
          D 
         
        
          x 
         
        
       
      
        D_x 
       
      
    Dx, 
     
      
       
        
        
          D 
         
        
          y 
         
        
       
      
        D_y 
       
      
    Dy 是第一阶图像导数, 
     
      
       
        
        
          D 
         
         
         
           x 
          
         
           x 
          
         
        
       
      
        D_{xx} 
       
      
    Dxx, 
     
      
       
        
        
          D 
         
         
         
           y 
          
         
           y 
          
         
        
       
      
        D_{yy} 
       
      
    Dyy 是第二阶图像导数, 
     
      
       
        
        
          D 
         
         
         
           x 
          
         
           y 
          
         
        
       
      
        D_{xy} 
       
      
    Dxy 是混合导数。
 角点可以通过该函数的局部最大值来找到,如下所示:
Mat corners, dilated_corners;
preCornerDetect(image, corners, 3);
// dilation with 3x3 rectangular structuring element
dilate(corners, dilated_corners, Mat(), 1);
Mat corner_mask = corners == dilated_corners;
preCornerDetect 是 OpenCV 中的一个函数,用于检测图像中的潜在角点。该函数通过对图像进行预处理来增强角点特征,使得后续的角点检测算法(如 goodFeaturesToTrack 或 cornerHarris)能够更准确地检测角点。
函数原型
void cv::preCornerDetect
(
	InputArray 	src,
	OutputArray 	dst,
	int 	ksize,
	int 	borderType = BORDER_DEFAULT 
)		
参数
- 参数src: 单通道8位或浮点类型的源图像。
- 参数dst: 输出图像,类型为 CV_32F,大小与 src 相同。
- 参数ksize: Sobel 操作的孔径大小。
- 参数borderType: 像素外推方法。参见 BorderTypes。BORDER_WRAP 不支持。
代码示例
#include <iostream>
#include <opencv2/opencv.hpp>
int main( int argc, char** argv )
{
    // 加载图像
    cv::Mat src = cv::imread( "/media/dingxin/data/study/OpenCV/sources/images/hawk.jpg", cv::IMREAD_GRAYSCALE );
    if ( src.empty() )
    {
        std::cout << "Could not open or find the image" << std::endl;
        return -1;
    }
 // 创建一个窗口显示原始灰度图像
    cv::namedWindow("Input Image", cv::WINDOW_AUTOSIZE);
    cv::imshow("Input Image", src);
    // 创建一个输出图像用于存储结果
    cv::Mat dst;
    // 应用 preCornerDetect 函数
    int blockSize = 7;
   
    // 使用 BORDER_REFLECT 作为边界类型
    cv::preCornerDetect(src, dst, blockSize, cv::BORDER_REFLECT);
    // 创建一个窗口显示处理后的图像
    cv::namedWindow("Pre-Corner Detect Result", cv::WINDOW_AUTOSIZE);
    cv::imshow("Pre-Corner Detect Result", dst);
    // 等待按键后退出
    cv::waitKey();
    return 0;
}
运行结果




![[uni-app]小兔鲜-01项目起步](https://img-blog.csdnimg.cn/img_convert/48b649ed0bf9fcd00691f717afb2f6e5.png)















