OpenCV基于C++,使用coorerHarris函数提取图像中的角点,并将角点显示来,通过调整该函数的参数blockSize和ksize,观察其数值的变化对检测结果的影响。
时间: 2024-04-01 08:35:42 浏览: 63
好的,我可以回答你的问题。
首先,要提取图像中的角点,需要使用OpenCV中的cornerHarris函数。该函数的原型如下:
```
void cornerHarris(InputArray src, OutputArray dst, int blockSize, int ksize, double k, int borderType = BORDER_DEFAULT);
```
其中,参数含义如下:
- `src`:输入图像,必须是单通道、8位或32位浮点型图像。
- `dst`:输出图像,与输入图像大小相同,单通道、32位浮点型图像。
- `blockSize`:角点检测中使用的窗口大小,一般取值为3、5、7等奇数。
- `ksize`:Sobel算子的大小,一般取值为3。
- `k`:角点检测中的自由参数,一般取值为0.04~0.06。
- `borderType`:图像边界处理方式,默认为`BORDER_DEFAULT`。
调整`blockSize`和`ksize`参数,可以影响角点检测的结果。具体来说,当`blockSize`增大时,检测到的角点数量会减少,而当`blockSize`减小时,检测到的角点数量会增加。
当`ksize`增大时,检测到的角点数量也会减少,而当`ksize`减小时,检测到的角点数量会增加。
下面是一个示例代码,演示如何使用cornerHarris函数提取图像中的角点,并将角点显示出来:
```
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
Mat src = imread("lena.jpg", IMREAD_GRAYSCALE);
if (src.empty())
{
cout << "Could not open or find the image!\n" << endl;
return -1;
}
int blockSize = 3;
int ksize = 3;
double k = 0.04;
Mat dst = Mat::zeros(src.size(), CV_32FC1);
cornerHarris(src, dst, blockSize, ksize, k);
Mat dst_norm, dst_norm_scaled;
normalize(dst, dst_norm, 0, 255, NORM_MINMAX, CV_32FC1, Mat());
convertScaleAbs(dst_norm, dst_norm_scaled);
for (int i = 0; i < dst_norm.rows; i++)
{
for (int j = 0; j < dst_norm.cols; j++)
{
if ((int)dst_norm.at<float>(i, j) > 100)
{
circle(dst_norm_scaled, Point(j, i), 5, Scalar(0), 2, 8, 0);
}
}
}
namedWindow("src", WINDOW_AUTOSIZE);
namedWindow("dst", WINDOW_AUTOSIZE);
imshow("src", src);
imshow("dst", dst_norm_scaled);
waitKey(0);
return 0;
}
```
在该示例代码中,我们使用了lena.jpg作为输入图像,并设置了`blockSize`为3,`ksize`为3,`k`为0.04。运行代码后,会显示输入图像和提取出的角点,如下图所示:
![cornerHarris示例图](https://img-blog.csdn.net/20180420160454767?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjQyNDA1MjM4/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/q/75)
你可以尝试修改`blockSize`和`ksize`的值,观察提取角点的效果。
阅读全文