(float **)malloc(sizeof(float *)*m->row)
时间: 2023-11-22 19:06:12 浏览: 35
这段代码是在动态分配一个二维浮点型数组,其中m->row是二维数组的行数。具体来说,这段代码首先使用了sizeof运算符计算出一个float指针的大小,然后将其乘以m->row,得到了一个二维数组的行指针数组的大小。接着,使用malloc函数分配了这么大的内存空间,并将其转换为一个float类型的指针数组。最终,这个指针数组中的每个元素都指向了一个长度为m->row的float类型数组,从而构成了一个二维数组。
需要注意的是,这段代码只分配了行指针数组的内存空间,并没有为每一行分配内存空间。如果需要使用这个二维数组,还需要在每一行上再次调用malloc函数分配内存空间。同时,在使用完这个二维数组后,还需要调用free函数释放内存空间,避免内存泄漏。
相关问题
c语言float** 赋值
在C语言中,`float**`是一个指向指针的指针,用于存储浮点数的地址。当你需要动态地分配和管理二维数组的内存时,`float**`会非常有用。下面是如何给这样的指针赋值和操作的基本步骤:
1. 声明和初始化 `float**` 变量:
```c
float** matrix; // 声明一个指向float指针的指针
```
2. 分配内存(如果需要):
```c
matrix = (float**)malloc(rows * sizeof(float*)); // rows 是行数
for (int i = 0; i < rows; i++) {
matrix[i] = (float*)malloc(columns * sizeof(float)); // columns 是列数
}
```
3. 赋值元素:
```c
matrix[row][column] = value; // 其中 row 和 column 是数组索引,value 是要存储的浮点数
```
4. 使用完毕后,记得释放内存:
```c
for (int i = 0; i < rows; i++) {
free(matrix[i]);
}
free(matrix);
```
float* get_hog_feature(cv::Mat img) { cv::HOGDescriptor hog = cv::HOGDescriptor(cvSize(20, 20), cvSize(10, 10), cvSize(5, 5), cvSize(5, 5), 9); cv::resize(img, img, cv::Size(30, 30), (0, 0), (0, 0), cv::INTER_LINEAR); std::vector<float> descriptors; // float *descriptors; hog.compute(img, descriptors, cv::Size(20, 20), cv::Size(0, 0)); float *feature_float = (float*)malloc(descriptors.size() * sizeof(float)); assert(feature_float); for (int i = 0; i < 128; i++) { feature_float[i] = descriptors[i * 2]; } return feature_float; } bool getRectsHogFeature(const cv::Mat& img) { std::vector<cv::Mat> mats; int feature_dim = 128; for (DETECTION_ROW& dbox : d) { cv::Rect rc = cv::Rect(int(dbox.tlwh(0)), int(dbox.tlwh(1)), int(dbox.tlwh(2)), int(dbox.tlwh(3))); rc.x = (rc.x >= 0 ? rc.x : 0); rc.y = (rc.y >= 0 ? rc.y : 0); rc.width = (rc.x + rc.width <= img.cols ? rc.width : (img.cols - rc.x)); rc.height = (rc.y + rc.height <= img.rows ? rc.height : (img.rows - rc.y)); cv::Mat mattmp = img(rc).clone(); //cv::resize(mattmp, mattmp, cv::Size(64, 128)); float *feature_float = get_hog_feature(mattmp); for (int i=0;i<feature_dim;i++) { dbox.feature[i] = feature_float[i]; } } return true; } 请解析这段代码
这段代码主要是关于计算图像的HOG特征。下面是对代码的解析:
1. `get_hog_feature` 函数是用来计算输入图像的HOG特征的。它接受一个 `cv::Mat` 类型的图像作为输入参数,返回一个 `float*` 类型的特征数组。
2. 在函数内部,首先创建了一个 `cv::HOGDescriptor` 对象 `hog`,并指定了它的参数,包括窗口大小、块大小、块步长和直方图的箱数。
3. 然后,将输入图像调整为指定的大小(30x30)。
4. 接下来,创建一个空的 `std::vector<float>` 类型的 `descriptors`,用于存储计算得到的特征。
5. 使用 `hog.compute` 函数计算图像的HOG特征,并将结果存储在 `descriptors` 中。
6. 为了方便后续操作,动态分配了一个 `float*` 类型的特征数组 `feature_float`,并将 `descriptors` 中的部分数据复制到该数组中。
7. 最后,返回特征数组 `feature_float`。
另外,还有一个函数 `getRectsHogFeature` 用于将计算得到的HOG特征存储到一个名为 `dbox.feature` 的数组中。该函数接受一个 `cv::Mat` 类型的图像作为输入参数,并遍历一个名为 `d` 的容器,其中存储了一些矩形框的信息。
在每次迭代中,首先根据矩形框的位置和图像的大小,截取对应位置的图像区域。然后,调用 `get_hog_feature` 函数计算该区域的HOG特征,并将特征数据复制到 `dbox.feature` 数组中。
总的来说,这段代码实现了计算图像的HOG特征,并将特征存储到相应的数据结构中,以供后续使用。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)