cv::Mat 转float数组
时间: 2024-09-12 15:15:01 浏览: 111
`cv::Mat` 是 OpenCV 中常用的数据结构,用于表示图像矩阵,它内部存储的是各种类型的元素,如 `uchar`, `short`, `int`, `float`, 或 `double` 等。如果你想要将一个 `cv::Mat` 转换为单精度浮点数(`float`)数组,你可以按照以下步骤操作:
1. 确定 `cv::Mat` 的维度和大小。例如,如果是一个二维矩阵(图像),可以获取列数(列)和行数(rows)。
```cpp
cv::Size size = mat.size();
int cols = mat.cols;
```
2. 分配一个新的 float 数组,其大小等于矩阵的元素总数。
```cpp
float* floatArray = new float[size.area()];
```
3. 使用 `cv::Mat` 的 `.data` 属性,这个属性返回指向内部数据的指针。然后遍历矩阵,将每个元素转换为 `float` 并复制到新数组中。
```cpp
for (int i = 0; i < rows * cols; ++i) {
floatArray[i] = static_cast<float>(mat.ptr<float>(0)[i]);
}
```
4. 别忘了处理内存管理,在不再需要 float 数组时释放它。
```cpp
delete[] floatArray;
```
相关问题
读取 cv::mat 到float 数组中
在OpenCV(C++接口)中,`cv::Mat`是一个用于表示图像数据的数据结构,通常包含像素值。如果你想将`cv::Mat`的内容转换成浮点数数组(通常是单通道的),你可以按照以下步骤操作:
1. 首先,确保`cv::Mat`是连续的(即存储在同一块内存中),这对于高效地访问像素至关重要。可以使用`isContinuous()`函数检查这一点。
```cpp
if (img.isContinuous()) {
```
2. 获取`cv::Mat`的宽度、高度和通道数,以及它所占用的元素类型(例如,`CV_32F`代表32位单精度浮点数)。
```cpp
int width = img.cols;
int height = img.rows;
int channels = img.channels();
cv::DataType dtype = img.type();
```
3. 创建一个大小匹配的浮点数数组,通常是`std::vector<float>`或者直接是动态分配的数组。
```cpp
std::vector<float> floatArray(width * height * channels);
```
4. 使用`ptr`成员函数获取到`cv::Mat`的像素指针,然后复制像素值到新数组中。由于每个像素可能有多个通道(如RGB或BGR),你需要遍历它们并逐个复制。
```cpp
for (int i = 0; i < height; ++i) {
for (int j = 0; j < width; ++j) {
const uchar* pixelPtr = img.ptr<uchar>(i)[j];
for (int c = 0; c < channels; ++c) {
floatArray[(i * width + j) * channels + c] = static_cast<float>(pixelPtr[c]);
}
}
}
```
cv::Mat 转QVector<float>
`cv::Mat` 是 OpenCV(开源计算机视觉库)中用于表示图像数据的数据结构,它是一个多维数组。而 `QVector<float>` 是 Qt 库中的动态数组,专门用于存储单一类型的浮点数。将 `cv::Mat` 转换为 `QVector<float>` 的步骤通常需要两步:
1. 首先,你需要将 `cv::Mat` 中的像素值读取出来。如果你的 `cv::Mat` 是单通道的灰度图,你可以通过 `.data` 或者 `.ptr<uchar>(0)` 来获取像素数据的一维指针。如果它是彩色图,每个通道可能需要独立处理。
```cpp
cv::Mat imgMat;
// ...加载或创建图像
cv::Vec3b* imageData = static_cast<cv::Vec3b*>(imgMat.data);
int numPixels = imgMat.total() * imgMat.elemSize();
```
2. 然后,将这些像素值复制到 `QVector<float>` 中。由于 OpenCV 和 Qt 的数据类型映射可能不一致,你可能需要逐个转换像素值,例如 BGR 到 RGB 或者直接转换为灰度后再存储。
```cpp
QVector<float> qVector(numPixels);
for (int i = 0; i < numPixels; ++i) {
if (imgMat.channels() == 1) { // 灰度图
qVector[i] = static_cast<float>(*imageData++);
} else {
qVector[i * 3 + 0] = static_cast<float>(imageData[2]);
qVector[i * 3 + 1] = static_cast<float>(imageData[1]);
qVector[i * 3 + 2] = static_cast<float>(imageData[0]);
imageData += 3;
}
}
```
阅读全文