HOGDescriptor hog
时间: 2024-02-11 22:26:51 浏览: 37
HOGDescriptor是OpenCV中的一个类,用于计算图像中的方向梯度直方图(Histogram of Oriented Gradients,HOG)特征。这些特征可以用于目标检测和识别任务,例如行人检测和人脸识别。HOGDescriptor类提供了许多参数和方法,可以根据具体应用场景进行设置和调整。
相关问题
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特征,并将特征存储到相应的数据结构中,以供后续使用。
void detect_thread() { Mat frame; HOGDescriptor hog; // 初始化方向梯度直方图描述子 hog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector()); // 采用已经训练好的行人检测分类器 vector<Rect> regions; Track_Msg track; while(1){ mtx_orig.lock(); if (orig.empty()){ mtx_orig.unlock(); continue; } else { resize(orig, frame, cv::Size(400, 300));//缩放图像 mtx_orig.unlock(); } hog.detectMultiScale(frame, regions, 0, Size(4, 4), Size(8, 8), 1.05, 1); // 扫描图像 Pic_Track(frame, regions, track); if(track.direct != "None"){ cout << track.M[0] << ' ' << track.M[1] << ' ' << track.direct << endl; data_share(track); } putText(frame,"w/2:"+to_string(int(track.w/2))+" h/2:"+to_string(int(track.h/2)),{0, 30},FONT_HERSHEY_TRIPLEX,1,(0, 0, 0),1); for (size_t i = 0; i < regions.size(); i++) rectangle(frame, regions[i], cv::Scalar(0, 0, 255), 2); putText(frame,"dx:"+to_string(track.dx)+" dy:"+to_string(track.dy)+" "+track.direct,{0, track.height-10},FONT_HERSHEY_TRIPLEX,1,(255, 0, 0),1); imshow("frame", frame); waitKey(30); } }
这是一个使用 OpenCV 库和 HOG 特征描述子实现行人检测的代码。具体实现步骤如下:
1. 初始化 HOG 特征描述子,并设置行人检测分类器。
2. 使用多尺度滑动窗口扫描图像,检测出可能包含行人的区域。
3. 对检测出的区域进行跟踪,并计算出行人在图像中的位置和运动方向。
4. 将检测结果进行可视化,包括在图像上绘制矩形框和文本信息。
5. 显示检测结果并等待用户按下键盘。
这段代码可以作为线程运行,不断读取视频流或者摄像头输入,实时进行行人检测。需要注意的是,该代码只能检测行人,如果需要检测其他目标,需要重新训练 HOG 分类器。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.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)