opencv 中互相关函数
时间: 2024-04-16 10:22:56 浏览: 37
在OpenCV中,互相关函数是用于计算两个图像之间的互相关操作的函数。互相关是一种常用的图像处理技术,用于在图像中寻找目标或进行模式匹配。
OpenCV提供了两个主要的互相关函数:matchTemplate和filter2D。
1. matchTemplate函数:
matchTemplate函数用于在输入图像中搜索目标图像的位置。它通过计算输入图像和目标图像之间的互相关来实现。该函数返回一个结果矩阵,其中每个元素表示输入图像中与目标图像最相似的区域。
相关参数:
- 输入图像:需要搜索的图像。
- 目标图像:要在输入图像中搜索的目标。
- 结果矩阵:存储互相关结果的矩阵。
相关问题
C++ opencv ncc归一化互相关代码
以下是使用 OpenCV C++ 实现 NCC(Normalized Cross Correlation)归一化互相关的示例代码:
```cpp
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
Mat img1 = imread("image1.jpg", IMREAD_GRAYSCALE);
Mat img2 = imread("image2.jpg", IMREAD_GRAYSCALE);
// 计算模板和图像的平均值
Scalar mean1 = mean(img1);
Scalar mean2 = mean(img2);
// 计算模板和图像的标准差
Mat stddev1, stddev2;
meanStdDev(img1, Mat(), stddev1);
meanStdDev(img2, Mat(), stddev2);
// 归一化模板和图像
Mat nccImg1, nccImg2;
normalize(img1 - mean1, nccImg1, 0, 1, NORM_MINMAX);
normalize(img2 - mean2, nccImg2, 0, 1, NORM_MINMAX);
// 计算归一化互相关
Mat result;
matchTemplate(nccImg1, nccImg2, result, TM_CCORR_NORMED);
// 显示结果
imshow("Result", result);
waitKey(0);
return 0;
}
```
其中,`normalize` 函数用于将图像归一化到 [0, 1] 范围内;`matchTemplate` 函数用于计算归一化互相关,其中 `TM_CCORR_NORMED` 表示使用 NCC 方法计算归一化互相关。
C++ opencv ncc归一化互相关 使用SSE优化 具体实现代码
以下是使用 SSE 优化的归一化互相关(NCC)的 C++ 代码实现:
```cpp
#include <iostream>
#include <opencv2/opencv.hpp>
#include <emmintrin.h>
using namespace cv;
void ncc_sse(const Mat& img1, const Mat& img2, Mat& result)
{
int width = img1.cols - img2.cols + 1;
int height = img1.rows - img2.rows + 1;
result.create(height, width, CV_32FC1);
__m128i zero = _mm_setzero_si128();
__m128 sum1, sum2, sum3, sum4, mean1, mean2, std1, std2, ncc, temp;
__m128i p1, p2, mask;
float* ptr1, * ptr2, * res;
int i, j, k;
for (i = 0; i < height; i++)
{
ptr1 = (float*)img1.ptr(i);
for (j = 0; j < width; j++)
{
sum1 = sum2 = sum3 = sum4 = _mm_set_ps1(0.f);
for (k = 0; k < img2.rows; k++)
{
ptr2 = (float*)img2.ptr(k);
p1 = _mm_loadu_si128((__m128i*)(ptr1 + j));
p2 = _mm_loadu_si128((__m128i*)(ptr2));
sum1 = _mm_add_ps(sum1, _mm_mul_ps(_mm_loadu_ps(ptr1 + j), _mm_loadu_ps(ptr2)));
sum2 = _mm_add_ps(sum2, _mm_mul_ps(_mm_loadu_ps(ptr1 + j + 4), _mm_loadu_ps(ptr2 + 4)));
sum3 = _mm_add_ps(sum3, _mm_mul_ps(_mm_loadu_ps(ptr1 + j + 8), _mm_loadu_ps(ptr2 + 8)));
sum4 = _mm_add_ps(sum4, _mm_mul_ps(_mm_loadu_ps(ptr1 + j + 12), _mm_loadu_ps(ptr2 + 12)));
ptr1 += img1.cols;
ptr2 += img2.cols;
}
mean1 = _mm_set_ps1(cv::mean(img1(cv::Rect(j, i, img2.cols, img2.rows)))[0]);
mean2 = _mm_set_ps1(cv::mean(img2)[0]);
temp = _mm_mul_ps(_mm_sub_ps(sum1, _mm_mul_ps(mean1, mean2)), _mm_rcp_ps(_mm_set_ps1(img2.cols * img2.rows)));
sum2 = _mm_mul_ps(_mm_sub_ps(sum2, _mm_mul_ps(mean1, mean2)), _mm_rcp_ps(_mm_set_ps1(img2.cols * img2.rows)));
sum3 = _mm_mul_ps(_mm_sub_ps(sum3, _mm_mul_ps(mean1, mean2)), _mm_rcp_ps(_mm_set_ps1(img2.cols * img2.rows)));
sum4 = _mm_mul_ps(_mm_sub_ps(sum4, _mm_mul_ps(mean1, mean2)), _mm_rcp_ps(_mm_set_ps1(img2.cols * img2.rows)));
std1 = _mm_sqrt_ps(_mm_sub_ps(_mm_mul_ps(temp, temp), _mm_mul_ps(mean1, mean1)));
std2 = _mm_sqrt_ps(_mm_sub_ps(_mm_mul_ps(sum2, sum2), _mm_mul_ps(mean2, mean2)));
std1 = _mm_mul_ps(_mm_rcp_ps(std1), _mm_rcp_ps(std2));
ncc = _mm_mul_ps(temp, std1);
res = (float*)result.ptr(i);
_mm_storeu_ps(res + j, ncc);
}
}
}
int main()
{
Mat img1 = imread("img1.png", IMREAD_GRAYSCALE);
Mat img2 = imread("img2.png", IMREAD_GRAYSCALE);
Mat result;
ncc_sse(img1, img2, result);
imshow("Result", result);
waitKey(0);
return 0;
}
```
其中,`_mm_set_ps1` 函数用于将一个值复制到 SSE 寄存器的四个数据位置;`_mm_loadu_si128` 函数用于从内存中加载一个 __m128i 类型的值;`_mm_add_ps` 函数用于两个 SSE 浮点数寄存器中的数据相加;`_mm_mul_ps` 函数用于两个 SSE 浮点数寄存器中的数据相乘;`_mm_set_ps` 函数用于将四个单精度浮点数组成一个 SSE 浮点数寄存器;`_mm_storeu_ps` 函数用于将一个 SSE 浮点数寄存器的值存储到内存中。
相关推荐
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)