使用OpenCV提取HoG特性

我正在尝试使用OpenCV的HoG API提取function,但是我似乎无法find允许我这样做的API。

我想要做的是从我的所有数据集(一组正面和负面的图像)使用HoG提取function,然后训练我自己的SVM。

我在OpenCV下偷看到HoG.cpp,并没有帮助。 所有的代码都被埋在复杂性之中,并且需要满足不同的硬件(例如英特尔的IPP)

我的问题是:

  1. 是否有任何OpenCV API可用于提取所有要提交给SVM的特征/描述符? 如果有什么可以用它来训练我自己的SVM?
  2. 如果没有,那里有没有现成的图书馆可以完成同样的事情?

到目前为止,我实际上是从Processing(Java)向C ++移植一个现有的库(http://hogprocessing.altervista.org/),但是它仍然非常慢,检测至less需要16秒

有没有其他人成功提取HoGfunction,你是如何绕过它? 你有没有可以使用的开源代码?

提前致谢

你可以在opencv中使用hog类,如下所示

HOGDescriptor hog; vector<float> ders; vector<Point>locs; 

//这个函数为你计算猪的function

 hog.compute(grayImg,ders,Size(32,32),Size(0,0),locs); 

//为grayImg计算的HOG特征被存储在ders向量中,使其成为可用于训练的matrix,稍后使用以下for循环

 Hogfeat.create(ders.size(),1,CV_32FC1); for(int i=0;i<ders.size();i++) { Hogfeat.at<float>(i,0)=ders.at(i); } 

//现在你的HOG特征被存储在Hogfeatmatrix中

您还可以使用对象macros设置窗口大小,单元格大小和块大小,如下所示:

 hog.blockSize=16; hog.cellSize=4; hog.blockStride=8; //This is for comparing the HOG features of two images without using any SVM //(It is not an efficient way but useful when you want to compare only few or two images) //Simple distance //Consider you have two hog feature vectors for two images Hogfeat1 and Hogfeat2 and those are same size. double distance=0; for(int i=0;i<Hogfeat.rows;i++) { distance+ = abs(Hogfeat.at<float>(i,0) - Hogfeat.at<float>(i,0)); } if(distance < Threshold) cout<<"Two images are of same class"<<endl; else cout<<"Two images are of different class"<<endl; 

希望它是有用的:)

在上面的文章的帮助下,我也写了2猪的function。 我应用这种方法来检查ROI区域的变化与否。 请参阅这里的页面。 源代码和简单的介绍

这里也是GPU版本。

 cv::Mat temp; gpu::GpuMat gpu_img, descriptors; cv::gpu::HOGDescriptor gpu_hog(win_size, Size(16, 16), Size(8, 8), Size(8, 8), 9, cv::gpu::HOGDescriptor::DEFAULT_WIN_SIGMA, 0.2, gamma_corr, cv::gpu::HOGDescriptor::DEFAULT_NLEVELS); gpu_img.upload(img); gpu_hog.getDescriptors(gpu_img, win_stride, descriptors, cv::gpu::HOGDescriptor::DESCR_FORMAT_ROW_BY_ROW); descriptors.download(temp); 

OpenCV 3对用户可以使用GPUalgorithm(即CUDA)的方式进行了一些更改,请参见“ 转换指南 – CUDA” 。

要更新从user3398689到OpenCV 3的答案,请看下面的代码:

 #include <opencv2/core/cuda.hpp> #include <opencv2/cudaimgproc.hpp> [...] /* Suppose you load an image in a cv::Mat variable called 'src' */ int img_width = 320; int img_height = 240; int block_size = 16; int bin_number = 9; cv::Ptr<cv::cuda::HOG> cuda_hog = cuda::HOG::create(Size(img_width, img_height), Size(block_size, block_size), Size(block_size/2, block_size/2), Size(block_size/2, block_size/2), bin_number); /* The following commands are optional: default values applies */ cuda_hog->setDescriptorFormat(cuda::HOG::DESCR_FORMAT_COL_BY_COL); cuda_hog->setGammaCorrection(true); cuda_hog->setWinStride(Size(img_width_, img_height_)); cv::cuda::GpuMat image; cv::cuda::GpuMat descriptor; image.upload(src); /* May not apply to you */ /* CUDA HOG works with intensity (1 channel) or BGRA (4 channels) images */ /* The next function call convert a standard BGR image to BGRA using the GPU */ cv::cuda::GpuMat image_alpha; cuda::cvtColor(image, image_alpha, COLOR_BGR2BGRA, 4); cuda_hog->compute(image_alpha, descriptor); cv::Mat dst; image_alpha.download(dst); 

然后,您可以按照您的意愿,在“dst”variables中使用描述符,例如,如G453所示。

Interesting Posts