OpenCV-复数矩阵点乘ComplexMatrixDotMultiplication

2024-04-23 07:44

本文主要是介绍OpenCV-复数矩阵点乘ComplexMatrixDotMultiplication,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

需求说明

       一般用到FFT,就涉及到复数的计算,为了便于调用,我自行封装了一个简单的复数矩阵点乘函数。复数乘法公式:

(a+bi)(c+di)=(ac-bd)+(ad+bc)i

       下面展示代码。

功能函数

// 复数矩阵点乘
cv::Mat ComplexMatrixDotMultiplication(const cv::Mat& A, const cv::Mat& B)
{// 确保A和B都是双通道的矩阵CV_Assert(A.channels() == 2 && B.channels() == 2);// 提取A和B的实部和虚部std::vector<cv::Mat> A_channels, B_channels;cv::split(A, A_channels);cv::split(B, B_channels);cv::Mat A_real = A_channels[0];cv::Mat A_imag = A_channels[1];cv::Mat B_real = B_channels[0];cv::Mat B_imag = B_channels[1];// 计算相乘cv::Mat C_real = A_real.mul(B_real) - A_imag.mul(B_imag);cv::Mat C_imag = A_real.mul(B_imag) + A_imag.mul(B_real);// 合并结果std::vector<cv::Mat> C_channels{ C_real, C_imag };cv::Mat C;cv::merge(C_channels, C);return C;
}

C++&Matlab测试代码

#include <iostream>
#include <time.h>
#include <opencv2/opencv.hpp>using namespace std;
using namespace cv;// 复数矩阵点乘
cv::Mat ComplexMatrixDotMultiplication(const cv::Mat& A, const cv::Mat& B)
{// 确保A和B都是双通道的矩阵CV_Assert(A.channels() == 2 && B.channels() == 2);// 提取A和B的实部和虚部std::vector<cv::Mat> A_channels, B_channels;cv::split(A, A_channels);cv::split(B, B_channels);cv::Mat A_real = A_channels[0];cv::Mat A_imag = A_channels[1];cv::Mat B_real = B_channels[0];cv::Mat B_imag = B_channels[1];// 计算相乘cv::Mat C_real = A_real.mul(B_real) - A_imag.mul(B_imag);cv::Mat C_imag = A_real.mul(B_imag) + A_imag.mul(B_real);// 合并结果std::vector<cv::Mat> C_channels{ C_real, C_imag };cv::Mat C;cv::merge(C_channels, C);return C;
}int main()
{// 定义实际数据的双通道矩阵 A 和 Bcv::Mat A = (cv::Mat_<std::complex<float>>)cv::Mat::zeros(4, 4, CV_32FC2);cv::Mat B = (cv::Mat_<std::complex<float>>)cv::Mat::zeros(4, 4, CV_32FC2);// 自定义 A 和 B 的数据for (int i = 0; i < A.rows; ++i) {for (int j = 0; j < A.cols; ++j) {A.at<std::complex<float>>(i, j) = std::complex<float>(i + 1, j + 1);B.at<std::complex<float>>(i, j) = std::complex<float>(i + 2, j + 2);}}// 调用复数矩阵乘法函数cv::Mat C = GlobalFunc::complexMatrixMultiplication(A, B);// 打印结果std::cout << "Result Matrix C:\n" << C << std::endl;return 0;
}
% 定义 A 和 B 的大小
rows = 4;
cols = 4;% 创建实际数据的双通道矩阵 A 和 B,初始值为零
A = zeros(rows, cols) + 1i * zeros(rows, cols);
B = zeros(rows, cols) + 1i * zeros(rows, cols);% 自定义 A 和 B 的数据
for i = 1:rowsfor j = 1:colsA(i, j) = complex(i, j);B(i, j) = complex(i + 1, j + 1);end
end% 复数矩阵点乘
C = A .* B;% 显示结果
disp('Result Matrix C:');
disp(C);

