cv::Mat3b **rgb
时间: 2023-07-11 20:55:41 浏览: 45
首先,cv::Mat3b是OpenCV库中的一个数据类型,表示一个三通道的彩色图像。其中3表示三通道,b表示每个像素点的数据类型是unsigned char。因此,cv::Mat3b可以表示一个宽、高和深度均为3的三维数组,其中每个元素都是一个3个unsigned char组成的向量,代表一个像素的RGB颜色值。
而"**rgb"则表示一个指向Mat3b类型数据的指针的指针,即一个Mat3b类型的二维数组。这种方式常用于动态申请多维数组空间,以便能够在运行时根据需要动态地调整数组大小。
相关问题
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`。
cv::Mat mat; mat.create(m_height, m_width, CV_8UC3); const cv::Mat buffer_mat(m_height, m_width, CV_16UC1, pBuff); cv::normalize(buffer_mat, mat, 0, 255, cv::NORM_MINMAX, CV_8UC3); cv::Mat dst_mat; cv::cvtColor(mat, dst_mat, cv::COLOR_BayerRG2RGB);优化这段代码
这段代码的主要目的是将一个输入的16位图像数据转换为8位RGB图像。这里有几个可以优化的地方:
1. 避免不必要的临时变量:可以避免使用 buffer_mat 作为临时变量,直接使用 pBuff 进行归一化操作。
2. 减少拷贝次数:可以在创建 mat 时直接使用 pBuff 进行初始化,避免创建一个额外的 16 位图像。
3. 使用 OpenCV 的函数代替手动计算:可以使用 cv::convertScaleAbs 函数代替 cv::normalize 函数进行归一化,在 cv::cvtColor 中使用 cv::COLOR_BayerBG2RGB 代替 cv::COLOR_BayerRG2RGB。
下面是优化后的代码:
```
cv::Mat mat(m_height, m_width, CV_8UC3, pBuff);
cv::convertScaleAbs(mat, mat, 255.0 / std::numeric_limits<uint16_t>::max());
cv::cvtColor(mat, mat, cv::COLOR_BayerBG2RGB);
```
这里使用了 cv::convertScaleAbs 函数直接对 mat 进行归一化,并且在 cv::cvtColor 中使用 cv::COLOR_BayerBG2RGB。