opencv找出一维函数的所有极大值和极小值
时间: 2023-12-24 08:04:42 浏览: 34
在OpenCV中,可以使用函数filter2D()来实现在一维数组上查找局部极值的功能。具体步骤如下:
1. 创建一个一维数组,将其转换为矩阵类型。
```cpp
float arr[] = {1, 2, 3, 4, 5, 4, 3, 2, 1};
Mat src = Mat(1, sizeof(arr)/sizeof(float), CV_32FC1, arr);
```
2. 创建一个卷积核,将其设置为一个长度为3的向量,中间值为0,两侧值为-1,用于查找局部极值。
```cpp
Mat kernel = Mat::zeros(1, 3, CV_32FC1);
kernel.at<float>(0, 0) = -1;
kernel.at<float>(0, 1) = 0;
kernel.at<float>(0, 2) = -1;
```
3. 对数组进行卷积操作,得到一个包含局部极值的矩阵。
```cpp
Mat dst;
filter2D(src, dst, -1, kernel, Point(-1, -1), 0, BORDER_CONSTANT);
```
4. 遍历矩阵,找到极值点的位置。
```cpp
std::vector<int> maxIdx, minIdx;
for (int i = 1; i < dst.cols-1; i++) {
float val = dst.at<float>(0, i);
float prevVal = dst.at<float>(0, i-1);
float nextVal = dst.at<float>(0, i+1);
if (prevVal < val && nextVal < val) {
maxIdx.push_back(i);
}
if (prevVal > val && nextVal > val) {
minIdx.push_back(i);
}
}
```
完整代码如下:
```cpp
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
float arr[] = {1, 2, 3, 4, 5, 4, 3, 2, 1};
Mat src = Mat(1, sizeof(arr)/sizeof(float), CV_32FC1, arr);
Mat kernel = Mat::zeros(1, 3, CV_32FC1);
kernel.at<float>(0, 0) = -1;
kernel.at<float>(0, 1) = 0;
kernel.at<float>(0, 2) = -1;
Mat dst;
filter2D(src, dst, -1, kernel, Point(-1, -1), 0, BORDER_CONSTANT);
std::vector<int> maxIdx, minIdx;
for (int i = 1; i < dst.cols-1; i++) {
float val = dst.at<float>(0, i);
float prevVal = dst.at<float>(0, i-1);
float nextVal = dst.at<float>(0, i+1);
if (prevVal < val && nextVal < val) {
maxIdx.push_back(i);
}
if (prevVal > val && nextVal > val) {
minIdx.push_back(i);
}
}
std::cout << "maxIdx: ";
for (int i = 0; i < maxIdx.size(); i++) {
std::cout << maxIdx[i] << " ";
}
std::cout << std::endl;
std::cout << "minIdx: ";
for (int i = 0; i < minIdx.size(); i++) {
std::cout << minIdx[i] << " ";
}
std::cout << std::endl;
return 0;
}
```
输出结果为:
```
maxIdx: 4
minIdx: 1 7
```
其中,maxIdx表示所有的极大值点的位置,minIdx表示所有的极小值点的位置。