测试效果

       如果函数有什么可以改进完善的地方,非常欢迎大家指出,一同进步何乐而不为呢~

       如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!

这篇关于OpenCV-复数矩阵点乘ComplexMatrixDotMultiplication的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/928188

相关文章

使用Python和OpenCV库实现实时颜色识别系统

《使用Python和OpenCV库实现实时颜色识别系统》:本文主要介绍使用Python和OpenCV库实现的实时颜色识别系统,这个系统能够通过摄像头捕捉视频流,并在视频中指定区域内识别主要颜色(红... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间详解

OpenCV实现实时颜色检测的示例

《OpenCV实现实时颜色检测的示例》本文主要介绍了OpenCV实现实时颜色检测的示例,通过HSV色彩空间转换和色调范围判断实现红黄绿蓝颜色检测,包含视频捕捉、区域标记、颜色分析等功能,具有一定的参考... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间

Python中OpenCV与Matplotlib的图像操作入门指南

《Python中OpenCV与Matplotlib的图像操作入门指南》:本文主要介绍Python中OpenCV与Matplotlib的图像操作指南,本文通过实例代码给大家介绍的非常详细,对大家的学... 目录一、环境准备二、图像的基本操作1. 图像读取、显示与保存 使用OpenCV操作2. 像素级操作3.

C/C++中OpenCV 矩阵运算的实现

《C/C++中OpenCV矩阵运算的实现》本文主要介绍了C/C++中OpenCV矩阵运算的实现,包括基本算术运算(标量与矩阵)、矩阵乘法、转置、逆矩阵、行列式、迹、范数等操作,感兴趣的可以了解一下... 目录矩阵的创建与初始化创建矩阵访问矩阵元素基本的算术运算 ➕➖✖️➗矩阵与标量运算矩阵与矩阵运算 (逐元

C/C++的OpenCV 进行图像梯度提取的几种实现

《C/C++的OpenCV进行图像梯度提取的几种实现》本文主要介绍了C/C++的OpenCV进行图像梯度提取的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录预www.chinasem.cn备知识1. 图像加载与预处理2. Sobel 算子计算 X 和 Y

C/C++和OpenCV实现调用摄像头

《C/C++和OpenCV实现调用摄像头》本文主要介绍了C/C++和OpenCV实现调用摄像头,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录准备工作1. 打开摄像头2. 读取视频帧3. 显示视频帧4. 释放资源5. 获取和设置摄像头属性

c/c++的opencv图像金字塔缩放实现

《c/c++的opencv图像金字塔缩放实现》本文主要介绍了c/c++的opencv图像金字塔缩放实现,通过对原始图像进行连续的下采样或上采样操作,生成一系列不同分辨率的图像,具有一定的参考价值,感兴... 目录图像金字塔简介图像下采样 (cv::pyrDown)图像上采样 (cv::pyrUp)C++ O

c/c++的opencv实现图片膨胀

《c/c++的opencv实现图片膨胀》图像膨胀是形态学操作,通过结构元素扩张亮区填充孔洞、连接断开部分、加粗物体,OpenCV的cv::dilate函数实现该操作,本文就来介绍一下opencv图片... 目录什么是图像膨胀?结构元素 (KerChina编程nel)OpenCV 中的 cv::dilate() 函

qtcreater配置opencv遇到的坑及实践记录

《qtcreater配置opencv遇到的坑及实践记录》我配置opencv不管是按照网上的教程还是deepseek发现都有些问题,下面是我的配置方法以及实践成功的心得,感兴趣的朋友跟随小编一起看看吧... 目录电脑环境下载环境变量配置qmake加入外部库测试配置我配置opencv不管是按照网上的教程还是de

python+OpenCV反投影图像的实现示例详解

《python+OpenCV反投影图像的实现示例详解》:本文主要介绍python+OpenCV反投影图像的实现示例详解,本文通过实例代码图文并茂的形式给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一、前言二、什么是反投影图像三、反投影图像的概念四、反向投影的工作原理一、利用反向投影backproj