opencv Mat sqrt运算

#include "opencv2/core.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"
//#include <cmath>

#include <iostream>

using namespace cv;
using namespace std;

int main()
{
    Mat mat_src = Mat::eye(3, 4, CV_32F);

    cout << "mat_src :" << endl;
    cout << mat_src    << endl;

    cout << endl;
    cout << "Rows : " << mat_src.rows << endl;
    cout << "Cols : " << mat_src.cols << endl;
    mat_src.at<float>(0, 2) = 9000000; 
    mat_src.at<float>(2, 0) = 4000000;
   Mat B;
   sqrt(mat_src,B);
   cout << "B " << endl << B << endl;
    cout << endl;
    cout << "mat_src :" << endl;
    cout << mat_src    << endl;
	int k = mat_src.at<float>(0, 2);
	cout << " k = " << k <<endl;

    return 0;
}

之前 sqrt 运算写成 Mat B = sqrt ( mat_str, B )结果报错

注意 : sqrt( A, B)的解释为将矩阵A开平方结果放到矩阵B中,不需要重新赋值。

### C++ 中使用 OpenCV 进行仿射变换 在 C++ 的 OpenCV 库中,可以通过 `cv::getAffineTransform` 函数来获取仿射变换矩阵,并利用该矩阵通过 `cv::warpAffine` 对图像进行仿射变换操作。以下是具体方法: #### 使用 `cv::getAffineTransform` 此函数用于计算两个三角形之间的仿射变换矩阵。输入参数为两组二维点数组(源点和目标点),返回值是一个 2×3 的浮点数矩阵。 ```cpp Mat cv::getAffineTransform(const Point2f src[], const Point2f dst[]); ``` 其中: - `src[]`: 输入的三个源点坐标。 - `dst[]`: 输出的目标点坐标。 示例代码如下所示[^2]: ```cpp #include <opencv2/opencv.hpp> using namespace cv; int main() { // 定义原始图像上的三点 Point2f srcTri[3]; srcTri[0] = Point2f(0.f, 0.f); srcTri[1] = Point2f(30.f, 0.f); srcTri[2] = Point2f(0.f, 30.f); // 定义目标图像上的三点 Point2f dstTri[3]; dstTri[0] = Point2f(0.f, 0.f); dstTri[1] = Point2f(40.f, 0.f); dstTri[2] = Point2f(0.f, 40.f); // 获取仿射变换矩阵 Mat affineMatrix = getAffineTransform(srcTri, dstTri); // 加载测试图像 Mat srcImage = imread("input.jpg", IMREAD_COLOR); if (srcImage.empty()) { std::cout << "Error loading image!" << std::endl; return -1; } // 执行仿射变换 Mat warpedImage; warpAffine(srcImage, warpedImage, affineMatrix, Size(), INTER_LINEAR, BORDER_CONSTANT, Scalar()); // 显示结果 imshow("Original Image", srcImage); imshow("Warped Image", warpedImage); waitKey(0); return 0; } ``` --- ### 关于 `warpPolar` 函数 `warpPolar` 是一种极坐标映射函数,常用于将笛卡尔坐标系下的图像转换到极坐标系下或者反之。其主要用途包括圆形物体检测、全景图拼接等场景。 #### 基本语法 ```cpp void cv::warpPolar(InputArray _src, OutputArray _dst, Size dsize, Point center, double maxRadius, int flags); ``` 参数说明: - `_src`: 输入图像。 - `_dst`: 输出图像。 - `dsize`: 输出图像大小。 - `center`: 极坐标的中心点,默认为中心点 `(width / 2, height / 2)`。 - `maxRadius`: 最大半径范围。 - `flags`: 变换标志位组合,支持以下选项: - `WARP_POLAR_LINEAR`: 线性极坐标变换。 - `WARP_POLAR_LOG`: 对数极坐标变换。 - `INTER_*`: 插值方式。 - `WARP_INVERSE_MAP`: 是否反向映射。 #### 示例代码 下面展示了一个简单的例子,演示如何将一幅图像从笛卡尔坐标系转换至极坐标系并再还原回来[^1]。 ```cpp #include <opencv2/opencv.hpp> using namespace cv; int main() { // 加载图片 Mat srcImage = imread("input.jpg", IMREAD_GRAYSCALE); if (srcImage.empty()) { std::cout << "Error loading image!" << std::endl; return -1; } // 设置最大半径 float maxRadius = sqrt(pow(srcImage.cols / 2.0, 2) + pow(srcImage.rows / 2.0, 2)); // 将图像转换成线性极坐标形式 Mat polarLinear; warpPolar(srcImage, polarLinear, Size(polarLinear.size()), Point(srcImage.cols / 2, srcImage.rows / 2), maxRadius, WARP_POLAR_LINEAR | INTER_CUBIC); // 再次将其变回直角坐标系 Mat backToCartesian; warpPolar(polarLinear, backToCartesian, srcImage.size(), Point(srcImage.cols / 2, srcImage.rows / 2), maxRadius, WARP_POLAR_LINEAR | WARP_INVERSE_MAP | INTER_CUBIC); // 展示效果对比 imshow("Original Image", srcImage); imshow("Polar Linear Transform", polarLinear); imshow("Back to Cartesian", backToCartesian); waitKey(0); return 0; } ``` 上述程序实现了从普通空间到极坐标的空间变化过程及其逆运算。 --- ### 注意事项 当处理单个像素点经过仿射变换后的位置时,需遵循基本原理:先减去旋转中心作为偏移量完成局部坐标系内的旋转变换后再加回到全局坐标体系之中[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值