c++ 实现100*3的cv::Mat减去1*3的cv::Mat
时间: 2024-10-10 10:01:23 浏览: 44
在C++中,当你想要将一个`cv::Mat`(OpenCV中的矩阵)执行元素级减法操作,比如一个100x3的矩阵减去一个1x3的矩阵,你需要确保两个矩阵在维度上可以相匹配并且数据类型兼容。下面是一个简单的例子:
```cpp
#include <opencv2/opencv.hpp>
int main() {
// 创建一个100x3的cv::Mat
cv::Mat mat1(100, 3, CV_32FC1); // 使用单精度浮点型,可以根据需要更改数据类型
cv::randu(mat1, 0, 100); // 随机填充矩阵
// 创建一个1x3的cv::Mat
cv::Mat mat2(1, 3, CV_32FC1);
for (int i = 0; i < 3; i++) {
mat2.at<float>(0, i) = 1; // 设置每个元素为1
}
// 减法操作,注意这会直接修改mat1,因为是同类型的元素减法
mat1 -= mat2;
return 0;
}
```
在这个例子中,我们首先创建了一个100行3列的浮点型矩阵`mat1`,然后创建了一个1行3列的矩阵`mat2`并将其所有元素设置为1。接着,我们通过`-=`运算符对`mat1`的对应位置元素进行减法操作。
相关问题
opencv 从cv::getPerspectiveTransform() 的返回值透视变换矩阵中获取旋转向量和平移向量c++实例
在OpenCV中,`cv::getPerspectiveTransform()` 函数用于计算两个图像之间的透视变换矩阵,这个矩阵并不直接包含旋转向量和平移向量的信息。但是,如果你想将透视变换分解成旋转、缩放和平移操作,可以使用另一种方法,比如通过计算齐次坐标系下的变换矩阵。
首先,你需要了解透视变换矩阵是由四个线性变换组成的,其中三个旋转和缩放,另一个表示平移。然而,OpenCV的标准库并未提供直接解包这样的功能。但你可以手动做一些数学处理,这通常涉及到利用矩阵的特殊结构。
这里是一个基本的例子,假设你已经有了4x4的透视变换矩阵 `M`:
```cpp
#include <opencv2/core.hpp>
#include <opencv2/calib3d.hpp>
// 假设 M 是一个 cv::Mat 对象,代表了透视变换矩阵
// 将矩阵转换为3x3部分,去除最后一行和列(因为它们分别代表平移和深度信息)
cv::Mat M_3x3 = M(cv::Range(0, 3), cv::Range(0, 3));
// 抽取出旋转和缩放的部分(需要进一步处理)
cv::Mat rotation_matrix, scale_matrix;
cv::Rodrigues(M_3x3, rotation_matrix); // 使用Rodrigues函数近似估计旋转角度,不是完全精确的
scale_matrix = M_3x3 / cv::Mat::eye(3, 3); // 简单地除以单位矩阵得到缩放比例
// 平移向量可以通过减去透视变换矩阵的最后一行得到
cv::Point2f translation(-M.at<float>(2, 0), -M.at<float>(2, 1)); // 注意这是原点相对于新坐标系的偏移
std::cout << "Rotation matrix:\n" << rotation_matrix << std::endl;
std::cout << "Scale matrix:\n" << scale_matrix << std::endl;
std::cout << "Translation vector:\n" << translation << std::endl;
opencv图像减去c++代码
以下是使用OpenCV进行图像减法操作的代码示例:
```c++
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
Mat img1 = imread("image1.jpg", IMREAD_GRAYSCALE);
Mat img2 = imread("image2.jpg", IMREAD_GRAYSCALE);
// 确保两张图像大小相同
resize(img2, img2, img1.size());
Mat result;
subtract(img1, img2, result);
imwrite("result.jpg", result);
return 0;
}
```
在这个例子中,我们使用了OpenCV的subtract函数来执行图像减法操作。我们首先读取两个图像并确保它们的大小相同,然后将它们传递给subtract函数。subtract函数返回一个Mat对象,表示两个图像的差异。最后,我们将结果保存到一个新的图像文件中。
阅读全文