cv::mat at
时间: 2023-10-03 21:05:21 浏览: 199
cv::Mat.at是OpenCV库中用于访问图像元素的函数。它允许您通过指定行和列来获取或设置特定像素的值。根据引用,可以使用cv::Mat.at<cv::Vec3b>(row, col)来获取或设置RGB图像中特定像素的值。类似地,对于灰度图像,可以使用cv::Mat.at<uchar>(row, col)来获取或设置特定像素的值。
相关问题
cv::Mat trans; cv::warpPerspective(img2, trans, H, cv::Size(img1.cols + img2.cols, img2.rows)); cv::Mat left_top = (cv::Mat_<double>(3, 1) << 0, 0, 1); cv::Mat points = H * left_top; int start = (int)points.at<double>(0, 0); cv::Mat trans_copy = trans.clone(); cv::Mat result = trans; cv::Mat roi = result(cv::Rect(0, 0, img1.cols, img1.rows)); img1.copyTo(roi);解析
这段代码是使用OpenCV库进行图像处理的,主要实现了图像融合的功能。
首先,将img2图像通过warpPerspective函数进行透视变换,得到变换后的图像trans。其中,参数H是一个3x3的变换矩阵,表示img2图像相对于img1图像的透视变换关系;Size(img1.cols+img2.cols, img2.rows)指定了变换后的图像大小。
接着,通过矩阵运算计算出img2图像左上角在变换后图像中的像素坐标,存储在points变量中。由于points是一个3x1的矩阵,所以通过at函数获取points中的第一个元素,并将其转换为整数,得到了img2图像在变换后图像中的左侧起始像素列数start。
然后,通过clone函数将变换后的图像trans复制一份到trans_copy中,以便后续操作不影响原始图像。接着,将result变量初始化为变换后的图像trans,并通过ROI(Region of Interest)机制获取result中左上角大小与img1相同的区域roi。最后,通过copyTo函数将img1图像复制到roi区域中,完成了图像融合的过程。
array2d<rgb_pixel> 转cv::mat 后mat是empty
在将 `array2d<rgb_pixel>` 转换为 `cv::Mat` 时,需要注意两个问题:
1. `array2d<rgb_pixel>` 的存储顺序是按行存储的,而 `cv::Mat` 的存储顺序是按列存储的,因此需要进行转置操作。
2. `array2d<rgb_pixel>` 的像素值的类型是 `rgb_pixel`,而 `cv::Mat` 的像素值的类型是 `cv::Vec3b`,需要进行类型转换。
下面是一个示例代码,可以将 `array2d<rgb_pixel>` 转换为 `cv::Mat`:
```cpp
#include <iostream>
#include <dlib/image_processing.h>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace dlib;
int main()
{
// 创建一个 array2d<rgb_pixel>
array2d<rgb_pixel> img(100, 100);
for (int r = 0; r < img.nr(); r++) {
for (int c = 0; c < img.nc(); c++) {
img[r][c] = rgb_pixel(r, c, 255);
}
}
// 将 array2d<rgb_pixel> 转换为 cv::Mat
cv::Mat mat(img.nc(), img.nr(), CV_8UC3, cv::Scalar(0, 0, 0));
for (int r = 0; r < img.nr(); r++) {
for (int c = 0; c < img.nc(); c++) {
cv::Vec3b& pixel = mat.at<cv::Vec3b>(c, r);
rgb_pixel& dlib_pixel = img[r][c];
pixel[0] = dlib_pixel.blue;
pixel[1] = dlib_pixel.green;
pixel[2] = dlib_pixel.red;
}
}
cv::transpose(mat, mat); // 转置
// 显示结果
cv::imshow("image", mat);
cv::waitKey(0);
return 0;
}
```
在这个示例代码中,我使用了一个简单的方法来将 `array2d<rgb_pixel>` 转换为 `cv::Mat`,也就是先创建一个空的 `cv::Mat`,然后逐个像素进行复制和类型转换。最后再使用 `cv::transpose` 将 `cv::Mat` 转置,以满足存储顺序的要求。
如果你还是遇到了 `cv::Mat` 是空的问题,可以检查一下你的 `array2d<rgb_pixel>` 是否为空,以及是否正确地转换为了 `cv::Mat`。
阅读全文