当前位置:实例文章 » 其他实例» [文章]OpenCV - cv::Mat与unsigned char*数组或者float*数组相互转换,cv::Mat与std::vector的相互转换

OpenCV - cv::Mat与unsigned char*数组或者float*数组相互转换,cv::Mat与std::vector的相互转换

发布人:shili8 发布时间:2024-01-18 20:36 阅读次数:152

在OpenCV中,cv::Mat是表示图像的主要数据结构,它可以方便地进行图像处理和操作。有时候我们需要将cv::Mat与unsigned char*数组或者float*数组相互转换,或者将cv::Mat与std::vector相互转换。下面我们来看一下如何实现这些转换。

1. cv::Mat与unsigned char*数组相互转换将cv::Mat转换为unsigned char*数组可以使用cv::Mat的data成员变量,该变量指向图像数据的起始地址。下面是一个示例代码:

cppcv::Mat image = cv::imread("image.jpg");
unsigned char* data = image.data;
int width = image.cols;
int height = image.rows;
int channels = image.channels();

// 遍历图像数据for (int i =0; i < height; i++) {
 for (int j =0; j < width; j++) {
 for (int c =0; c < channels; c++) {
 unsigned char pixelValue = data[i * width * channels + j * channels + c];
 // 处理像素值 }
 }
}


将unsigned char*数组转换为cv::Mat可以使用cv::Mat的构造函数,指定图像的宽度、高度和通道数,然后将数据拷贝到cv::Mat中。下面是一个示例代码:

cppint width =640;
int height =480;
int channels =3;
unsigned char* data = new unsigned char[width * height * channels];

// 填充图像数据// ...

cv::Mat image(height, width, CV_8UC3);
memcpy(image.data, data, width * height * channels * sizeof(unsigned char));

delete[] data;


2. cv::Mat与float*数组相互转换将cv::Mat转换为float*数组可以使用cv::Mat的ptr成员函数,该函数返回指向指定行的数据的指针。下面是一个示例代码:

cppcv::Mat image = cv::imread("image.jpg", cv::IMREAD_GRAYSCALE);
int width = image.cols;
int height = image.rows;

// 遍历图像数据for (int i =0; i < height; i++) {
 float* rowData = image.ptr(i);
 for (int j =0; j < width; j++) {
 float pixelValue = rowData[j];
 // 处理像素值 }
}


将float*数组转换为cv::Mat可以使用cv::Mat的构造函数,指定图像的宽度、高度和数据类型,然后将数据拷贝到cv::Mat中。下面是一个示例代码:

cppint width =640;
int height =480;
float* data = new float[width * height];

// 填充图像数据// ...

cv::Mat image(height, width, CV_32F);
memcpy(image.data, data, width * height * sizeof(float));

delete[] data;


3. cv::Mat与std::vector的相互转换将cv::Mat转换为std::vector可以使用cv::Mat的reshape成员函数,该函数返回一个包含图像数据的std::vector。下面是一个示例代码:

cppcv::Mat image = cv::imread("image.jpg");
std::vector data = image.reshape(1, image.total() * image.channels());


将std::vector转换为cv::Mat可以使用cv::Mat的构造函数,指定图像的宽度、高度和数据类型,然后将数据拷贝到cv::Mat中。下面是一个示例代码:

cppint width =640;
int height =480;
int channels =3;
std::vector data(width * height * channels);

// 填充图像数据// ...

cv::Mat image(height, width, CV_8UC3, data.data());


通过以上示例代码,我们可以实现cv::Mat与unsigned char*数组、float*数组以及std::vector的相互转换。这些转换可以方便地在图像处理和算法实现中进行数据操作和传递。

其他信息

其他资源

Top