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::vectordata = 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::vectordata(width * height * channels); // 填充图像数据// ... cv::Mat image(height, width, CV_8UC3, data.data());
通过以上示例代码,我们可以实现cv::Mat与unsigned char*数组、float*数组以及std::vector的相互转换。这些转换可以方便地在图像处理和算法实现中进行数据操作和传递。